AdminTest.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Sales\Test\Unit\Helper;
  7. use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
  8. /**
  9. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  10. */
  11. class AdminTest extends \PHPUnit\Framework\TestCase
  12. {
  13. /**
  14. * @var \Magento\Framework\App\Helper\Context|\PHPUnit_Framework_MockObject_MockObject
  15. */
  16. protected $contextMock;
  17. /**
  18. * @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject
  19. */
  20. protected $storeManagerMock;
  21. /**
  22. * @var \Magento\Sales\Model\Config|\PHPUnit_Framework_MockObject_MockObject
  23. */
  24. protected $salesConfigMock;
  25. /**
  26. * @var \Magento\Framework\DataObject|\PHPUnit_Framework_MockObject_MockObject
  27. */
  28. protected $magentoObjectMock;
  29. /**
  30. * @var \Magento\Sales\Model\Order|\PHPUnit_Framework_MockObject_MockObject
  31. */
  32. protected $orderMock;
  33. /**
  34. * @var \Magento\Sales\Helper\Admin
  35. */
  36. protected $adminHelper;
  37. /**
  38. * @var \Magento\Framework\Pricing\PriceCurrencyInterface|\PHPUnit_Framework_MockObject_MockObject
  39. */
  40. protected $priceCurrency;
  41. /**
  42. * @var \Magento\Framework\Escaper|\PHPUnit_Framework_MockObject_MockObject
  43. */
  44. protected $escaperMock;
  45. protected function setUp()
  46. {
  47. $this->contextMock = $this->getMockBuilder(\Magento\Framework\App\Helper\Context::class)
  48. ->disableOriginalConstructor()
  49. ->getMock();
  50. $this->storeManagerMock = $this->getMockBuilder(\Magento\Store\Model\StoreManagerInterface::class)
  51. ->disableOriginalConstructor()
  52. ->getMock();
  53. $this->salesConfigMock = $this->getMockBuilder(\Magento\Sales\Model\Config::class)
  54. ->disableOriginalConstructor()
  55. ->getMock();
  56. $this->priceCurrency = $this->getMockBuilder(
  57. \Magento\Framework\Pricing\PriceCurrencyInterface::class
  58. )->getMock();
  59. $this->escaperMock = $this->getMockBuilder(\Magento\Framework\Escaper::class)
  60. ->disableOriginalConstructor()
  61. ->getMock();
  62. $this->adminHelper = (new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this))->getObject(
  63. \Magento\Sales\Helper\Admin::class,
  64. [
  65. 'context' => $this->contextMock,
  66. 'storeManager' => $this->storeManagerMock,
  67. 'salesConfig' => $this->salesConfigMock,
  68. 'priceCurrency' => $this->priceCurrency,
  69. 'escaper' => $this->escaperMock
  70. ]
  71. );
  72. $this->magentoObjectMock = $this->getMockBuilder(\Magento\Framework\DataObject::class)
  73. ->disableOriginalConstructor()
  74. ->setMethods(['getOrder', 'getData'])
  75. ->getMock();
  76. $this->orderMock = $this->getMockBuilder(\Magento\Sales\Model\Order::class)
  77. ->disableOriginalConstructor()
  78. ->getMock();
  79. $this->orderMock->expects($this->any())
  80. ->method('formatBasePrice')
  81. ->will($this->returnValue('formattedBasePrice'));
  82. $this->orderMock->expects($this->any())
  83. ->method('formatPrice')
  84. ->will($this->returnValue('formattedPrice'));
  85. $this->orderMock->expects($this->any())
  86. ->method('getData')
  87. ->will($this->returnValue('data'));
  88. }
  89. /**
  90. * @param string $expected
  91. * @param bool $dataObjectIsOrder
  92. * @param bool $isCurrencyDifferent
  93. * @param bool $magentoDataObjectHasOrder
  94. * @param bool $strong
  95. * @param string $separator
  96. * @dataProvider displayPricesDataProvider
  97. */
  98. public function testDisplayPrices(
  99. $expected,
  100. $dataObjectIsOrder,
  101. $isCurrencyDifferent = true,
  102. $magentoDataObjectHasOrder = true,
  103. $strong = false,
  104. $separator = '<br/>'
  105. ) {
  106. $this->orderMock->expects($this->any())
  107. ->method('isCurrencyDifferent')
  108. ->will($this->returnValue($isCurrencyDifferent));
  109. $storeMock = $this->getMockBuilder(\Magento\Store\Model\Store::class)
  110. ->disableOriginalConstructor()
  111. ->getMock();
  112. $this->storeManagerMock->expects($this->any())
  113. ->method('getStore')
  114. ->will($this->returnValue($storeMock));
  115. $this->priceCurrency->expects($this->any())
  116. ->method('format')
  117. ->will($this->returnValue('storeFormattedPrice'));
  118. $dataObject = $this->orderMock;
  119. if (!$dataObjectIsOrder) {
  120. $returnRes = false;
  121. if ($magentoDataObjectHasOrder) {
  122. $returnRes = $this->orderMock;
  123. }
  124. $this->magentoObjectMock->expects($this->once())
  125. ->method('getOrder')
  126. ->will($this->returnValue($returnRes));
  127. $dataObject = $this->magentoObjectMock;
  128. }
  129. $basePrice = 10.00;
  130. $price = 15.00;
  131. $this->assertEquals(
  132. $expected,
  133. $this->adminHelper->displayPrices($dataObject, $basePrice, $price, $strong, $separator)
  134. );
  135. }
  136. /**
  137. * @param string $expected
  138. * @param bool $dataObjectIsOrder
  139. * @param bool $isCurrencyDifferent
  140. * @param bool $magentoDataObjectHasOrder
  141. * @param bool $strong
  142. * @param string $separator
  143. * @dataProvider displayPricesDataProvider
  144. */
  145. public function testDisplayPriceAttribute(
  146. $expected,
  147. $dataObjectIsOrder,
  148. $isCurrencyDifferent = true,
  149. $magentoDataObjectHasOrder = true,
  150. $strong = false,
  151. $separator = '<br/>'
  152. ) {
  153. $this->orderMock->expects($this->any())
  154. ->method('isCurrencyDifferent')
  155. ->will($this->returnValue($isCurrencyDifferent));
  156. $storeMock = $this->getMockBuilder(\Magento\Store\Model\Store::class)
  157. ->disableOriginalConstructor()
  158. ->getMock();
  159. $this->storeManagerMock->expects($this->any())
  160. ->method('getStore')
  161. ->will($this->returnValue($storeMock));
  162. $this->priceCurrency->expects($this->any())
  163. ->method('format')
  164. ->will($this->returnValue('storeFormattedPrice'));
  165. $dataObject = $this->orderMock;
  166. if (!$dataObjectIsOrder) {
  167. $returnRes = false;
  168. if ($magentoDataObjectHasOrder) {
  169. $returnRes = $this->orderMock;
  170. }
  171. $this->magentoObjectMock->expects($this->once())
  172. ->method('getOrder')
  173. ->will($this->returnValue($returnRes));
  174. $this->magentoObjectMock->expects($this->any())
  175. ->method('getData')
  176. ->will($this->returnValue('data'));
  177. $dataObject = $this->magentoObjectMock;
  178. }
  179. $this->assertEquals(
  180. $expected,
  181. $this->adminHelper->displayPriceAttribute($dataObject, 'code', $strong, $separator)
  182. );
  183. }
  184. /**
  185. * @return array
  186. */
  187. public function displayPricesDataProvider()
  188. {
  189. return [
  190. [
  191. '<strong>formattedBasePrice</strong><br/>[formattedPrice]',
  192. true,
  193. ],
  194. [
  195. '<strong>formattedBasePrice</strong><br/>[formattedPrice]',
  196. false,
  197. ],
  198. [
  199. 'formattedPrice',
  200. true,
  201. false,
  202. ],
  203. [
  204. 'formattedPrice',
  205. false,
  206. false,
  207. ],
  208. [
  209. '<strong>formattedPrice</strong>',
  210. true,
  211. false,
  212. true,
  213. true,
  214. ],
  215. [
  216. '<strong>formattedPrice</strong>',
  217. true,
  218. false,
  219. true,
  220. true,
  221. 'seperator',
  222. ],
  223. [
  224. '<strong>formattedBasePrice</strong>seperator[formattedPrice]',
  225. true,
  226. true,
  227. true,
  228. true,
  229. 'seperator',
  230. ],
  231. [
  232. 'storeFormattedPrice',
  233. false,
  234. false,
  235. false,
  236. false,
  237. 'seperator',
  238. ],
  239. [
  240. '<strong>storeFormattedPrice</strong>',
  241. false,
  242. false,
  243. false,
  244. true,
  245. 'seperator',
  246. ],
  247. ];
  248. }
  249. /**
  250. * @param string $itemKey
  251. * @param string $type
  252. * @param int $calledTimes
  253. * @dataProvider applySalableProductTypesFilterDataProvider
  254. */
  255. public function testApplySalableProductTypesFilter($itemKey, $type, $calledTimes)
  256. {
  257. $productMock = $this->getMockBuilder(\Magento\Catalog\Model\Product::class)
  258. ->disableOriginalConstructor()
  259. ->getMock();
  260. $productMock->expects($this->any())
  261. ->method('getTypeId')
  262. ->will($this->returnValue($type));
  263. $orderMock = $this->getMockBuilder(\Magento\Sales\Model\Order\Item::class)
  264. ->disableOriginalConstructor()
  265. ->setMethods(['__wakeup', 'getProductType'])
  266. ->getMock();
  267. $orderMock->expects($this->any())
  268. ->method('getProductType')
  269. ->will($this->returnValue($type));
  270. $quoteMock = $this->getMockBuilder(\Magento\Quote\Model\Quote\Item::class)
  271. ->disableOriginalConstructor()
  272. ->getMock();
  273. $quoteMock->expects($this->any())
  274. ->method('getProductType')
  275. ->will($this->returnValue($type));
  276. $items = [
  277. 'product' => $productMock,
  278. 'order' => $orderMock,
  279. 'quote' => $quoteMock,
  280. 'other' => 'other',
  281. ];
  282. $collectionClassName = \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection::class;
  283. $collectionMock = $this->getMockBuilder($collectionClassName)
  284. ->disableOriginalConstructor()
  285. ->getMock();
  286. $collectionMock->expects($this->any())
  287. ->method('getItems')
  288. ->will($this->returnValue([$items[$itemKey]]));
  289. $collectionMock->expects($this->exactly($calledTimes))
  290. ->method('removeItemByKey');
  291. $this->salesConfigMock->expects($this->any())
  292. ->method('getAvailableProductTypes')
  293. ->will($this->returnValue(['validProductType']));
  294. $this->adminHelper->applySalableProductTypesFilter($collectionMock);
  295. }
  296. /**
  297. * @return array
  298. */
  299. public function applySalableProductTypesFilterDataProvider()
  300. {
  301. return [
  302. ['product', 'validProductType', 0],
  303. ['product', 'invalidProductType', 1],
  304. ['order', 'validProductType', 0],
  305. ['order', 'invalidProductType', 1],
  306. ['quote', 'validProductType', 0],
  307. ['quote', 'invalidProductType', 1],
  308. ['other', 'validProductType', 1],
  309. ];
  310. }
  311. /**
  312. * @param string $data
  313. * @param string $expected
  314. * @param null|array $allowedTags
  315. * @dataProvider escapeHtmlWithLinksDataProvider
  316. */
  317. public function testEscapeHtmlWithLinks($data, $expected, $allowedTags = null)
  318. {
  319. $this->escaperMock
  320. ->expects($this->any())
  321. ->method('escapeHtml')
  322. ->will($this->returnValue($expected));
  323. $actual = $this->adminHelper->escapeHtmlWithLinks($data, $allowedTags);
  324. $this->assertEquals($expected, $actual);
  325. }
  326. /**
  327. * @return array
  328. */
  329. public function escapeHtmlWithLinksDataProvider()
  330. {
  331. return [
  332. [
  333. '<a>some text in tags</a>',
  334. '&lt;a&gt;some text in tags&lt;/a&gt;',
  335. 'allowedTags' => null
  336. ],
  337. [
  338. 'Transaction ID: "<a target="_blank" href="https://www.paypal.com/?id=XX123XX">XX123XX</a>"',
  339. 'Transaction ID: &quot;<a target="_blank" href="https://www.paypal.com/?id=XX123XX">XX123XX</a>&quot;',
  340. 'allowedTags' => ['b', 'br', 'strong', 'i', 'u', 'a']
  341. ],
  342. [
  343. '<a>some text in tags</a>',
  344. '<a>some text in tags</a>',
  345. 'allowedTags' => ['a']
  346. ],
  347. 'Not replacement with placeholders' => [
  348. "<a><script>alert(1)</script></a>",
  349. '<a>&lt;script&gt;alert(1)&lt;/script&gt;</a>',
  350. 'allowedTags' => ['a']
  351. ],
  352. 'Normal usage, url escaped' => [
  353. '<a href=\"#\">Foo</a>',
  354. '<a href="#">Foo</a>',
  355. 'allowedTags' => ['a']
  356. ],
  357. 'Normal usage, url not escaped' => [
  358. "<a href=http://example.com?foo=1&bar=2&baz[name]=BAZ>Foo</a>",
  359. '<a href="http://example.com?foo=1&amp;bar=2&amp;baz[name]=BAZ">Foo</a>',
  360. 'allowedTags' => ['a']
  361. ],
  362. 'XSS test' => [
  363. "<a href=\"javascript&colon;alert(59)\">Foo</a>",
  364. '<a href="#">Foo</a>',
  365. 'allowedTags' => ['a']
  366. ],
  367. 'Additional regex test' => [
  368. "<a href=\"http://example1.com\" href=\"http://example2.com\">Foo</a>",
  369. '<a href="http://example1.com">Foo</a>',
  370. 'allowedTags' => ['a']
  371. ],
  372. 'Break of valid urls' => [
  373. "<a href=\"http://example.com?foo=text with space\">Foo</a>",
  374. '<a href="#">Foo</a>',
  375. 'allowedTags' => ['a']
  376. ],
  377. ];
  378. }
  379. }