RowBaseAndTotalBaseCalculatorTestCase.php 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  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\Framework\TestFramework\Unit\Helper\ObjectManager;
  8. use Magento\Tax\Model\Calculation\RowBaseCalculator;
  9. use Magento\Tax\Model\Calculation\TotalBaseCalculator;
  10. use Magento\Tax\Api\Data\QuoteDetailsItemExtensionInterface;
  11. /**
  12. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  13. */
  14. class RowBaseAndTotalBaseCalculatorTestCase extends \PHPUnit\Framework\TestCase
  15. {
  16. const STORE_ID = 2300;
  17. const QUANTITY = 1;
  18. const UNIT_PRICE = 500;
  19. const RATE = 10;
  20. const STORE_RATE = 11;
  21. const UNIT_PRICE_INCL_TAX = 495.49549549545;
  22. const UNIT_PRICE_INCL_TAX_ROUNDED = 495.5;
  23. const CODE = 'CODE';
  24. const TYPE = 'TYPE';
  25. const ONCE = 'once';
  26. const MOCK_METHOD_NAME = 'mock_method_name';
  27. const MOCK_VALUE = 'mock_value';
  28. const WITH_ARGUMENT = 'with_argument';
  29. /** @var ObjectManager */
  30. protected $objectManager;
  31. /** @var \PHPUnit_Framework_MockObject_MockObject */
  32. protected $taxItemDetailsDataObjectFactory;
  33. /** @var \PHPUnit_Framework_MockObject_MockObject */
  34. protected $mockCalculationTool;
  35. /** @var \PHPUnit_Framework_MockObject_MockObject */
  36. protected $mockConfig;
  37. /** @var \Magento\Tax\Api\Data\QuoteDetailsItemInterface|\PHPUnit_Framework_MockObject_MockObject */
  38. protected $mockItem;
  39. /** @var \PHPUnit_Framework_MockObject_MockObject */
  40. protected $appliedTaxDataObjectFactory;
  41. /** @var \PHPUnit_Framework_MockObject_MockObject */
  42. protected $appliedTaxRateDataObjectFactory;
  43. /** @var \PHPUnit_Framework_MockObject_MockObject */
  44. protected $mockAppliedTax;
  45. protected $addressRateRequest;
  46. /** @var \Magento\Tax\Api\Data\AppliedTaxRateInterface */
  47. protected $appliedTaxRate;
  48. /**
  49. * @var \Magento\Tax\Api\Data\TaxDetailsItemInterface
  50. */
  51. protected $taxDetailsItem;
  52. /**
  53. * @var \Magento\Tax\Api\Data\QuoteDetailsItemExtensionInterface|\PHPUnit_Framework_MockObject_MockObject
  54. */
  55. private $quoteDetailsItemExtension;
  56. /**
  57. * initialize all mocks
  58. *
  59. * @param bool $isTaxIncluded
  60. */
  61. public function initMocks($isTaxIncluded)
  62. {
  63. $this->initMockItem($isTaxIncluded);
  64. $this->initMockConfig();
  65. $this->initMockCalculationTool($isTaxIncluded);
  66. $this->initMockAppliedTaxDataObjectFactory();
  67. }
  68. protected function setUp()
  69. {
  70. $this->objectManager = new ObjectManager($this);
  71. $this->taxItemDetailsDataObjectFactory = $this->createPartialMock(
  72. \Magento\Tax\Api\Data\TaxDetailsItemInterfaceFactory::class,
  73. ['create']
  74. );
  75. $this->taxDetailsItem = $this->objectManager->getObject(\Magento\Tax\Model\TaxDetails\ItemDetails::class);
  76. $this->taxItemDetailsDataObjectFactory->expects($this->any())
  77. ->method('create')
  78. ->willReturn($this->taxDetailsItem);
  79. $this->mockCalculationTool = $this->getMockBuilder(\Magento\Tax\Model\Calculation::class)
  80. ->disableOriginalConstructor()
  81. ->setMethods(
  82. ['__wakeup', 'round', 'getRate', 'getStoreRate', 'getRateRequest', 'getAppliedRates']
  83. )
  84. ->getMock();
  85. $this->mockConfig = $this->getMockBuilder(\Magento\Tax\Model\Config::class)
  86. ->disableOriginalConstructor()
  87. ->getMock();
  88. $this->mockItem = $this->getMockBuilder(\Magento\Tax\Api\Data\QuoteDetailsItemInterface::class)
  89. ->disableOriginalConstructor()->setMethods(['getExtensionAttributes', 'getUnitPrice'])
  90. ->getMockForAbstractClass();
  91. $this->quoteDetailsItemExtension = $this->getMockBuilder(QuoteDetailsItemExtensionInterface::class)
  92. ->disableOriginalConstructor()->setMethods(['getPriceForTaxCalculation'])
  93. ->getMockForAbstractClass();
  94. $this->mockItem->expects($this->any())->method('getExtensionAttributes')
  95. ->willReturn($this->quoteDetailsItemExtension);
  96. $this->appliedTaxDataObjectFactory = $this->createPartialMock(
  97. \Magento\Tax\Api\Data\AppliedTaxInterfaceFactory::class,
  98. ['create']
  99. );
  100. $this->appliedTaxRateDataObjectFactory = $this->createPartialMock(
  101. \Magento\Tax\Api\Data\AppliedTaxRateInterfaceFactory::class,
  102. ['create']
  103. );
  104. $this->appliedTaxRate = $this->objectManager->getObject(\Magento\Tax\Model\TaxDetails\AppliedTaxRate::class);
  105. $this->appliedTaxRateDataObjectFactory->expects($this->any())
  106. ->method('create')
  107. ->willReturn($this->appliedTaxRate);
  108. $this->mockAppliedTax = $this->getMockBuilder(\Magento\Tax\Api\Data\AppliedTaxInterface::class)->getMock();
  109. $this->mockAppliedTax->expects($this->any())->method('getTaxRateKey')->will($this->returnValue('taxKey'));
  110. $this->addressRateRequest = new \Magento\Framework\DataObject();
  111. }
  112. /**
  113. * @param $calculator RowBaseCalculator|TotalBaseCalculator
  114. * @param boolean $round
  115. * @return \Magento\Tax\Api\Data\TaxDetailsItemInterface
  116. */
  117. public function calculate($calculator, $round = true)
  118. {
  119. return $calculator->calculate($this->mockItem, 1, $round);
  120. }
  121. /**
  122. * init mock Items
  123. *
  124. * @param bool $isTaxIncluded
  125. */
  126. protected function initMockItem($isTaxIncluded)
  127. {
  128. $this->mockReturnValues(
  129. $this->mockItem,
  130. [
  131. [
  132. self::ONCE => false,
  133. self::MOCK_METHOD_NAME => 'getDiscountAmount',
  134. self::MOCK_VALUE => 1,
  135. ],
  136. [
  137. self::ONCE => false,
  138. self::MOCK_METHOD_NAME => 'getCode',
  139. self::MOCK_VALUE => self::CODE
  140. ],
  141. [
  142. self::ONCE => false,
  143. self::MOCK_METHOD_NAME => 'getType',
  144. self::MOCK_VALUE => self::TYPE
  145. ],
  146. [
  147. self::ONCE => false,
  148. self::MOCK_METHOD_NAME => 'getUnitPrice',
  149. self::MOCK_VALUE => self::UNIT_PRICE
  150. ],
  151. [
  152. self::ONCE => false,
  153. self::MOCK_METHOD_NAME => 'getIsTaxIncluded',
  154. self::MOCK_VALUE => $isTaxIncluded
  155. ]
  156. ]
  157. );
  158. }
  159. /**
  160. * init mock config
  161. *
  162. */
  163. protected function initMockConfig()
  164. {
  165. $this->mockReturnValues(
  166. $this->mockConfig,
  167. [
  168. [
  169. self::ONCE => false,
  170. self::MOCK_METHOD_NAME => 'applyTaxAfterDiscount',
  171. self::MOCK_VALUE => true,
  172. ]
  173. ]
  174. );
  175. }
  176. /**
  177. * init mock calculation model
  178. *
  179. * @param boolean $isTaxIncluded
  180. */
  181. protected function initMockCalculationTool($isTaxIncluded)
  182. {
  183. $mockValues = [
  184. [
  185. self::ONCE => false,
  186. self::MOCK_METHOD_NAME => 'getRate',
  187. self::MOCK_VALUE => self::RATE
  188. ],
  189. [
  190. self::ONCE => false,
  191. self::MOCK_METHOD_NAME => 'getAppliedRates',
  192. self::MOCK_VALUE => [
  193. [
  194. 'id' => 0,
  195. 'percent' => 1.4,
  196. 'rates' => [
  197. [
  198. 'code' => 'sku_1',
  199. 'title' => 'title1',
  200. 'percent' => 1.1,
  201. ],
  202. ],
  203. ],
  204. ]
  205. ],
  206. ];
  207. if ($isTaxIncluded) {
  208. $mockValues[] = [
  209. self::ONCE => false,
  210. self::MOCK_METHOD_NAME => 'getStoreRate',
  211. self::MOCK_VALUE => self::STORE_RATE
  212. ];
  213. }
  214. $this->mockReturnValues(
  215. $this->mockCalculationTool,
  216. $mockValues
  217. );
  218. $this->mockCalculationTool->expects($this->atLeastOnce())
  219. ->method('round')
  220. ->willReturnCallback(
  221. function ($price) {
  222. return round($price, 2);
  223. }
  224. );
  225. }
  226. /**
  227. * init mock appliedTaxDataObjectFactory
  228. *
  229. */
  230. protected function initMockAppliedTaxDataObjectFactory()
  231. {
  232. $this->mockReturnValues(
  233. $this->appliedTaxDataObjectFactory,
  234. [
  235. [
  236. self::ONCE => false,
  237. self::MOCK_METHOD_NAME => 'create',
  238. self::MOCK_VALUE => $this->mockAppliedTax,
  239. ]
  240. ]
  241. );
  242. }
  243. /**
  244. * @param \PHPUnit_Framework_MockObject_MockObject $mockObject
  245. * @param array $mockMap
  246. */
  247. private function mockReturnValues($mockObject, $mockMap)
  248. {
  249. foreach ($mockMap as $valueMap) {
  250. if (isset($valueMap[self::WITH_ARGUMENT])) {
  251. $mockObject->expects(
  252. $valueMap[self::ONCE] == true ? $this->once() : $this->atLeastOnce()
  253. )->method($valueMap[self::MOCK_METHOD_NAME])->with($valueMap[self::WITH_ARGUMENT])
  254. ->will(
  255. $this->returnValue($valueMap[self::MOCK_VALUE])
  256. );
  257. } else {
  258. $mockObject->expects(
  259. $valueMap[self::ONCE] == true ? $this->once() : $this->atLeastOnce()
  260. )->method($valueMap[self::MOCK_METHOD_NAME])->withAnyParameters()
  261. ->will(
  262. $this->returnValue($valueMap[self::MOCK_VALUE])
  263. );
  264. }
  265. }
  266. }
  267. }