UnitBaseCalculatorTest.php 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Tax\Test\Unit\Model\Calculation;
  7. use Magento\Tax\Model\Calculation\UnitBaseCalculator;
  8. /**
  9. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  10. */
  11. class UnitBaseCalculatorTest extends \PHPUnit\Framework\TestCase
  12. {
  13. const STORE_ID = 2300;
  14. const QUANTITY = 1;
  15. const UNIT_PRICE = 500;
  16. const RATE = 10;
  17. const STORE_RATE = 11;
  18. const CODE = 'CODE';
  19. const TYPE = 'TYPE';
  20. const ROW_TAX = 44.958682408681;
  21. const ROW_TAX_ROUNDED = 44.95;
  22. const PRICE_INCL_TAX = 495.4954954955;
  23. const PRICE_INCL_TAX_ROUNDED = 495.50;
  24. /** @var \PHPUnit_Framework_MockObject_MockObject */
  25. protected $taxDetailsItemDataObjectFactoryMock;
  26. /** @var \PHPUnit_Framework_MockObject_MockObject */
  27. protected $mockCalculationTool;
  28. /** @var \PHPUnit_Framework_MockObject_MockObject */
  29. protected $mockConfig;
  30. /** @var \PHPUnit_Framework_MockObject_MockObject */
  31. protected $appliedTaxRateDataObjectFactoryMock;
  32. /** @var UnitBaseCalculator */
  33. protected $model;
  34. protected $addressRateRequest;
  35. /**
  36. * @var \Magento\Tax\Api\Data\TaxDetailsItemInterface
  37. */
  38. protected $taxDetailsItem;
  39. /**
  40. * @var \Magento\Tax\Api\Data\AppliedTaxRateInterface
  41. */
  42. protected $appliedTaxRate;
  43. protected function setUp()
  44. {
  45. /** @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager $objectManager */
  46. $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
  47. $this->taxDetailsItem = $objectManager->getObject(\Magento\Tax\Model\TaxDetails\ItemDetails::class);
  48. $this->taxDetailsItemDataObjectFactoryMock =
  49. $this->getMockBuilder(\Magento\Tax\Api\Data\TaxDetailsItemInterfaceFactory::class)
  50. ->setMethods(['create'])
  51. ->disableOriginalConstructor()
  52. ->getMock();
  53. $this->taxDetailsItemDataObjectFactoryMock->expects($this->any())
  54. ->method('create')
  55. ->willReturn($this->taxDetailsItem);
  56. $this->mockCalculationTool = $this->getMockBuilder(\Magento\Tax\Model\Calculation::class)
  57. ->disableOriginalConstructor()
  58. ->setMethods(['__wakeup', 'round', 'getRate', 'getStoreRate', 'getRateRequest', 'getAppliedRates'])
  59. ->getMock();
  60. $this->mockCalculationTool->expects($this->any())
  61. ->method('round')
  62. ->withAnyParameters()
  63. ->willReturnCallback(
  64. function ($price) {
  65. return round($price, 2);
  66. }
  67. );
  68. $this->mockConfig = $this->getMockBuilder(\Magento\Tax\Model\Config::class)
  69. ->disableOriginalConstructor()
  70. ->getMock();
  71. $this->addressRateRequest = new \Magento\Framework\DataObject();
  72. $this->appliedTaxRate = $objectManager->getObject(\Magento\Tax\Model\TaxDetails\AppliedTaxRate::class);
  73. $this->appliedTaxRateDataObjectFactoryMock = $this->createPartialMock(
  74. \Magento\Tax\Api\Data\AppliedTaxRateInterfaceFactory::class,
  75. ['create']
  76. );
  77. $this->appliedTaxRateDataObjectFactoryMock->expects($this->any())
  78. ->method('create')
  79. ->willReturn($this->appliedTaxRate);
  80. $appliedTaxDataObject = $objectManager->getObject(\Magento\Tax\Model\TaxDetails\AppliedTax::class);
  81. $appliedTaxDataObjectFactoryMock = $this->createPartialMock(
  82. \Magento\Tax\Api\Data\AppliedTaxInterfaceFactory::class,
  83. ['create']
  84. );
  85. $appliedTaxDataObjectFactoryMock->expects($this->any())
  86. ->method('create')
  87. ->willReturn($appliedTaxDataObject);
  88. $arguments = [
  89. 'taxDetailsItemDataObjectFactory' => $this->taxDetailsItemDataObjectFactoryMock,
  90. 'calculationTool' => $this->mockCalculationTool,
  91. 'config' => $this->mockConfig,
  92. 'storeId' => self::STORE_ID,
  93. 'addressRateRequest' => $this->addressRateRequest,
  94. 'appliedRateDataObjectFactory' => $this->appliedTaxRateDataObjectFactoryMock,
  95. 'appliedTaxDataObjectFactory' => $appliedTaxDataObjectFactoryMock,
  96. ];
  97. $this->model = $objectManager->getObject(\Magento\Tax\Model\Calculation\UnitBaseCalculator::class, $arguments);
  98. }
  99. public function testCalculateWithTaxInPrice()
  100. {
  101. $mockItem = $this->getMockItem();
  102. $mockItem->expects($this->atLeastOnce())
  103. ->method('getIsTaxIncluded')
  104. ->will($this->returnValue(true));
  105. $this->mockConfig->expects($this->atLeastOnce())
  106. ->method('crossBorderTradeEnabled')
  107. ->will($this->returnValue(false));
  108. $this->mockConfig->expects($this->atLeastOnce())
  109. ->method('applyTaxAfterDiscount')
  110. ->will($this->returnValue(true));
  111. $this->mockCalculationTool->expects($this->atLeastOnce())
  112. ->method('getRate')
  113. ->with($this->addressRateRequest)
  114. ->will($this->returnValue(self::RATE));
  115. $this->mockCalculationTool->expects($this->atLeastOnce())
  116. ->method('getStoreRate')
  117. ->with($this->addressRateRequest, self::STORE_ID)
  118. ->will($this->returnValue(self::STORE_RATE));
  119. $this->mockCalculationTool->expects($this->atLeastOnce())
  120. ->method('getAppliedRates')
  121. ->withAnyParameters()
  122. ->will($this->returnValue([]));
  123. $this->assertSame($this->taxDetailsItem, $this->model->calculate($mockItem, self::QUANTITY));
  124. $this->assertSame(self::CODE, $this->taxDetailsItem->getCode());
  125. $this->assertSame(self::TYPE, $this->taxDetailsItem->getType());
  126. $this->assertSame(self::ROW_TAX_ROUNDED, $this->taxDetailsItem->getRowTax());
  127. $this->assertEquals(self::PRICE_INCL_TAX_ROUNDED, $this->taxDetailsItem->getPriceInclTax());
  128. $this->assertSame($this->taxDetailsItem, $this->model->calculate($mockItem, self::QUANTITY, false));
  129. $this->assertSame(self::CODE, $this->taxDetailsItem->getCode());
  130. $this->assertSame(self::TYPE, $this->taxDetailsItem->getType());
  131. $this->assertSame(self::ROW_TAX, $this->taxDetailsItem->getRowTax());
  132. $this->assertEquals(self::PRICE_INCL_TAX, $this->taxDetailsItem->getPriceInclTax());
  133. }
  134. public function testCalculateWithTaxNotInPrice()
  135. {
  136. $mockItem = $this->getMockItem();
  137. $mockItem->expects($this->once())
  138. ->method('getIsTaxIncluded')
  139. ->will($this->returnValue(false));
  140. $this->mockConfig->expects($this->once())
  141. ->method('applyTaxAfterDiscount')
  142. ->will($this->returnValue(true));
  143. $this->mockCalculationTool->expects($this->once())
  144. ->method('getRate')
  145. ->with($this->addressRateRequest)
  146. ->will($this->returnValue(self::RATE));
  147. $this->mockCalculationTool->expects($this->once())
  148. ->method('getAppliedRates')
  149. ->withAnyParameters()
  150. ->will($this->returnValue([['id' => 0, 'percent' => 0, 'rates' => []]]));
  151. $this->assertSame($this->taxDetailsItem, $this->model->calculate($mockItem, self::QUANTITY));
  152. $this->assertEquals(self::CODE, $this->taxDetailsItem->getCode());
  153. $this->assertEquals(self::TYPE, $this->taxDetailsItem->getType());
  154. $this->assertEquals(0.0, $this->taxDetailsItem->getRowTax());
  155. }
  156. /**
  157. * @return \PHPUnit_Framework_MockObject_MockObject
  158. */
  159. protected function getMockItem()
  160. {
  161. /** @var $mockItem \PHPUnit_Framework_MockObject_MockObject */
  162. $mockItem = $this->getMockBuilder(\Magento\Tax\Api\Data\QuoteDetailsItemInterface::class)
  163. ->disableOriginalConstructor()
  164. ->getMock();
  165. $mockItem->expects($this->atLeastOnce())
  166. ->method('getDiscountAmount')
  167. ->will($this->returnValue(1));
  168. $mockItem->expects($this->atLeastOnce())
  169. ->method('getCode')
  170. ->will($this->returnValue(self::CODE));
  171. $mockItem->expects($this->atLeastOnce())
  172. ->method('getType')
  173. ->will($this->returnValue(self::TYPE));
  174. $mockItem->expects($this->atLeastOnce())
  175. ->method('getUnitPrice')
  176. ->will($this->returnValue(self::UNIT_PRICE));
  177. return $mockItem;
  178. }
  179. }