ProductPageTest   A
last analyzed

Complexity

Total Complexity 14

Size/Duplication

Total Lines 243
Duplicated Lines 0 %

Importance

Changes 3
Bugs 0 Features 0
Metric Value
wmc 14
eloc 120
c 3
b 0
f 0
dl 0
loc 243
rs 10

12 Methods

Rating   Name   Duplication   Size   Complexity  
A testProductTitleTrailingWhiteSpace() 0 12 1
A testOptionGroupCreation() 0 8 1
A testOptionItemDeletion() 0 21 1
A testOptionItemCreation() 0 15 1
A testOptionGroupDeletion() 0 16 1
A testProductDraftOptionDeletion() 0 42 1
A setUp() 0 7 1
A testProductCategoryCreation() 0 9 1
A testProductTitleLeadingWhiteSpace() 0 12 1
A testProductCreation() 0 9 1
A testProductCategoryDeletion() 0 26 1
A testProductDeletion() 0 27 3
1
<?php
2
3
namespace Dynamic\FoxyStripe\Test;
4
5
use Dynamic\FoxyStripe\Model\OptionGroup;
6
use Dynamic\FoxyStripe\Model\OptionItem;
7
use Dynamic\FoxyStripe\Model\ProductCategory;
8
use Dynamic\FoxyStripe\Page\ProductHolder;
9
use Dynamic\FoxyStripe\Page\ProductPage;
10
use SilverStripe\ORM\DB;
11
12
class ProductPageTest extends FS_Test
13
{
14
    protected static $use_draft_site = true;
15
16
    /**
17
     * @throws \SilverStripe\ORM\ValidationException
18
     */
19
    public function setUp()
20
    {
21
        parent::setUp();
22
23
        $groupForItem = OptionGroup::create();
24
        $groupForItem->Title = 'Sample-Group';
25
        $groupForItem->write();
26
27
        /*$productHolder = ProductHolder::create();
28
        $productHolder->Title = 'Product Holder';
29
        $productHolder->write();*/
30
    }
31
32
    public function testProductCreation()
33
    {
34
        $this->logInWithPermission('Product_CANCRUD');
35
        $default = $this->objFromFixture(ProductCategory::class, 'default');
0 ignored issues
show
Unused Code introduced by
The assignment to $default is dead and can be removed.
Loading history...
36
        $holder = $this->objFromFixture(ProductHolder::class, 'default');
0 ignored issues
show
Unused Code introduced by
The assignment to $holder is dead and can be removed.
Loading history...
37
        $product1 = $this->objFromFixture(ProductPage::class, 'product1');
38
39
        $product1->doPublish();
40
        $this->assertTrue($product1->isPublished());
41
    }
42
43
    public function testProductDeletion()
44
    {
45
        $this->logInWithPermission('Product_CANCRUD');
46
        $holder = $this->objFromFixture(ProductHolder::class, 'default');
47
        $holder->write();
48
        $product2 = $this->objFromFixture(ProductPage::class, 'product2');
49
        $productID = $product2->ID;
50
51
        $product2->write();
52
        $this->assertTrue($product2->exists());
53
54
        $versions = DB::query('Select * FROM "ProductPage_Versions" WHERE "RecordID" = '.$productID);
55
        $versionsPostPublish = array();
56
        foreach ($versions as $versionRow) {
57
            $versionsPostPublish[] = $versionRow;
58
        }
59
60
        $product2->delete();
61
        $this->assertTrue(!$product2->exists());
62
63
        $versions = DB::query('Select * FROM "ProductPage_Versions" WHERE "RecordID" = '.$productID);
64
        $versionsPostDelete = array();
65
        foreach ($versions as $versionRow) {
66
            $versionsPostDelete[] = $versionRow;
67
        }
68
69
        $this->assertTrue($versionsPostPublish == $versionsPostDelete);
70
    }
71
72
    /**
73
     * @throws \SilverStripe\ORM\ValidationException
74
     */
75
    public function testProductTitleLeadingWhiteSpace()
76
    {
77
        $this->logInWithPermission('ADMIN');
78
79
        $holder = $this->objFromFixture(ProductHolder::class, 'default');
80
        $holder->write();
81
82
        $product = $this->objFromFixture(ProductPage::class, 'product1');
83
        $product->Title = ' Test with leading space';
84
        $product->write();
85
86
        $this->assertTrue($product->Title == 'Test with leading space');
87
    }
88
89
    /**
90
     * @throws \SilverStripe\ORM\ValidationException
91
     */
92
    public function testProductTitleTrailingWhiteSpace()
93
    {
94
        $this->logInWithPermission('ADMIN');
95
96
        $holder = $this->objFromFixture(ProductHolder::class, 'default');
97
        $holder->write();
98
99
        $product = $this->objFromFixture(ProductPage::class, 'product1');
100
        $product->Title = 'Test with trailing space ';
101
        $product->write();
102
103
        $this->assertTrue($product->Title == 'Test with trailing space');
104
    }
105
106
    public function testProductCategoryCreation()
107
    {
108
        $this->logInWithPermission('Product_CANCRUD');
109
        $category = $this->objFromFixture(ProductCategory::class, 'apparel');
110
        $categoryID = $category->ID;
111
112
        $productCategory = ProductCategory::get()->filter(array('Code' => 'APPAREL'))->first();
113
114
        $this->assertTrue($categoryID == $productCategory->ID);
115
    }
116
117
    public function testProductCategoryDeletion()
118
    {
119
        $this->logInWithPermission('Product_CANCRUD');
120
121
        $category = $this->objFromFixture(ProductCategory::class, 'default');
122
123
        $this->assertFalse($category->canDelete());
124
125
        $category2 = $this->objFromFixture(ProductCategory::class, 'apparel');
126
        $category2ID = $category2->ID;
127
128
        $this->assertTrue($category2->canDelete());
129
130
        $this->logOut();
131
132
        $this->logInWithPermission('ADMIN');
133
134
        $this->assertFalse($category->canDelete());
135
        $this->assertTrue($category2->canDelete());
136
137
        $this->logOut();
138
        $this->logInWithPermission('Product_CANCRUD');
139
140
        $category2->delete();
141
142
        $this->assertFalse(in_array($category2ID, ProductCategory::get()->column('ID')));
143
    }
144
145
    public function testOptionGroupCreation()
146
    {
147
        $this->logInWithPermission('Product_CANCRUD');
148
149
        $group = $this->objFromFixture(OptionGroup::class, 'size');
150
        $group->write();
151
152
        $this->assertNotNull(OptionGroup::get()->first());
153
    }
154
155
    public function testOptionGroupDeletion()
156
    {
157
        $this->logInWithPermission('ADMIN');
158
        $group = $this->objFromFixture(OptionGroup::class, 'color');
159
        $group->write();
160
        $groupID = $group->ID;
161
162
        $this->assertTrue($group->canDelete());
163
164
        $this->logOut();
165
        $this->logInWithPermission('Product_CANCRUD');
166
167
        $this->assertTrue($group->canDelete());
168
        $group->delete();
169
170
        $this->assertFalse(in_array($groupID, OptionGroup::get()->column('ID')));
171
    }
172
173
    public function testOptionItemCreation()
174
    {
175
        $this->logInWithPermission('Product_CANCRUD');
176
177
        $optionGroup = OptionGroup::get()->filter(array('Title' => 'Sample-Group'))->first();
178
179
        $option = $this->objFromFixture(OptionItem::class, 'large');
180
        $option->ProductOptionGroupID = $optionGroup->ID;
181
        $option->write();
182
183
        $optionID = $option->ID;
184
185
        $optionItem = OptionItem::get()->filter(array('ProductOptionGroupID' => $optionGroup->ID))->first();
186
187
        $this->assertEquals($optionID, $optionItem->ID);
188
    }
189
190
    public function testOptionItemDeletion()
191
    {
192
        $this->logInWithPermission('ADMIN');
193
194
        $optionGroup = $this->objFromFixture(OptionGroup::class, 'size');
195
        $optionGroup->write();
196
197
        $option = $this->objFromFixture(OptionItem::class, 'small');
198
        $option->write();
199
200
        $optionID = $option->ID;
201
202
        $this->assertTrue($option->canDelete());
203
204
        $this->logOut();
205
        $this->logInWithPermission('Product_CANCRUD');
206
207
        $this->assertTrue($option->canDelete());
208
        $option->delete();
209
210
        $this->assertFalse(in_array($optionID, OptionItem::get()->column('ID')));
211
    }
212
213
    public function testProductDraftOptionDeletion()
214
    {
215
        self::$use_draft_site = false;//make sure we can publish
216
217
        $this->logInWithPermission('ADMIN');
218
219
        $holder = $this->objFromFixture(ProductHolder::class, 'default');
220
        //build holder page, ProductPage can't be on root level
221
        $holder->doPublish();
222
223
        $product = $this->objFromFixture(ProductPage::class, 'product1');//build product page
224
        $product->doPublish();
225
226
        $productID = $product->ID;
227
228
        $optionGroup = $this->objFromFixture(OptionGroup::class, 'size');
229
        //build the group for the options
230
        $optionGroup->write();
231
        $option = $this->objFromFixture(OptionItem::class, 'small');//build first option
232
        $option->write();
233
        $option2 = $this->objFromFixture(OptionItem::class, 'large');//build second option
234
        $option2->write();
235
236
        $this->assertTrue($product->isPublished());//check that product is published
237
238
        $product->deleteFromStage('Stage');//remove product from draft site
239
240
        $this->assertTrue($product->isPublished());//check product is still published
241
242
        $testOption = $this->objFromFixture(OptionItem::class, 'large');
243
244
        $this->assertThat($testOption->ID, $this->logicalNot($this->equalTo(0)));
245
        //make sure the first option still exists
246
247
        $product->doRestoreToStage();//restore page to draft site
248
        $product->doUnpublish();//unpublish page
249
        $product->deleteFromStage('Stage');//remove product from draft site
250
251
        $checkDeleted = OptionItem::get()->filter(array('Title' => 'Large', 'ProductID' => $productID))->first();
252
        //query same option as above
253
254
        $this->assertEquals($checkDeleted->ID, 0);//check that the ID is 0 (empty object/non-existent)
255
    }
256
}
257