Passed
Pull Request — master (#309)
by Jason
13:47
created

ProductPageTest::testProductDeletion()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 23
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 23
rs 9.0856
c 0
b 0
f 0
cc 3
eloc 16
nc 4
nop 0
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 Dynamic\FoxyStripe\Test\FS_Test;
11
use SilverStripe\ORM\DB;
12
13
class ProductPageTest extends FS_Test
14
{
15
16
	protected static $use_draft_site = true;
17
18
    /**
19
     * @throws \SilverStripe\ORM\ValidationException
20
     */
21
	function setUp(){
22
		parent::setUp();
23
24
		$groupForItem = OptionGroup::create();
25
		$groupForItem->Title = 'Sample-Group';
26
		$groupForItem->write();
27
28
		/*$productHolder = ProductHolder::create();
0 ignored issues
show
Unused Code Comprehensibility introduced by
54% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
29
		$productHolder->Title = 'Product Holder';
30
		$productHolder->write();*/
31
	}
32
33
	function testProductCreation(){
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
34
35
		$this->logInWithPermission('Product_CANCRUD');
36
		$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...
37
		$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...
38
		$product1 = $this->objFromFixture(ProductPage::class, 'product1');
39
40
		$product1->doPublish();
41
		$this->assertTrue($product1->isPublished());
42
43
	}
44
45
	function testProductDeletion(){
46
47
		$this->logInWithPermission('Product_CANCRUD');
48
		$holder = $this->objFromFixture(ProductHolder::class, 'default');
49
		$holder->write();
50
		$product2 = $this->objFromFixture(ProductPage::class, 'product2');
51
		$productID = $product2->ID;
52
53
		$product2->write();
54
		$this->assertTrue($product2->exists());
55
56
		$versions = DB::query('Select * FROM "FS_ProductPage_versions" WHERE "RecordID" = '. $productID);
57
		$versionsPostPublish = array();
58
		foreach($versions as $versionRow) $versionsPostPublish[] = $versionRow;
59
60
		$product2->delete();
61
		$this->assertTrue(!$product2->exists());
62
63
		$versions = DB::query('Select * FROM "FS_ProductPage_versions" WHERE "RecordID" = '. $productID);
64
		$versionsPostDelete = array();
65
		foreach($versions as $versionRow) $versionsPostDelete[] = $versionRow;
66
67
		$this->assertTrue($versionsPostPublish == $versionsPostDelete);
68
69
	}
70
71
    /**
72
     * @throws \SilverStripe\ORM\ValidationException
73
     */
74
	function testProductTitleLeadingWhiteSpace(){
75
76
		$this->logInWithPermission('ADMIN');
77
78
		$holder = $this->objFromFixture(ProductHolder::class, 'default');
79
		$holder->write();
80
81
		$product = $this->objFromFixture(ProductPage::class, 'product1');
82
		$product->Title = " Test with leading space";
83
		$product->write();
84
85
		$this->assertTrue($product->Title == 'Test with leading space');
86
87
	}
88
89
    /**
90
     * @throws \SilverStripe\ORM\ValidationException
91
     */
92
	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
107
	function testProductCategoryCreation(){
108
109
		$this->logInWithPermission('Product_CANCRUD');
110
		$category = $this->objFromFixture(ProductCategory::class, 'apparel');
111
		$category->write();
112
		$categoryID = $category->ID;
113
114
		$productCategory = ProductCategory::get()->filter(array('Code'=>'APPAREL'))->first();
115
116
		$this->assertTrue($categoryID == $productCategory->ID);
117
118
	}
119
120
	function testProductCategoryDeletion(){
121
122
		$this->logInWithPermission('Product_CANCRUD');
123
124
		$category = $this->objFromFixture(ProductCategory::class, 'default');
125
		$category->write();
126
127
		$this->assertFalse($category->canDelete());
128
129
		$category2 = $this->objFromFixture(ProductCategory::class, 'apparel');
130
		$category2->write();
131
		$category2ID = $category2->ID;
132
133
		$this->assertTrue($category2->canDelete());
134
135
		$this->logOut();
136
137
		$this->logInWithPermission('ADMIN');
138
139
		$this->assertFalse($category->canDelete());
140
		$this->assertTrue($category2->canDelete());
141
142
		$this->logOut();
143
		$this->logInWithPermission('Product_CANCRUD');
144
145
		$category2->delete();
146
147
		$this->assertFalse(in_array($category2ID,ProductCategory::get()->column('ID')));
148
149
	}
150
151
	function testOptionGroupCreation(){
152
153
		$this->logInWithPermission('Product_CANCRUD');
154
155
		$group = $this->objFromFixture(OptionGroup::class, 'size');
156
		$group->write();
157
158
		$this->assertNotNull(OptionGroup::get()->first());
159
160
	}
161
162
	function testOptionGroupDeletion(){
163
164
		$this->logInWithPermission('ADMIN');
165
		$group = $this->objFromFixture(OptionGroup::class, 'color');
166
		$group->write();
167
		$groupID = $group->ID;
168
169
		$this->assertTrue($group->canDelete());
170
171
		$this->logOut();
172
		$this->logInWithPermission('Product_CANCRUD');
173
174
		$this->assertTrue($group->canDelete());
175
		$group->delete();
176
177
		$this->assertFalse(in_array($groupID, OptionGroup::get()->column('ID')));
178
179
	}
180
181
	function testOptionItemCreation(){
182
183
		$this->logInWithPermission('Product_CANCRUD');
184
185
		$optionGroup = OptionGroup::get()->filter(array('Title' => 'Sample-Group'))->first();
186
187
		$option = $this->objFromFixture(OptionItem::class, 'large');
188
		$option->ProductOptionGroupID = $optionGroup->ID;
189
		$option->write();
190
191
		$optionID = $option->ID;
192
193
		$optionItem = OptionItem::get()->filter(array('ProductOptionGroupID' => $optionGroup->ID))->first();
194
195
		$this->assertEquals($optionID, $optionItem->ID);
196
197
	}
198
199
	function testOptionItemDeletion(){
200
201
		$this->logInWithPermission('ADMIN');
202
203
		$optionGroup = $this->objFromFixture(OptionGroup::class, 'size');
204
		$optionGroup->write();
205
206
		$option = $this->objFromFixture(OptionItem::class, 'small');
207
		$option->write();
208
209
		$optionID = $option->ID;
210
211
		$this->assertTrue($option->canDelete());
212
213
		$this->logOut();
214
		$this->logInWithPermission('Product_CANCRUD');
215
216
		$this->assertTrue($option->canDelete());
217
		$option->delete();
218
219
		$this->assertFalse(in_array($optionID, OptionItem::get()->column('ID')));
220
221
	}
222
223
	public function testProductDraftOptionDeletion(){
224
225
		self::$use_draft_site = false;//make sure we can publish
226
227
		$this->logInWithPermission('ADMIN');
228
229
		$holder = $this->objFromFixture(ProductHolder::class, 'default');//build holder page, ProductPage can't be on root level
230
		$holder->doPublish();
231
232
		$product = $this->objFromFixture(ProductPage::class, 'product1');//build product page
233
		$product->doPublish();
234
235
		$productID = $product->ID;
236
237
238
		$optionGroup = $this->objFromFixture(OptionGroup::class, 'size');//build the group for the options
239
		$optionGroup->write();
240
		$option = $this->objFromFixture(OptionItem::class, 'small');//build first option
241
		$option->write();
242
		$option2 = $this->objFromFixture(OptionItem::class, 'large');//build second option
243
		$option2->write();
244
245
		$this->assertTrue($product->isPublished());//check that product is published
246
247
		$product->deleteFromStage('Stage');//remove product from draft site
248
249
		$this->assertTrue($product->isPublished());//check product is still published
250
251
		$testOption = $this->objFromFixture(OptionItem::class, 'large');
252
253
		$this->assertThat($testOption->ID, $this->logicalNot($this->equalTo(0)));//make sure the first option still exists
254
255
		$product->doRestoreToStage();//restore page to draft site
256
		$product->doUnpublish();//unpublish page
257
		$product->deleteFromStage('Stage');//remove product from draft site
258
259
		$checkDeleted = OptionItem::get()->filter(array('Title' => 'Large', 'ProductID' => $productID))->first();//query same option as above
260
261
		$this->assertEquals($checkDeleted->ID, 0);//check that the ID is 0 (empty object/non-existent)
262
	}
263
}