CartTest.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Paypal\Test\Unit\Model;
  7. use Magento\Paypal\Model\Cart;
  8. class CartTest extends \PHPUnit\Framework\TestCase
  9. {
  10. /**
  11. * @var Cart
  12. */
  13. protected $_model;
  14. /**
  15. * @var \Magento\Framework\DataObject
  16. */
  17. protected $_validItem;
  18. /**
  19. * @var \Magento\Payment\Model\Cart\SalesModel\SalesModelInterface|\PHPUnit_Framework_MockObject_MockObject
  20. */
  21. protected $_salesModel;
  22. /**
  23. * @param null|string $name
  24. * @param array $data
  25. * @param string $dataName
  26. */
  27. public function __construct($name = null, array $data = [], $dataName = '')
  28. {
  29. parent::__construct($name, $data, $dataName);
  30. $this->_validItem = new \Magento\Framework\DataObject(
  31. [
  32. 'parent_item' => null,
  33. 'price' => 2.0,
  34. 'qty' => 3,
  35. 'name' => 'valid item',
  36. 'original_item' => new \Magento\Framework\DataObject(['base_row_total' => 6.0]),
  37. ]
  38. );
  39. }
  40. protected function setUp()
  41. {
  42. $this->_salesModel = $this->getMockForAbstractClass(
  43. \Magento\Payment\Model\Cart\SalesModel\SalesModelInterface::class
  44. );
  45. $factoryMock = $this->createPartialMock(\Magento\Payment\Model\Cart\SalesModel\Factory::class, ['create']);
  46. $factoryMock->expects(
  47. $this->once()
  48. )->method(
  49. 'create'
  50. )->with(
  51. 'sales model'
  52. )->will(
  53. $this->returnValue($this->_salesModel)
  54. );
  55. $eventManagerMock = $this->getMockForAbstractClass(\Magento\Framework\Event\ManagerInterface::class);
  56. $this->_model = new \Magento\Paypal\Model\Cart($factoryMock, $eventManagerMock, 'sales model');
  57. }
  58. /**
  59. * @param array $items
  60. * @dataProvider invalidGetAllItemsDataProvider
  61. */
  62. public function testInvalidGetAllItems($items)
  63. {
  64. $taxContainer = new \Magento\Framework\DataObject(
  65. ['base_discount_tax_compensation_amount' => 0.2, 'base_shipping_discount_tax_compensation_amount' => 0.1]
  66. );
  67. $this->_salesModel->expects($this->once())->method('getTaxContainer')->will($this->returnValue($taxContainer));
  68. $this->_salesModel->expects($this->once())->method('getAllItems')->will($this->returnValue($items));
  69. $this->_salesModel->expects($this->once())->method('getBaseSubtotal')->will($this->returnValue(2.1));
  70. $this->_salesModel->expects($this->once())->method('getBaseTaxAmount')->will($this->returnValue(0.1));
  71. $this->_salesModel->expects($this->once())->method('getBaseShippingAmount')->will($this->returnValue(1.1));
  72. $this->_salesModel->expects($this->once())->method('getBaseDiscountAmount')->will($this->returnValue(0.3));
  73. $this->assertEmpty($this->_model->getAllItems());
  74. $this->assertEquals(2.1, $this->_model->getSubtotal());
  75. $this->assertEquals(0.1 + 0.2 + 0.1, $this->_model->getTax());
  76. $this->assertEquals(1.1, $this->_model->getShipping());
  77. $this->assertEquals(0.3, $this->_model->getDiscount());
  78. }
  79. /**
  80. * @return array
  81. */
  82. public function invalidGetAllItemsDataProvider()
  83. {
  84. return [
  85. [[]],
  86. [
  87. [
  88. new \Magento\Framework\DataObject(
  89. [
  90. 'parent_item' => new \Magento\Framework\DataObject(),
  91. 'price' => 2.0,
  92. 'qty' => 3,
  93. 'name' => 'item 1',
  94. ]
  95. ),
  96. ]
  97. ],
  98. [
  99. [
  100. $this->_validItem,
  101. new \Magento\Framework\DataObject(
  102. [
  103. 'price' => 2.0,
  104. 'qty' => 3,
  105. 'name' => 'item 2',
  106. 'original_item' => new \Magento\Framework\DataObject(['base_row_total' => 6.01]),
  107. ]
  108. ),
  109. ]
  110. ],
  111. [
  112. [
  113. $this->_validItem,
  114. new \Magento\Framework\DataObject(
  115. [
  116. 'price' => sqrt(2),
  117. 'qty' => sqrt(2),
  118. 'name' => 'item 3',
  119. 'original_item' => new \Magento\Framework\DataObject(['base_row_total' => 2]),
  120. ]
  121. ),
  122. ]
  123. ]
  124. ];
  125. }
  126. /**
  127. * @param array $values
  128. * @param bool $transferDiscount
  129. * @dataProvider invalidTotalsGetAllItemsDataProvider
  130. */
  131. public function testInvalidTotalsGetAllItems($values, $transferDiscount)
  132. {
  133. $expectedSubtotal = $this->_prepareInvalidModelData($values, $transferDiscount);
  134. $this->assertEmpty($this->_model->getAllItems());
  135. $this->assertEquals($expectedSubtotal, $this->_model->getSubtotal());
  136. $this->assertEquals(
  137. $values['base_tax_amount'] +
  138. $values['base_discount_tax_compensation_amount'] +
  139. $values['base_shipping_discount_tax_compensation_amount'],
  140. $this->_model->getTax()
  141. );
  142. $this->assertEquals($values['base_shipping_amount'], $this->_model->getShipping());
  143. $this->assertEquals($transferDiscount ? 0.0 : $values['base_discount_amount'], $this->_model->getDiscount());
  144. }
  145. /**
  146. * @return array
  147. */
  148. public function invalidTotalsGetAllItemsDataProvider()
  149. {
  150. return [
  151. [
  152. [
  153. 'base_discount_tax_compensation_amount' => 0,
  154. 'base_shipping_discount_tax_compensation_amount' => 0,
  155. 'base_subtotal' => 0,
  156. 'base_tax_amount' => 0,
  157. 'base_shipping_amount' => 0,
  158. 'base_discount_amount' => 6.1,
  159. 'base_grand_total' => 0,
  160. ],
  161. false,
  162. ],
  163. [
  164. [
  165. 'base_discount_tax_compensation_amount' => 1,
  166. 'base_shipping_discount_tax_compensation_amount' => 2,
  167. 'base_subtotal' => 3,
  168. 'base_tax_amount' => 4,
  169. 'base_shipping_amount' => 5,
  170. 'base_discount_amount' => 100,
  171. 'base_grand_total' => 5.5,
  172. ],
  173. true
  174. ]
  175. ];
  176. }
  177. public function testGetAllItems()
  178. {
  179. $totals = $this->_prepareValidModelData();
  180. $this->assertEquals(
  181. [
  182. new \Magento\Framework\DataObject(
  183. [
  184. 'name' => $this->_validItem->getName(),
  185. 'qty' => $this->_validItem->getQty(),
  186. 'amount' => $this->_validItem->getPrice(),
  187. ]
  188. ),
  189. ],
  190. $this->_model->getAllItems()
  191. );
  192. $this->assertEquals($totals['subtotal'], $this->_model->getSubtotal());
  193. $this->assertEquals($totals['tax'], $this->_model->getTax());
  194. $this->assertEquals($totals['shipping'], $this->_model->getShipping());
  195. $this->assertEquals($totals['discount'], $this->_model->getDiscount());
  196. }
  197. /**
  198. * @param array $values
  199. * @param bool $transferDiscount
  200. * @param bool $transferShipping
  201. * @dataProvider invalidGetAmountsDataProvider
  202. */
  203. public function testInvalidGetAmounts($values, $transferDiscount, $transferShipping)
  204. {
  205. $expectedSubtotal = $this->_prepareInvalidModelData($values, $transferDiscount);
  206. if ($transferShipping) {
  207. $this->_model->setTransferShippingAsItem();
  208. }
  209. $result = $this->_model->getAmounts();
  210. $expectedSubtotal += $this->_model->getTax();
  211. $expectedSubtotal += $values['base_shipping_amount'];
  212. if (!$transferDiscount) {
  213. $expectedSubtotal -= $this->_model->getDiscount();
  214. }
  215. $this->assertEquals([Cart::AMOUNT_SUBTOTAL => $expectedSubtotal], $result);
  216. }
  217. /**
  218. * @return array
  219. */
  220. public function invalidGetAmountsDataProvider()
  221. {
  222. $data = [];
  223. $invalidTotalsData = $this->invalidTotalsGetAllItemsDataProvider();
  224. foreach ($invalidTotalsData as $dataItem) {
  225. $data[] = [$dataItem[0], $dataItem[1], true];
  226. $data[] = [$dataItem[0], $dataItem[1], false];
  227. }
  228. return $data;
  229. }
  230. /**
  231. * Prepare invalid data for cart
  232. *
  233. * @param array $values
  234. * @param bool $transferDiscount
  235. * @return float
  236. */
  237. protected function _prepareInvalidModelData($values, $transferDiscount)
  238. {
  239. $taxContainer = new \Magento\Framework\DataObject(
  240. [
  241. 'base_discount_tax_compensation_amount' =>
  242. $values['base_discount_tax_compensation_amount'],
  243. 'base_shipping_discount_tax_compensation_amount' =>
  244. $values['base_shipping_discount_tax_compensation_amount'],
  245. ]
  246. );
  247. $expectedSubtotal = $values['base_subtotal'];
  248. if ($transferDiscount) {
  249. $this->_model->setTransferDiscountAsItem();
  250. $expectedSubtotal -= $values['base_discount_amount'];
  251. }
  252. $this->_salesModel->expects($this->once())->method('getTaxContainer')->will($this->returnValue($taxContainer));
  253. $this->_salesModel->expects(
  254. $this->once()
  255. )->method(
  256. 'getAllItems'
  257. )->will(
  258. $this->returnValue([$this->_validItem])
  259. );
  260. $this->_salesModel->expects(
  261. $this->once()
  262. )->method(
  263. 'getBaseSubtotal'
  264. )->will(
  265. $this->returnValue($values['base_subtotal'])
  266. );
  267. $this->_salesModel->expects(
  268. $this->once()
  269. )->method(
  270. 'getBaseTaxAmount'
  271. )->will(
  272. $this->returnValue($values['base_tax_amount'])
  273. );
  274. $this->_salesModel->expects(
  275. $this->once()
  276. )->method(
  277. 'getBaseShippingAmount'
  278. )->will(
  279. $this->returnValue($values['base_shipping_amount'])
  280. );
  281. $this->_salesModel->expects(
  282. $this->once()
  283. )->method(
  284. 'getBaseDiscountAmount'
  285. )->will(
  286. $this->returnValue($values['base_discount_amount'])
  287. );
  288. $this->_salesModel->expects(
  289. $this->once()
  290. )->method(
  291. 'getDataUsingMethod'
  292. )->with(
  293. 'base_grand_total'
  294. )->will(
  295. $this->returnValue($values['base_grand_total'])
  296. );
  297. return $expectedSubtotal;
  298. }
  299. public function testGetAmounts()
  300. {
  301. $totals = $this->_prepareValidModelData();
  302. $this->assertEquals($totals, $this->_model->getAmounts());
  303. }
  304. /**
  305. * Prepare valid cart data
  306. *
  307. * @return array
  308. */
  309. protected function _prepareValidModelData()
  310. {
  311. $totals = ['discount' => 0.1, 'shipping' => 0.2, 'subtotal' => 0.3, 'tax' => 0.4];
  312. $taxContainer = new \Magento\Framework\DataObject(
  313. ['base_discount_tax_compensation_amount' => 0, 'base_shipping_discount_tax_compensation_amnt' => 0]
  314. );
  315. $this->_salesModel->expects($this->once())->method('getTaxContainer')->will($this->returnValue($taxContainer));
  316. $this->_salesModel->expects(
  317. $this->once()
  318. )->method(
  319. 'getAllItems'
  320. )->will(
  321. $this->returnValue([$this->_validItem])
  322. );
  323. $this->_salesModel->expects(
  324. $this->once()
  325. )->method(
  326. 'getBaseSubtotal'
  327. )->will(
  328. $this->returnValue($totals['subtotal'])
  329. );
  330. $this->_salesModel->expects(
  331. $this->once()
  332. )->method(
  333. 'getBaseTaxAmount'
  334. )->will(
  335. $this->returnValue($totals['tax'])
  336. );
  337. $this->_salesModel->expects(
  338. $this->once()
  339. )->method(
  340. 'getBaseShippingAmount'
  341. )->will(
  342. $this->returnValue($totals['shipping'])
  343. );
  344. $this->_salesModel->expects(
  345. $this->once()
  346. )->method(
  347. 'getBaseDiscountAmount'
  348. )->will(
  349. $this->returnValue($totals['discount'])
  350. );
  351. $this->_salesModel->expects(
  352. $this->once()
  353. )->method(
  354. 'getDataUsingMethod'
  355. )->with(
  356. 'base_grand_total'
  357. )->will(
  358. $this->returnValue(6.0 + $totals['tax'] + $totals['shipping'] - $totals['discount'])
  359. );
  360. return $totals;
  361. }
  362. public function testHasNegativeItemAmount()
  363. {
  364. $this->_model->addCustomItem('item1', 1, 2.1);
  365. $this->assertFalse($this->_model->hasNegativeItemAmount());
  366. $this->_model->addCustomItem('item1', 1, -1.3);
  367. $this->assertTrue($this->_model->hasNegativeItemAmount());
  368. }
  369. }