GrandTotalDetailsPluginTest.php 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  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\Quote;
  7. use \Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
  8. /**
  9. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  10. */
  11. class GrandTotalDetailsPluginTest extends \PHPUnit\Framework\TestCase
  12. {
  13. /**
  14. * @var \Magento\Quote\Api\Data\TotalSegmentExtensionFactory|\PHPUnit_Framework_MockObject_MockObject
  15. */
  16. protected $totalSegmentExtensionFactoryMock;
  17. /**
  18. * @var \Magento\Tax\Api\Data\GrandTotalDetailsInterfaceFactory|\PHPUnit_Framework_MockObject_MockObject
  19. */
  20. protected $detailsFactoryMock;
  21. /**
  22. * @var \Magento\Tax\Api\Data\GrandTotalRatesInterfaceFactory|\PHPUnit_Framework_MockObject_MockObject
  23. */
  24. protected $ratesFactoryMock;
  25. /**
  26. * @var \Magento\Tax\Model\Config|\PHPUnit_Framework_MockObject_MockObject
  27. */
  28. protected $taxConfigMock;
  29. /**
  30. * @var \Magento\Quote\Model\Cart\TotalsConverter|\PHPUnit_Framework_MockObject_MockObject
  31. */
  32. protected $subjectMock;
  33. /**
  34. * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
  35. */
  36. protected $objectManagerHelper;
  37. /**
  38. * @var \Magento\Tax\Model\Quote\GrandTotalDetailsPlugin
  39. */
  40. protected $model;
  41. protected function setUp()
  42. {
  43. $this->subjectMock = $this->getMockBuilder(\Magento\Quote\Model\Cart\TotalsConverter::class)
  44. ->disableOriginalConstructor()
  45. ->getMock();
  46. $this->totalSegmentExtensionFactoryMock = $this->getMockBuilder(
  47. \Magento\Quote\Api\Data\TotalSegmentExtensionFactory::class
  48. )->disableOriginalConstructor()
  49. ->getMock();
  50. $this->detailsFactoryMock = $this->getMockBuilder(
  51. \Magento\Tax\Api\Data\GrandTotalDetailsInterfaceFactory::class
  52. )
  53. ->disableOriginalConstructor()
  54. ->setMethods(['create'])
  55. ->getMock();
  56. $this->ratesFactoryMock = $this->getMockBuilder(\Magento\Tax\Api\Data\GrandTotalRatesInterfaceFactory::class)
  57. ->disableOriginalConstructor()
  58. ->setMethods(['create'])
  59. ->getMock();
  60. $this->taxConfigMock = $this->getMockBuilder(\Magento\Tax\Model\Config::class)
  61. ->disableOriginalConstructor()
  62. ->getMock();
  63. $serializer = $this->getMockBuilder(\Magento\Framework\Serialize\Serializer\Json::class)
  64. ->disableOriginalConstructor()
  65. ->getMock();
  66. $serializer->expects($this->any())
  67. ->method('serialize')
  68. ->willReturnCallback(
  69. function ($value) {
  70. return json_encode($value);
  71. }
  72. );
  73. $serializer->expects($this->any())
  74. ->method('unserialize')
  75. ->willReturnCallback(
  76. function ($value) {
  77. return json_decode($value, true);
  78. }
  79. );
  80. $this->objectManagerHelper = new ObjectManager($this);
  81. $this->model = $this->objectManagerHelper->getObject(
  82. \Magento\Tax\Model\Quote\GrandTotalDetailsPlugin::class,
  83. [
  84. 'totalSegmentExtensionFactory' => $this->totalSegmentExtensionFactoryMock,
  85. 'ratesFactory' => $this->ratesFactoryMock,
  86. 'detailsFactory' => $this->detailsFactoryMock,
  87. 'taxConfig' => $this->taxConfigMock,
  88. 'serializer' => $serializer
  89. ]
  90. );
  91. }
  92. /**
  93. * @param array $data
  94. * @return \PHPUnit_Framework_MockObject_MockObject
  95. */
  96. protected function setupTaxTotal(array $data)
  97. {
  98. $taxTotalMock = $this->getMockBuilder(\Magento\Quote\Model\Quote\Address\Total::class)
  99. ->disableOriginalConstructor()
  100. ->getMock();
  101. $taxTotalMock->expects($this->any())
  102. ->method('getData')
  103. ->willReturn($data);
  104. return $taxTotalMock;
  105. }
  106. /**
  107. * @param array $taxRate
  108. * @return \PHPUnit_Framework_MockObject_MockObject
  109. */
  110. protected function setupTaxRateFactoryMock(array $taxRate)
  111. {
  112. $taxRateMock = $this->getMockBuilder(\Magento\Tax\Api\Data\GrandTotalRatesInterface::class)
  113. ->getMock();
  114. $this->ratesFactoryMock->expects($this->once())
  115. ->method('create')
  116. ->with([])
  117. ->willReturn($taxRateMock);
  118. $taxRateMock->expects($this->once())
  119. ->method('setPercent')
  120. ->with($taxRate['percent'])
  121. ->willReturnSelf();
  122. $taxRateMock->expects($this->once())
  123. ->method('setTitle')
  124. ->with($taxRate['title'])
  125. ->willReturnSelf();
  126. return $taxRateMock;
  127. }
  128. /**
  129. * @param array $taxDetails
  130. * @return \PHPUnit_Framework_MockObject_MockObject
  131. */
  132. protected function setupTaxDetails(array $taxDetails)
  133. {
  134. $taxDetailsMock = $this->getMockBuilder(\Magento\Tax\Api\Data\GrandTotalDetailsInterface::class)
  135. ->getMock();
  136. $this->detailsFactoryMock->expects($this->once())
  137. ->method('create')
  138. ->willReturn($taxDetailsMock);
  139. $taxDetailsMock->expects($this->once())
  140. ->method('setAmount')
  141. ->with($taxDetails['amount'])
  142. ->willReturnSelf();
  143. $taxDetailsMock->expects($this->once())
  144. ->method('setRates')
  145. ->with($taxDetails['rates'])
  146. ->willReturnSelf();
  147. $taxDetailsMock->expects($this->once())
  148. ->method('setGroupId')
  149. ->with(1)
  150. ->willReturnSelf();
  151. return $taxDetailsMock;
  152. }
  153. public function testAfterProcess()
  154. {
  155. $taxRate = [
  156. 'percent' => 8.25,
  157. 'title' => 'TX',
  158. ];
  159. $taxAmount = 10;
  160. $taxRateMock = $this->setupTaxRateFactoryMock($taxRate);
  161. $taxDetailsMock = $this->setupTaxDetails(
  162. [
  163. 'amount' => $taxAmount,
  164. 'rates' => [$taxRateMock],
  165. ]
  166. );
  167. $taxTotalData = [
  168. 'full_info' => json_encode([
  169. [
  170. 'amount' => $taxAmount,
  171. 'rates' => [$taxRate],
  172. ],
  173. ]),
  174. ];
  175. $taxTotalMock = $this->setupTaxTotal($taxTotalData);
  176. $addressTotals = [
  177. 'tax' => $taxTotalMock,
  178. ];
  179. $extensionAttributeMock = $this->getMockBuilder(
  180. \Magento\Quote\Api\Data\TotalSegmentExtensionInterface::class
  181. )->setMethods(
  182. [
  183. 'setTaxGrandtotalDetails',
  184. ]
  185. )->getMockForAbstractClass();
  186. $extensionAttributeMock->expects($this->once())
  187. ->method('setTaxGrandtotalDetails')
  188. ->with([$taxDetailsMock])
  189. ->willReturnSelf();
  190. $taxSegmentMock = $this->getMockBuilder(\Magento\Quote\Model\Cart\TotalSegment::class)
  191. ->disableOriginalConstructor()
  192. ->getMock();
  193. $taxSegmentMock->expects($this->once())
  194. ->method('getExtensionAttributes')
  195. ->willReturn($extensionAttributeMock);
  196. $taxSegmentMock->expects($this->once())
  197. ->method('setExtensionAttributes')
  198. ->with($extensionAttributeMock)
  199. ->willReturnSelf();
  200. $totalSegments = [
  201. 'tax' => $taxSegmentMock,
  202. ];
  203. $result = $this->model->afterProcess($this->subjectMock, $totalSegments, $addressTotals);
  204. $this->assertEquals($totalSegments, $result);
  205. }
  206. }