1 | <?php |
||||
2 | |||||
3 | namespace SilverShop\Tests\Cart; |
||||
4 | |||||
5 | use SilverShop\Cart\ShoppingCart; |
||||
6 | use SilverShop\Model\Order; |
||||
7 | use SilverShop\Model\Variation\OrderItem; |
||||
8 | use SilverShop\Model\Variation\Variation; |
||||
9 | use SilverShop\Page\Product; |
||||
10 | use SilverShop\Tests\ShopTest; |
||||
11 | use SilverStripe\Core\Config\Config; |
||||
12 | use SilverStripe\Dev\SapphireTest; |
||||
13 | |||||
14 | class ShoppingCartTest extends SapphireTest |
||||
15 | { |
||||
16 | protected static $fixture_file = __DIR__ . '/../Fixtures/shop.yml'; |
||||
17 | |||||
18 | public static $disable_theme = true; |
||||
19 | |||||
20 | protected static $use_draft_site = false; |
||||
21 | |||||
22 | /** |
||||
23 | * @var Product |
||||
24 | */ |
||||
25 | protected $product; |
||||
26 | |||||
27 | /** |
||||
28 | * @var ShoppingCart |
||||
29 | */ |
||||
30 | protected $cart; |
||||
31 | |||||
32 | public function setUp() |
||||
33 | { |
||||
34 | parent::setUp(); |
||||
35 | ShopTest::setConfiguration(); //reset config |
||||
36 | Config::modify()->set(Order::class, 'extensions', [ShoppingCartTest_TestShoppingCartHooksExtension::class]); |
||||
37 | |||||
38 | ShoppingCart::singleton()->clear(); |
||||
39 | ShoppingCartTest_TestShoppingCartHooksExtension::reset(); |
||||
40 | |||||
41 | $this->cart = ShoppingCart::singleton(); |
||||
42 | $this->product = $this->objFromFixture(Product::class, 'mp3player'); |
||||
43 | $this->product->publishSingle(); |
||||
44 | } |
||||
45 | |||||
46 | public function testAddToCart() |
||||
47 | { |
||||
48 | $this->assertTrue((boolean)$this->cart->add($this->product), "add one item"); |
||||
49 | $this->assertEquals( |
||||
50 | ['onStartOrder', 'beforeAdd', 'afterAdd'], |
||||
51 | ShoppingCartTest_TestShoppingCartHooksExtension::$stack |
||||
52 | ); |
||||
53 | |||||
54 | $this->assertTrue((boolean)$this->cart->add($this->product), "add another item"); |
||||
55 | $this->assertEquals( |
||||
56 | ['onStartOrder', 'beforeAdd', 'afterAdd', 'beforeAdd', 'afterAdd'], |
||||
57 | ShoppingCartTest_TestShoppingCartHooksExtension::$stack |
||||
58 | ); |
||||
59 | |||||
60 | $item = $this->cart->get($this->product); |
||||
61 | $this->assertEquals($item->Quantity, 2, "quantity is 2"); |
||||
62 | } |
||||
63 | |||||
64 | public function testRemoveFromCart() |
||||
65 | { |
||||
66 | $this->assertTrue((boolean)$this->cart->add($this->product), "add item"); |
||||
67 | $this->assertEquals( |
||||
68 | ['onStartOrder', 'beforeAdd', 'afterAdd'], |
||||
69 | ShoppingCartTest_TestShoppingCartHooksExtension::$stack |
||||
70 | ); |
||||
71 | |||||
72 | $this->assertTrue($this->cart->remove($this->product), "item was removed"); |
||||
73 | $this->assertEquals( |
||||
74 | ['onStartOrder', 'beforeAdd', 'afterAdd', 'beforeRemove', 'afterRemove'], |
||||
75 | ShoppingCartTest_TestShoppingCartHooksExtension::$stack |
||||
76 | ); |
||||
77 | $item = $this->cart->get($this->product); |
||||
78 | $this->assertFalse((bool)$item, "item not in cart"); |
||||
79 | $this->assertFalse($this->cart->remove($this->product), "try remove non-existent item"); |
||||
80 | } |
||||
81 | |||||
82 | public function testSetQuantity() |
||||
83 | { |
||||
84 | $this->assertTrue((boolean)$this->cart->setQuantity($this->product, 25), "quantity set"); |
||||
85 | |||||
86 | $this->assertEquals( |
||||
87 | ['onStartOrder', 'beforeSetQuantity', 'afterSetQuantity'], |
||||
88 | ShoppingCartTest_TestShoppingCartHooksExtension::$stack |
||||
89 | ); |
||||
90 | |||||
91 | $item = $this->cart->get($this->product); |
||||
92 | $this->assertEquals($item->Quantity, 25, "quantity is 25"); |
||||
93 | } |
||||
94 | |||||
95 | public function testClear() |
||||
96 | { |
||||
97 | //$this->assertFalse($this->cart->current(),"there is no cart initally"); |
||||
98 | $this->assertTrue((boolean)$this->cart->add($this->product), "add one item"); |
||||
99 | $this->assertTrue((boolean)$this->cart->add($this->product), "add another item"); |
||||
100 | $this->assertInstanceOf(Order::class, $this->cart->current(), "there's a cart"); |
||||
101 | $this->assertTrue($this->cart->clear(), "clear the cart"); |
||||
102 | $this->assertFalse((bool)$this->cart->current(), "there is no cart"); |
||||
103 | } |
||||
104 | |||||
105 | public function testCartSingleton() |
||||
106 | { |
||||
107 | $this->assertTrue((boolean)$this->cart->add($this->product), "add one item"); |
||||
108 | $order = $this->cart->current(); |
||||
109 | |||||
110 | $this->assertEquals($order->ID, ShoppingCart::curr()->ID, "if singleton order ids will match"); |
||||
111 | } |
||||
112 | |||||
113 | public function testErrorInCartHooks() |
||||
114 | { |
||||
115 | Config::modify()->set(Order::class, 'extensions', [ShoppingCartTest_TestShoppingCartErroringHooksExtension::class]); |
||||
116 | |||||
117 | ShoppingCart::singleton()->clear(); |
||||
118 | $cart = ShoppingCart::singleton(); |
||||
119 | |||||
120 | $this->assertTrue((boolean)$this->cart->add($this->product, 1), "add one item"); |
||||
121 | $item = $cart->get($this->product); |
||||
122 | $this->assertFalse( |
||||
123 | (boolean)$this->cart->add($this->product, 1), |
||||
124 | "Cannot add more than one item, extension will error" |
||||
125 | ); |
||||
126 | $this->assertEquals($item->Quantity, 1, "quantity is 1"); |
||||
127 | |||||
128 | $this->assertTrue((boolean)$cart->setQuantity($this->product, 10), "quantity set"); |
||||
129 | $item = $cart->get($this->product); |
||||
130 | $this->assertEquals($item->Quantity, 10, "quantity is 10"); |
||||
131 | |||||
132 | $this->assertFalse((boolean)$cart->setQuantity($this->product, 11), "Cannot set quantity to more than 10 items"); |
||||
133 | $item = $cart->get($this->product); |
||||
134 | $this->assertEquals($item->Quantity, 10, "quantity is 10"); |
||||
135 | } |
||||
136 | |||||
137 | public function testProductVariations() |
||||
138 | { |
||||
139 | $this->loadFixture(__DIR__ . '/../Fixtures/variations.yml'); |
||||
140 | $ball1 = $this->objFromFixture(Variation::class, 'redlarge'); |
||||
141 | $ball2 = $this->objFromFixture(Variation::class, 'redsmall'); |
||||
142 | |||||
143 | $this->assertTrue((boolean)$this->cart->add($ball1), "add one item"); |
||||
0 ignored issues
–
show
Bug
introduced
by
Loading history...
|
|||||
144 | |||||
145 | $this->assertEquals( |
||||
146 | ['onStartOrder', 'beforeAdd', 'afterAdd'], |
||||
147 | ShoppingCartTest_TestShoppingCartHooksExtension::$stack |
||||
148 | ); |
||||
149 | |||||
150 | $this->assertTrue((boolean)$this->cart->add($ball2), "add another item"); |
||||
151 | $this->assertTrue($this->cart->remove($ball1), "remove first item"); |
||||
0 ignored issues
–
show
$ball1 of type SilverStripe\ORM\DataObject is incompatible with the type SilverShop\Model\Buyable expected by parameter $buyable of SilverShop\Cart\ShoppingCart::remove() .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||
152 | |||||
153 | $this->assertEquals( |
||||
154 | ['onStartOrder', 'beforeAdd', 'afterAdd', 'beforeAdd', 'afterAdd', 'beforeRemove', 'afterRemove'], |
||||
155 | ShoppingCartTest_TestShoppingCartHooksExtension::$stack |
||||
156 | ); |
||||
157 | |||||
158 | $this->assertFalse((bool)$this->cart->get($ball1), "first item not in cart"); |
||||
159 | $this->assertNotNull($this->cart->get($ball2), "second item is in cart"); |
||||
160 | |||||
161 | $ball = $this->objFromFixture(Product::class, 'ball'); |
||||
162 | $redlarge = $this->objFromFixture(Variation::class, 'redlarge'); |
||||
163 | // setting price of variation to zero, so it can't be added to cart. |
||||
164 | $redlarge->Price = 0; |
||||
165 | $redlarge->write(); |
||||
166 | |||||
167 | $ball->BasePrice = 0; |
||||
168 | $ball->write(); |
||||
169 | |||||
170 | $item = $this->cart->add($ball); |
||||
171 | $this->assertNotNull($item, "Product with variations can be added to cart"); |
||||
172 | $this->assertInstanceOf(OrderItem::class, $item, 'A variation should be added to cart.'); |
||||
173 | $this->assertEquals(20, $item->Buyable()->Price, 'The buyable variation was added'); |
||||
174 | } |
||||
175 | } |
||||
176 |