Passed
Pull Request — master (#61)
by Jason
02:34
created

PurchasableTest::testValidate()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 16
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 12
nc 1
nop 0
dl 0
loc 16
rs 9.8666
c 0
b 0
f 0
1
<?php
2
3
namespace Dynamic\Foxy\Test\Extension;
4
5
use Dynamic\Foxy\Extension\Purchasable;
6
use Dynamic\Foxy\Model\FoxyCategory;
7
use Dynamic\Foxy\Model\OptionType;
8
use Dynamic\Foxy\Model\ProductOption;
9
use Dynamic\Foxy\Model\Setting;
10
use Dynamic\Foxy\Test\TestOnly\TestProduct;
11
use SilverStripe\Core\Config\Config;
12
use SilverStripe\Core\Injector\Injector;
13
use SilverStripe\Dev\Debug;
14
use SilverStripe\Dev\SapphireTest;
15
use SilverStripe\Forms\FieldList;
16
use SilverStripe\i18n\i18n;
17
use SilverStripe\ORM\ValidationException;
18
use SilverStripe\Security\Member;
19
20
class PurchasableTest extends SapphireTest
21
{
22
    /**
23
     * @var string
24
     */
25
    protected static $fixture_file = '../fixtures.yml';
26
27
    /**
28
     * @var array
29
     */
30
    protected static $extra_dataobjects = [
31
        TestProduct::class,
32
    ];
33
34
    /**
35
     *
36
     */
37
    public function setUp()
38
    {
39
        Config::modify()->set(OptionType::class, 'has_one', ['TestProduct' => TestProduct::class]);
40
41
        return parent::setUp();
42
    }
43
44
    /**
45
     *
46
     */
47
    public function testUpdateCMSFields()
48
    {
49
        $object = Injector::inst()->create(TestProduct::class);
50
        $fields = $object->getCMSFields();
51
        $this->assertInstanceOf(FieldList::class, $fields);
52
53
        $object->Price = 10.00;
54
        $object->Code = 000123;
55
        $object->FoxyCategoryID = $this->objFromFixture(FoxyCategory::class, 'one')->ID;
56
57
        $object->write();
58
        $fields = $object->getCMSFields();
59
        $this->assertInstanceOf(FieldList::class, $fields);
60
    }
61
62
    /**
63
     *
64
     */
65
    /*
66
    public function testValidate()
67
    {
68
        $object = Injector::inst()->create(TestProduct::class);
69
        $object->Price = '';
70
        $this->setExpectedException(ValidationException::class);
71
        $object->write();
72
73
        $object->Price = '10.00';
74
        $object->Code = '';
75
        $this->setExpectedException(ValidationException::class);
76
        $object->write();
77
78
        $object->Code = '123';
79
        $object->FoxyCategoryID = '';
80
        $this->setExpectedException(ValidationException::class);
81
        $object->write();
82
    }
83
    */
84
85
    /**
86
     *
87
     */
88
    public function testIsAvailable()
89
    {
90
        $object = Injector::inst()->create(TestProduct::class);
91
        $this->assertTrue($object->isAvailable());
92
93
        $object->Available = 0;
94
        $this->assertFalse($object->isAvailable());
95
96
        $object->Available = 1;
97
        $type = Injector::inst()->create(TestProduct::class);
98
        $type->Title = 'Product One';
99
        $type->Options()->add($this->objFromFixture(ProductOption::class, 'small'));
100
        $type->Options()->add($this->objFromFixture(ProductOption::class, 'large'));
101
        $this->assertTrue($object->isAvailable());
102
    }
103
104
    /**
105
     *
106
     */
107
    public function testIsProduct()
108
    {
109
        $object = Injector::inst()->create(TestProduct::class);
110
        $this->assertTrue($object->isProduct());
111
    }
112
113
    /**
114
     *
115
     */
116
    public function testProvidePermissions()
117
    {
118
        /** @var TestProduct $object */
119
        $object = singleton(Purchasable::class);
120
121
        i18n::set_locale('en');
122
        $expected = [
123
            'MANAGE_FOXY_PRODUCTS' => [
124
                'name' => 'Manage products',
125
                'category' => 'Foxy',
126
                'help' => 'Manage products and related settings',
127
                'sort' => 400
128
            ]
129
        ];
130
        $this->assertEquals($expected, $object->providePermissions());
131
    }
132
133
    /**
134
     *
135
     */
136
    public function testCanCreate()
137
    {
138
        /** @var TestProduct $object */
139
        $object = singleton(TestProduct::class);
140
        /** @var \SilverStripe\Security\Member $admin */
141
        $admin = $this->objFromFixture(Member::class, 'admin');
142
        /** @var \SilverStripe\Security\Member $siteOwner */
143
        $siteOwner = $this->objFromFixture(Member::class, 'site-owner');
144
        /** @var \SilverStripe\Security\Member $default */
145
        $default = $this->objFromFixture(Member::class, 'default');
146
147
        $this->assertFalse($object->canCreate($default));
148
        $this->assertTrue($object->canCreate($admin));
149
        $this->assertTrue($object->canCreate($siteOwner));
150
    }
151
152
    /**
153
     *
154
     */
155
    public function testCanEdit()
156
    {
157
        /** @var TestProduct $object */
158
        $object = singleton(TestProduct::class);
159
        /** @var \SilverStripe\Security\Member $admin */
160
        $admin = $this->objFromFixture(Member::class, 'admin');
161
        /** @var \SilverStripe\Security\Member $siteOwner */
162
        $siteOwner = $this->objFromFixture(Member::class, 'site-owner');
163
        /** @var \SilverStripe\Security\Member $default */
164
        $default = $this->objFromFixture(Member::class, 'default');
165
166
        $this->assertFalse($object->canEdit($default));
167
        $this->assertTrue($object->canEdit($admin));
168
        $this->assertTrue($object->canEdit($siteOwner));
169
    }
170
171
    /**
172
     *
173
     */
174
    public function testCanDelete()
175
    {
176
        /** @var TestProduct $object */
177
        $object = singleton(TestProduct::class);
178
        /** @var \SilverStripe\Security\Member $admin */
179
        $admin = $this->objFromFixture(Member::class, 'admin');
180
        /** @var \SilverStripe\Security\Member $siteOwner */
181
        $siteOwner = $this->objFromFixture(Member::class, 'site-owner');
182
        /** @var \SilverStripe\Security\Member $default */
183
        $default = $this->objFromFixture(Member::class, 'default');
184
185
        $this->assertFalse($object->canDelete($default));
186
        $this->assertTrue($object->canDelete($admin));
187
        $this->assertTrue($object->canDelete($siteOwner));
188
    }
189
190
    /**
191
     *
192
     */
193
    public function testCanUnpublish()
194
    {
195
        /** @var TestProduct $object */
196
        $object = singleton(TestProduct::class);
197
        /** @var \SilverStripe\Security\Member $admin */
198
        $admin = $this->objFromFixture(Member::class, 'admin');
199
        /** @var \SilverStripe\Security\Member $siteOwner */
200
        $siteOwner = $this->objFromFixture(Member::class, 'site-owner');
201
        /** @var \SilverStripe\Security\Member $default */
202
        $default = $this->objFromFixture(Member::class, 'default');
203
204
        $this->assertFalse($object->canUnpublish($default));
0 ignored issues
show
Bug introduced by
The method canUnpublish() does not exist on Dynamic\Foxy\Test\TestOnly\TestProduct. Since you implemented __call, consider adding a @method annotation. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

204
        $this->assertFalse($object->/** @scrutinizer ignore-call */ canUnpublish($default));
Loading history...
205
        $this->assertTrue($object->canUnpublish($admin));
206
        $this->assertTrue($object->canUnpublish($siteOwner));
207
    }
208
209
    /**
210
     *
211
     */
212
    public function testCanArchive()
213
    {
214
        /** @var TestProduct $object */
215
        $object = singleton(TestProduct::class);
216
        /** @var \SilverStripe\Security\Member $admin */
217
        $admin = $this->objFromFixture(Member::class, 'admin');
218
        /** @var \SilverStripe\Security\Member $siteOwner */
219
        $siteOwner = $this->objFromFixture(Member::class, 'site-owner');
220
        /** @var \SilverStripe\Security\Member $default */
221
        $default = $this->objFromFixture(Member::class, 'default');
222
223
        $this->assertFalse($object->canArchive($default));
0 ignored issues
show
Bug introduced by
The method canArchive() does not exist on Dynamic\Foxy\Test\TestOnly\TestProduct. Since you implemented __call, consider adding a @method annotation. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

223
        $this->assertFalse($object->/** @scrutinizer ignore-call */ canArchive($default));
Loading history...
224
        $this->assertTrue($object->canArchive($admin));
225
        $this->assertTrue($object->canArchive($siteOwner));
226
    }
227
}
228