AmountTest.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\Pricing\Test\Unit\Render;
  7. use Magento\Framework\Pricing\Render\RendererPool;
  8. use Magento\Framework\Pricing\Render\Amount;
  9. use Magento\Framework\Pricing\SaleableInterface;
  10. use Magento\Framework\Pricing\Price\PriceInterface;
  11. /**
  12. * Test class for \Magento\Framework\Pricing\Render\Amount
  13. *
  14. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  15. */
  16. class AmountTest extends \PHPUnit\Framework\TestCase
  17. {
  18. /**
  19. * @var Amount
  20. */
  21. protected $model;
  22. /**
  23. * @var \Magento\Framework\Pricing\PriceCurrencyInterface|\PHPUnit_Framework_MockObject_MockObject
  24. */
  25. protected $priceCurrency;
  26. /**
  27. * @var RendererPool|\PHPUnit_Framework_MockObject_MockObject
  28. */
  29. protected $rendererPool;
  30. /**
  31. * @var \Magento\Framework\View\LayoutInterface | \PHPUnit_Framework_MockObject_MockObject
  32. */
  33. protected $layout;
  34. /**
  35. * @var SaleableInterface|\PHPUnit_Framework_MockObject_MockObject
  36. */
  37. protected $saleableItemMock;
  38. /**
  39. * @var \Magento\Framework\Pricing\Amount\AmountInterface | \PHPUnit_Framework_MockObject_MockObject
  40. */
  41. protected $amount;
  42. /**
  43. * @var PriceInterface|\PHPUnit_Framework_MockObject_MockObject
  44. */
  45. protected $priceMock;
  46. protected function setUp()
  47. {
  48. $this->priceCurrency = $this->createMock(\Magento\Framework\Pricing\PriceCurrencyInterface::class);
  49. $data = [
  50. 'default' => [
  51. 'adjustments' => [
  52. 'base_price_test' => [
  53. 'tax' => [
  54. 'adjustment_render_class' => \Magento\Framework\View\Element\Template::class,
  55. 'adjustment_render_template' => 'template.phtml',
  56. ],
  57. ],
  58. ],
  59. ],
  60. ];
  61. $this->rendererPool = $this->getMockBuilder(\Magento\Framework\Pricing\Render\RendererPool::class)
  62. ->setConstructorArgs(['data' => $data])
  63. ->disableOriginalConstructor()
  64. ->getMock();
  65. $this->layout = $this->createMock(\Magento\Framework\View\Layout::class);
  66. $this->amount = $this->getMockForAbstractClass(\Magento\Framework\Pricing\Amount\AmountInterface::class);
  67. $this->saleableItemMock = $this->getMockForAbstractClass(\Magento\Framework\Pricing\SaleableInterface::class);
  68. $this->priceMock = $this->getMockForAbstractClass(\Magento\Framework\Pricing\Price\PriceInterface::class);
  69. $eventManager = $this->createMock(\Magento\Framework\Event\Test\Unit\ManagerStub::class);
  70. $scopeConfigMock = $this->getMockForAbstractClass(\Magento\Framework\App\Config\ScopeConfigInterface::class);
  71. $context = $this->createMock(\Magento\Framework\View\Element\Template\Context::class);
  72. $context->expects($this->any())
  73. ->method('getEventManager')
  74. ->will($this->returnValue($eventManager));
  75. $context->expects($this->any())
  76. ->method('getLayout')
  77. ->will($this->returnValue($this->layout));
  78. $context->expects($this->any())
  79. ->method('getScopeConfig')
  80. ->will($this->returnValue($scopeConfigMock));
  81. $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
  82. $this->model = $objectManager->getObject(
  83. \Magento\Framework\Pricing\Render\Amount::class,
  84. [
  85. 'context' => $context,
  86. 'priceCurrency' => $this->priceCurrency,
  87. 'rendererPool' => $this->rendererPool,
  88. 'amount' => $this->amount,
  89. 'saleableItem' => $this->saleableItemMock,
  90. 'price' => $this->priceMock
  91. ]
  92. );
  93. }
  94. public function testFormatCurrency()
  95. {
  96. $amount = '100';
  97. $includeContainer = true;
  98. $precision = \Magento\Framework\Pricing\PriceCurrencyInterface::DEFAULT_PRECISION;
  99. $result = '100.0 grn';
  100. $this->priceCurrency->expects($this->once())
  101. ->method('format')
  102. ->with($amount, $includeContainer, $precision)
  103. ->will($this->returnValue($result));
  104. $this->assertEquals($result, $this->model->formatCurrency($amount, $includeContainer, $precision));
  105. }
  106. public function testGetDisplayCurrencySymbol()
  107. {
  108. $currencySymbol = '$';
  109. $this->priceCurrency->expects($this->once())
  110. ->method('getCurrencySymbol')
  111. ->willReturn($currencySymbol);
  112. $this->assertEquals($currencySymbol, $this->model->getDisplayCurrencySymbol());
  113. }
  114. /**
  115. * Test case for getAdjustmentRenders method through toHtml()
  116. *
  117. * @param bool $hasSkipAdjustments
  118. * @param bool|null $skipAdjustments
  119. * @param string $expected
  120. * @dataProvider dataProviderToHtmlSkipAdjustments
  121. */
  122. public function testToHtmlSkipAdjustments($hasSkipAdjustments, $skipAdjustments, $expected)
  123. {
  124. if ($hasSkipAdjustments) {
  125. $this->model->setData('skip_adjustments', $skipAdjustments);
  126. $expectedData = [
  127. 'key1' => 'data1',
  128. 'css_classes' => 'class1 class2',
  129. 'module_name' => null,
  130. 'adjustment_css_classes' => 'class1 class2 render1 render2',
  131. 'skip_adjustments' => $skipAdjustments
  132. ];
  133. } else {
  134. $expectedData = [
  135. 'key1' => 'data1',
  136. 'css_classes' => 'class1 class2',
  137. 'module_name' => null,
  138. 'adjustment_css_classes' => 'class1 class2 render1 render2',
  139. ];
  140. }
  141. $this->model->setData('key1', 'data1');
  142. $this->model->setData('css_classes', 'class1 class2');
  143. $adjustmentRender1 = $this->getAdjustmentRenderMock($expectedData, 'html');
  144. $adjustmentRender2 = $this->getAdjustmentRenderMock($expectedData);
  145. $adjustmentRenders = ['render1' => $adjustmentRender1, 'render2' => $adjustmentRender2];
  146. $this->rendererPool->expects($this->once())
  147. ->method('getAdjustmentRenders')
  148. ->will($this->returnValue($adjustmentRenders));
  149. $this->model->toHtml();
  150. $this->assertEquals($expected, $this->model->getAdjustmentsHtml());
  151. }
  152. /**
  153. * @return array
  154. */
  155. public function dataProviderToHtmlSkipAdjustments()
  156. {
  157. return [
  158. [false, null, 'html'],
  159. [false, null, 'html'],
  160. [true, false, 'html'],
  161. [true, true, ''],
  162. ];
  163. }
  164. /**
  165. * Test case for getAdjustmentRenders method through toHtml()
  166. */
  167. public function testToHtmlGetAdjustmentRenders()
  168. {
  169. $data = ['key1' => 'data1', 'css_classes' => 'class1 class2'];
  170. $expectedData = [
  171. 'key1' => 'data1',
  172. 'css_classes' => 'class1 class2',
  173. 'module_name' => null,
  174. 'adjustment_css_classes' => 'class1 class2 render1 render2',
  175. ];
  176. $this->model->setData($data);
  177. $adjustmentRender1 = $this->getAdjustmentRenderMock($expectedData);
  178. $adjustmentRender2 = $this->getAdjustmentRenderMock($expectedData);
  179. $adjustmentRenders = ['render1' => $adjustmentRender1, 'render2' => $adjustmentRender2];
  180. $this->rendererPool->expects($this->once())
  181. ->method('getAdjustmentRenders')
  182. ->will($this->returnValue($adjustmentRenders));
  183. $this->amount->expects($this->atLeastOnce())
  184. ->method('getAdjustmentAmount')
  185. ->willReturn(true);
  186. $this->model->toHtml();
  187. }
  188. public function testGetDisplayValueExiting()
  189. {
  190. $displayValue = 5.99;
  191. $this->model->setDisplayValue($displayValue);
  192. $this->assertEquals($displayValue, $this->model->getDisplayValue());
  193. }
  194. public function testGetDisplayValue()
  195. {
  196. $amountValue = 100.99;
  197. $this->amount->expects($this->once())
  198. ->method('getValue')
  199. ->will($this->returnValue($amountValue));
  200. $this->assertEquals($amountValue, $this->model->getDisplayValue());
  201. }
  202. public function testGetAmount()
  203. {
  204. $this->assertEquals($this->amount, $this->model->getAmount());
  205. }
  206. public function testGetSealableItem()
  207. {
  208. $this->assertEquals($this->saleableItemMock, $this->model->getSaleableItem());
  209. }
  210. public function testGetPrice()
  211. {
  212. $this->assertEquals($this->priceMock, $this->model->getPrice());
  213. }
  214. public function testAdjustmentsHtml()
  215. {
  216. $adjustmentHtml1 = 'adjustment_1_html';
  217. $adjustmentHtml2 = 'adjustment_2_html';
  218. $data = ['key1' => 'data1', 'css_classes' => 'class1 class2'];
  219. $expectedData = [
  220. 'key1' => 'data1',
  221. 'css_classes' => 'class1 class2',
  222. 'module_name' => null,
  223. 'adjustment_css_classes' => 'class1 class2 render1 render2',
  224. ];
  225. $this->model->setData($data);
  226. $this->assertFalse($this->model->hasAdjustmentsHtml());
  227. $adjustmentRender1 = $this->getAdjustmentRenderMock($expectedData, $adjustmentHtml1, 'adjustment_code1');
  228. $adjustmentRender2 = $this->getAdjustmentRenderMock($expectedData, $adjustmentHtml2, 'adjustment_code2');
  229. $adjustmentRenders = ['render1' => $adjustmentRender1, 'render2' => $adjustmentRender2];
  230. $this->rendererPool->expects($this->once())
  231. ->method('getAdjustmentRenders')
  232. ->will($this->returnValue($adjustmentRenders));
  233. $this->amount->expects($this->atLeastOnce())
  234. ->method('getAdjustmentAmount')
  235. ->willReturn(true);
  236. $this->model->toHtml();
  237. $this->assertTrue($this->model->hasAdjustmentsHtml());
  238. $this->assertEquals($adjustmentHtml1 . $adjustmentHtml2, $this->model->getAdjustmentsHtml());
  239. }
  240. /**
  241. * @param array $data
  242. * @param string $html
  243. * @param string $code
  244. * @return \PHPUnit_Framework_MockObject_MockObject
  245. */
  246. protected function getAdjustmentRenderMock($data = [], $html = '', $code = 'adjustment_code')
  247. {
  248. $adjustmentRender = $this->getMockForAbstractClass(
  249. \Magento\Framework\Pricing\Render\AdjustmentRenderInterface::class
  250. );
  251. $adjustmentRender->expects($this->once())
  252. ->method('render')
  253. ->with($this->model, $data)
  254. ->will($this->returnValue($html));
  255. $adjustmentRender->expects($this->any())
  256. ->method('getAdjustmentCode')
  257. ->will($this->returnValue($code));
  258. return $adjustmentRender;
  259. }
  260. }