Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
CartTest.php
Go to the documentation of this file.
1 <?php
7 
8 use \Magento\Payment\Model\Cart;
9 
10 class CartTest extends \PHPUnit\Framework\TestCase
11 {
13  protected $_model;
14 
16  protected $_eventManagerMock;
17 
19  protected $_salesModelMock;
20 
21  protected function setUp()
22  {
23  $this->_eventManagerMock = $this->createMock(\Magento\Framework\Event\ManagerInterface::class);
24  $this->_salesModelMock = $this->createMock(\Magento\Payment\Model\Cart\SalesModel\SalesModelInterface::class);
25  $factoryMock = $this->createMock(\Magento\Payment\Model\Cart\SalesModel\Factory::class);
26  $factoryMock->expects($this->once())->method('create')->will($this->returnValue($this->_salesModelMock));
27 
28  $this->_model = new \Magento\Payment\Model\Cart($factoryMock, $this->_eventManagerMock, null);
29  }
30 
34  public function testGetSalesModel()
35  {
36  $this->assertTrue($this->_salesModelMock === $this->_model->getSalesModel());
37  }
38 
42  public function testAddCustomItem()
43  {
44  $this->_salesModelMock->expects(
45  $this->once()
46  )->method(
47  'getAllItems'
48  )->will(
49  $this->returnValue($this->_getSalesModelItems())
50  );
51  $this->_model->getAllItems();
52  $this->_model->addCustomItem('test', 10, 10.5, 'some_id');
53  $items = $this->_model->getAllItems();
54  $customItem = array_pop($items);
55  $this->assertTrue(
56  $customItem->getName() == 'test' &&
57  $customItem->getQty() == 10 &&
58  $customItem->getAmount() == 10.5 &&
59  $customItem->getId() == 'some_id'
60  );
61  }
62 
70  public function testGetAmounts($transferFlags, $salesModelItems, $salesModelAmounts, $expected)
71  {
72  $amounts = $this->_collectItemsAndAmounts($transferFlags, $salesModelItems, $salesModelAmounts);
73  $this->assertEquals($expected, $amounts);
74 
75  // check that method just return calculated result for further calls
76  $this->_eventManagerMock->expects($this->never())->method('dispatch');
77  $amounts = $this->_model->getAmounts();
78  $this->assertEquals($expected, $amounts);
79  }
80 
87  public function testGetAllItems($transferFlags, $salesModelItems, $salesModelAmounts)
88  {
89  $this->_collectItemsAndAmounts($transferFlags, $salesModelItems, $salesModelAmounts);
90 
91  $customItems = [];
92  if ($transferFlags['transfer_shipping']) {
93  $customItems[] = new \Magento\Framework\DataObject(
94  ['name' => 'Shipping', 'qty' => 1, 'amount' => $salesModelAmounts['BaseShippingAmount']]
95  );
96  }
97  if ($transferFlags['transfer_discount']) {
98  $customItems[] = new \Magento\Framework\DataObject(
99  ['name' => 'Discount', 'qty' => 1, 'amount' => -1.00 * $salesModelAmounts['BaseDiscountAmount']]
100  );
101  }
102 
103  $cartItems = $this->_convertToCartItems($salesModelItems);
104  $expected = array_merge($cartItems, $customItems);
105  $areEqual = $this->_compareSalesItems($expected, $this->_model->getAllItems());
106  $this->assertTrue($areEqual);
107  }
108 
112  public function testAmountSettersAndGetters()
113  {
114  foreach (['Discount', 'Shipping', 'Tax'] as $amountType) {
115  $setMethod = 'set' . $amountType;
116  $getMethod = 'get' . $amountType;
117  $addMethod = 'add' . $amountType;
118 
119  $this->_model->{$setMethod}(10);
120  $this->assertEquals(10, $this->_model->{$getMethod}());
121 
122  $this->_model->{$addMethod}(5);
123  $this->assertEquals(15, $this->_model->{$getMethod}());
124 
125  $this->_model->{$addMethod}(-20);
126  $this->assertEquals(-5, $this->_model->{$getMethod}());
127 
128  $this->_model->{$setMethod}(10);
129  $this->assertEquals(10, $this->_model->{$getMethod}());
130  }
131 
132  // there is no method setSubtotal(), so test the following separately
133  $this->_model->addSubtotal(10);
134  $this->assertEquals(10, $this->_model->getSubtotal());
135 
136  $this->_model->addSubtotal(2);
137  $this->assertEquals(12, $this->_model->getSubtotal());
138 
139  $this->_model->addSubtotal(-20);
140  $this->assertEquals(-8, $this->_model->getSubtotal());
141  }
142 
148  public function cartDataProvider()
149  {
150  return [
151  // 1. All transfer flags set to true
152  [
153  ['transfer_shipping' => true, 'transfer_discount' => true],
154  $this->_getSalesModelItems(),
155  [
156  'BaseDiscountAmount' => 15.0,
157  'BaseShippingAmount' => 20.0,
158  'BaseSubtotal' => 100.0,
159  'BaseTaxAmount' => 8.0
160  ],
161  [
162  Cart::AMOUNT_DISCOUNT => 0.0,
163  Cart::AMOUNT_SHIPPING => 0.0,
164  Cart::AMOUNT_SUBTOTAL => 105.0, // = 100.5 + shipping - discount
165  Cart::AMOUNT_TAX => 8.0
166  ]
167  ],
168  // 2. All transfer flags set to false
169  [
170  ['transfer_shipping' => false, 'transfer_discount' => false],
171  $this->_getSalesModelItems(),
172  [
173  'BaseDiscountAmount' => 15.0,
174  'BaseShippingAmount' => 20.0,
175  'BaseSubtotal' => 100.0,
176  'BaseTaxAmount' => 8.0
177  ],
178  [
179  Cart::AMOUNT_DISCOUNT => 15.0,
180  Cart::AMOUNT_SHIPPING => 20.0,
181  Cart::AMOUNT_SUBTOTAL => 100.0,
182  Cart::AMOUNT_TAX => 8.0
183  ]
184  ],
185  // 3. Shipping transfer flag set to true, discount to false, sales items are empty (don't affect result)
186  [
187  ['transfer_shipping' => true, 'transfer_discount' => false],
188  [],
189  [
190  'BaseDiscountAmount' => 15.0,
191  'BaseShippingAmount' => 20.0,
192  'BaseSubtotal' => 100.0,
193  'BaseTaxAmount' => 8.0
194  ],
195  [
196  Cart::AMOUNT_DISCOUNT => 15.0,
197  Cart::AMOUNT_SHIPPING => 0.0,
198  Cart::AMOUNT_SUBTOTAL => 120.0,
199  Cart::AMOUNT_TAX => 8.0
200  ]
201  ]
202  ];
203  }
204 
212  protected function _compareSalesItems(array $salesItemsA, array $salesItemsB)
213  {
214  if (count($salesItemsA) != count($salesItemsB)) {
215  return false;
216  }
217 
218  $toStringCallback = function (&$item) {
219  $item = $item->toString();
220  };
221 
222  array_walk($salesItemsA, $toStringCallback);
223  array_walk($salesItemsB, $toStringCallback);
224 
225  sort($salesItemsA);
226  sort($salesItemsB);
227 
228  return implode('', $salesItemsA) == implode('', $salesItemsB);
229  }
230 
239  protected function _collectItemsAndAmounts($transferFlags, $salesModelItems, $salesModelAmounts)
240  {
241  if ($transferFlags['transfer_shipping']) {
242  $this->_model->setTransferShippingAsItem();
243  }
244  if ($transferFlags['transfer_discount']) {
245  $this->_model->setTransferDiscountAsItem();
246  }
247 
248  $this->_eventManagerMock->expects(
249  $this->once()
250  )->method(
251  'dispatch'
252  )->with(
253  $this->equalTo('payment_cart_collect_items_and_amounts'),
254  $this->equalTo(['cart' => $this->_model])
255  );
256 
257  $this->_salesModelMock->expects(
258  $this->once()
259  )->method(
260  'getAllItems'
261  )->will(
262  $this->returnValue($salesModelItems)
263  );
264 
265  foreach ($salesModelAmounts as $key => $value) {
266  $this->_salesModelMock->expects($this->once())->method('get' . $key)->will($this->returnValue($value));
267  }
268 
269  return $this->_model->getAmounts();
270  }
271 
277  protected function _getSalesModelItems()
278  {
279  $product = new \Magento\Framework\DataObject(['id' => '1']);
280  return [
281  new \Magento\Framework\DataObject(
282  ['name' => 'name 1', 'qty' => 1, 'price' => 0.1, 'original_item' => $product]
283  ),
284  new \Magento\Framework\DataObject(
285  ['name' => 'name 2', 'qty' => 2, 'price' => 1.2, 'original_item' => $product]
286  ),
287  new \Magento\Framework\DataObject(
288  [
289  'parent_item' => 'parent item 3',
290  'name' => 'name 3',
291  'qty' => 3,
292  'price' => 2.3,
293  'original_item' => $product,
294  ]
295  )
296  ];
297  }
298 
305  protected function _convertToCartItems(array $salesModelItems)
306  {
307  $result = [];
308  foreach ($salesModelItems as $item) {
309  if ($item->getParentItem()) {
310  continue;
311  }
312  $result[] = new \Magento\Framework\DataObject(
313  [
314  'name' => $item->getName(),
315  'qty' => $item->getQty(),
316  'amount' => $item->getPrice(),
317  'id' => $item->getOriginalItem()->getId(),
318  ]
319  );
320  }
321  return $result;
322  }
323 }
_compareSalesItems(array $salesItemsA, array $salesItemsB)
Definition: CartTest.php:212
_convertToCartItems(array $salesModelItems)
Definition: CartTest.php:305
_collectItemsAndAmounts($transferFlags, $salesModelItems, $salesModelAmounts)
Definition: CartTest.php:239
$value
Definition: gender.phtml:16
testGetAllItems($transferFlags, $salesModelItems, $salesModelAmounts)
Definition: CartTest.php:87
testGetAmounts($transferFlags, $salesModelItems, $salesModelAmounts, $expected)
Definition: CartTest.php:70
$items