DownloadCustomOptionTest.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Sales\Test\Unit\Controller\Download;
  7. use Magento\Framework\Serialize\Serializer\Json;
  8. use Magento\Framework\Unserialize\Unserialize;
  9. /**
  10. * Class DownloadCustomOptionTest
  11. * @package Magento\Sales\Controller\Adminhtml\Order
  12. */
  13. class DownloadCustomOptionTest extends \PHPUnit\Framework\TestCase
  14. {
  15. /**
  16. * Option ID Test Value
  17. */
  18. const OPTION_ID = '123456';
  19. /**
  20. * Option Code Test Value
  21. */
  22. const OPTION_CODE = 'option_123456';
  23. /**
  24. * Option Product ID Value
  25. */
  26. const OPTION_PRODUCT_ID = 'option_test_product_id';
  27. /**
  28. * Option Type Value
  29. */
  30. const OPTION_TYPE = 'file';
  31. /**
  32. * Option Value Test Value
  33. */
  34. const OPTION_VALUE = 'option_test_value';
  35. /**
  36. * Option Value Test Value
  37. */
  38. const SECRET_KEY = 'secret_key';
  39. /**
  40. * @var \Magento\Quote\Model\Quote\Item\Option|\PHPUnit_Framework_MockObject_MockObject
  41. */
  42. protected $itemOptionMock;
  43. /**
  44. * @var \Magento\Catalog\Model\Product\Option|\PHPUnit_Framework_MockObject_MockObject
  45. */
  46. protected $productOptionMock;
  47. /**
  48. * @var \Magento\Framework\Unserialize\Unserialize|\PHPUnit_Framework_MockObject_MockObject
  49. */
  50. protected $serializerMock;
  51. /**
  52. * @var \Magento\Framework\Controller\Result\Forward|\PHPUnit_Framework_MockObject_MockObject
  53. */
  54. protected $resultForwardMock;
  55. /**
  56. * @var \Magento\Sales\Model\Download|\PHPUnit_Framework_MockObject_MockObject
  57. */
  58. protected $downloadMock;
  59. /**
  60. * @var \Magento\Sales\Controller\Download\DownloadCustomOption|\PHPUnit_Framework_MockObject_MockObject
  61. */
  62. protected $objectMock;
  63. protected function setUp()
  64. {
  65. $resultForwardFactoryMock = $this->getMockBuilder(\Magento\Framework\Controller\Result\ForwardFactory::class)
  66. ->disableOriginalConstructor()
  67. ->setMethods(['create'])
  68. ->getMock();
  69. $this->resultForwardMock = $this->getMockBuilder(\Magento\Framework\Controller\Result\Forward::class)
  70. ->disableOriginalConstructor()
  71. ->setMethods(['forward'])
  72. ->getMock();
  73. $resultForwardFactoryMock->expects($this->any())->method('create')->willReturn($this->resultForwardMock);
  74. $this->downloadMock = $this->getMockBuilder(\Magento\Sales\Model\Download::class)
  75. ->disableOriginalConstructor()
  76. ->setMethods(['downloadFile'])
  77. ->getMock();
  78. $this->serializerMock = $this->getMockBuilder(Json::class)
  79. ->disableOriginalConstructor()
  80. ->setMethods(['serialize', 'unserialize'])
  81. ->getMock();
  82. $requestMock = $this->getMockBuilder(\Magento\Framework\App\Request\Http::class)
  83. ->disableOriginalConstructor()
  84. ->setMethods(['getParam'])
  85. ->getMock();
  86. $requestMock->expects($this->any())->method('getParam')
  87. ->will(
  88. $this->returnValueMap(
  89. [
  90. ['id', null, self::OPTION_ID],
  91. ['key', null, self::SECRET_KEY],
  92. ]
  93. )
  94. );
  95. $this->itemOptionMock = $this->getMockBuilder(\Magento\Quote\Model\Quote\Item\Option::class)
  96. ->disableOriginalConstructor()
  97. ->setMethods(['load', 'getId', 'getCode', 'getProductId', 'getValue'])
  98. ->getMock();
  99. $this->productOptionMock = $this->getMockBuilder(\Magento\Catalog\Model\Product\Option::class)
  100. ->disableOriginalConstructor()
  101. ->setMethods(['load', 'getId', 'getProductId', 'getType'])
  102. ->getMock();
  103. $objectManagerMock = $this->getMockBuilder(\Magento\Sales\Model\Download::class)
  104. ->disableOriginalConstructor()
  105. ->setMethods(['create'])
  106. ->getMock();
  107. $objectManagerMock->expects($this->any())->method('create')
  108. ->will(
  109. $this->returnValueMap(
  110. [
  111. [\Magento\Quote\Model\Quote\Item\Option::class, $this->itemOptionMock],
  112. [\Magento\Catalog\Model\Product\Option::class, $this->productOptionMock],
  113. ]
  114. )
  115. );
  116. $contextMock = $this->getMockBuilder(\Magento\Backend\App\Action\Context::class)
  117. ->disableOriginalConstructor()
  118. ->setMethods(
  119. [
  120. 'getRequest',
  121. 'getObjectManager',
  122. ]
  123. )
  124. ->getMock();
  125. $contextMock->expects($this->once())->method('getObjectManager')->willReturn($objectManagerMock);
  126. $contextMock->expects($this->once())->method('getRequest')->willReturn($requestMock);
  127. $this->objectMock = $this->getMockBuilder(\Magento\Sales\Controller\Download\DownloadCustomOption::class)
  128. ->setMethods(['endExecute'])
  129. ->setConstructorArgs(
  130. [
  131. 'context' => $contextMock,
  132. 'resultForwardFactory' => $resultForwardFactoryMock,
  133. 'download' => $this->downloadMock,
  134. 'unserialize' => $this->createMock(Unserialize::class),
  135. 'serializer' => $this->serializerMock
  136. ]
  137. )
  138. ->getMock();
  139. }
  140. /**
  141. * @param array $itemOptionValues
  142. * @param array $productOptionValues
  143. * @param bool $noRouteOccurs
  144. * @dataProvider executeDataProvider
  145. */
  146. public function testExecute($itemOptionValues, $productOptionValues, $noRouteOccurs)
  147. {
  148. if (!empty($itemOptionValues)) {
  149. $this->itemOptionMock->expects($this->once())->method('load')->willReturnSelf();
  150. $this->itemOptionMock->expects($this->once())
  151. ->method('getId')
  152. ->willReturn($itemOptionValues[self::OPTION_ID]);
  153. $this->itemOptionMock->expects($this->any())
  154. ->method('getCode')
  155. ->willReturn($itemOptionValues[self::OPTION_CODE]);
  156. $this->itemOptionMock->expects($this->any())
  157. ->method('getProductId')
  158. ->willReturn($itemOptionValues[self::OPTION_PRODUCT_ID]);
  159. $this->itemOptionMock->expects($this->any())
  160. ->method('getValue')
  161. ->willReturn($itemOptionValues[self::OPTION_VALUE]);
  162. }
  163. if (!empty($productOptionValues)) {
  164. $this->productOptionMock->expects($this->once())->method('load')->willReturnSelf();
  165. $this->productOptionMock->expects($this->any())
  166. ->method('getId')
  167. ->willReturn($productOptionValues[self::OPTION_ID]);
  168. $this->productOptionMock->expects($this->any())
  169. ->method('getProductId')
  170. ->willReturn($productOptionValues[self::OPTION_PRODUCT_ID]);
  171. $this->productOptionMock->expects($this->any())
  172. ->method('getType')
  173. ->willReturn($productOptionValues[self::OPTION_TYPE]);
  174. }
  175. if ($noRouteOccurs) {
  176. $this->resultForwardMock->expects($this->once())->method('forward')->with('noroute')->willReturn(true);
  177. } else {
  178. $unserializeResult = [self::SECRET_KEY => self::SECRET_KEY];
  179. $this->serializerMock->expects($this->once())
  180. ->method('unserialize')
  181. ->with($itemOptionValues[self::OPTION_VALUE])
  182. ->willReturn($unserializeResult);
  183. $this->downloadMock->expects($this->once())
  184. ->method('downloadFile')
  185. ->with($unserializeResult)
  186. ->willReturn(true);
  187. $this->objectMock->expects($this->once())->method('endExecute')->willReturn(true);
  188. }
  189. $this->objectMock->execute();
  190. }
  191. /**
  192. * @return array
  193. */
  194. public function executeDataProvider()
  195. {
  196. return [
  197. [ //Good
  198. [
  199. self::OPTION_ID => self::OPTION_ID,
  200. self::OPTION_CODE => self::OPTION_CODE,
  201. self::OPTION_PRODUCT_ID => self::OPTION_PRODUCT_ID,
  202. self::OPTION_VALUE => self::OPTION_VALUE
  203. ],
  204. [
  205. self::OPTION_ID => self::OPTION_ID,
  206. self::OPTION_PRODUCT_ID => self::OPTION_PRODUCT_ID,
  207. self::OPTION_TYPE => self::OPTION_TYPE,
  208. ],
  209. false
  210. ],
  211. [ //No Option ID
  212. [
  213. self::OPTION_ID => false,
  214. self::OPTION_CODE => self::OPTION_CODE,
  215. self::OPTION_PRODUCT_ID => self::OPTION_PRODUCT_ID,
  216. self::OPTION_VALUE => self::OPTION_VALUE
  217. ],
  218. [],
  219. true
  220. ],
  221. [ //No Product Option
  222. [
  223. self::OPTION_ID => self::OPTION_ID,
  224. self::OPTION_CODE => self::OPTION_CODE,
  225. self::OPTION_PRODUCT_ID => self::OPTION_PRODUCT_ID,
  226. self::OPTION_VALUE => self::OPTION_VALUE
  227. ],
  228. [],
  229. true
  230. ],
  231. [ //No Product Option ID
  232. [
  233. self::OPTION_ID => self::OPTION_ID,
  234. self::OPTION_CODE => self::OPTION_CODE,
  235. self::OPTION_PRODUCT_ID => self::OPTION_PRODUCT_ID,
  236. self::OPTION_VALUE => self::OPTION_VALUE
  237. ],
  238. [
  239. self::OPTION_ID => null,
  240. self::OPTION_PRODUCT_ID => self::OPTION_PRODUCT_ID,
  241. self::OPTION_TYPE => self::OPTION_TYPE,
  242. ],
  243. true
  244. ],
  245. [ //Not Matching Product IDs in Inventory Option
  246. [
  247. self::OPTION_ID => self::OPTION_ID,
  248. self::OPTION_CODE => self::OPTION_CODE,
  249. self::OPTION_PRODUCT_ID => 'bad_test_product_ID',
  250. self::OPTION_VALUE => self::OPTION_VALUE
  251. ],
  252. [
  253. self::OPTION_ID => self::OPTION_ID,
  254. self::OPTION_PRODUCT_ID => self::OPTION_PRODUCT_ID,
  255. self::OPTION_TYPE => self::OPTION_TYPE,
  256. ],
  257. true
  258. ],
  259. [ //Not Matching Product IDs in Product Option
  260. [
  261. self::OPTION_ID => self::OPTION_ID,
  262. self::OPTION_CODE => self::OPTION_CODE,
  263. self::OPTION_PRODUCT_ID => self::OPTION_PRODUCT_ID,
  264. self::OPTION_VALUE => self::OPTION_VALUE
  265. ],
  266. [
  267. self::OPTION_ID => self::OPTION_ID,
  268. self::OPTION_PRODUCT_ID => 'bad_test_product_ID',
  269. self::OPTION_TYPE => self::OPTION_TYPE,
  270. ],
  271. true
  272. ],
  273. [ //Incorrect Option Type
  274. [
  275. self::OPTION_ID => self::OPTION_ID,
  276. self::OPTION_CODE => self::OPTION_CODE,
  277. self::OPTION_PRODUCT_ID => self::OPTION_PRODUCT_ID,
  278. self::OPTION_VALUE => self::OPTION_VALUE
  279. ],
  280. [
  281. self::OPTION_ID => self::OPTION_ID,
  282. self::OPTION_PRODUCT_ID => self::OPTION_PRODUCT_ID,
  283. self::OPTION_TYPE => 'bad_test_option_type',
  284. ],
  285. true
  286. ],
  287. ];
  288. }
  289. public function testExecuteBadSecretKey()
  290. {
  291. $this->itemOptionMock->expects($this->once())->method('load')->willReturnSelf();
  292. $this->itemOptionMock->expects($this->once())->method('getId')->willReturn(self::OPTION_ID);
  293. $this->itemOptionMock->expects($this->any())->method('getCode')->willReturn(self::OPTION_CODE);
  294. $this->itemOptionMock->expects($this->any())->method('getProductId')->willReturn(self::OPTION_PRODUCT_ID);
  295. $this->itemOptionMock->expects($this->any())->method('getValue')->willReturn(self::OPTION_VALUE);
  296. $this->productOptionMock->expects($this->once())->method('load')->willReturnSelf();
  297. $this->productOptionMock->expects($this->any())->method('getId')->willReturn(self::OPTION_ID);
  298. $this->productOptionMock->expects($this->any())->method('getProductId')->willReturn(self::OPTION_PRODUCT_ID);
  299. $this->productOptionMock->expects($this->any())->method('getType')->willReturn(self::OPTION_TYPE);
  300. $this->serializerMock->expects($this->once())
  301. ->method('unserialize')
  302. ->with(self::OPTION_VALUE)
  303. ->willReturn([self::SECRET_KEY => 'bad_test_secret_key']);
  304. $this->resultForwardMock->expects($this->once())->method('forward')->with('noroute')->willReturn(true);
  305. $this->objectMock->execute();
  306. }
  307. }