Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
DownloadCustomOptionTest.php
Go to the documentation of this file.
1 <?php
8 
11 
16 class DownloadCustomOptionTest extends \PHPUnit\Framework\TestCase
17 {
21  const OPTION_ID = '123456';
22 
26  const OPTION_CODE = 'option_123456';
27 
31  const OPTION_PRODUCT_ID = 'option_test_product_id';
32 
36  const OPTION_TYPE = 'file';
37 
41  const OPTION_VALUE = 'option_test_value';
42 
46  const SECRET_KEY = 'secret_key';
47 
51  protected $itemOptionMock;
52 
56  protected $productOptionMock;
57 
61  protected $serializerMock;
62 
66  protected $resultForwardMock;
67 
71  protected $downloadMock;
72 
76  protected $objectMock;
77 
78  protected function setUp()
79  {
80  $resultForwardFactoryMock = $this->getMockBuilder(\Magento\Framework\Controller\Result\ForwardFactory::class)
81  ->disableOriginalConstructor()
82  ->setMethods(['create'])
83  ->getMock();
84  $this->resultForwardMock = $this->getMockBuilder(\Magento\Framework\Controller\Result\Forward::class)
85  ->disableOriginalConstructor()
86  ->setMethods(['forward'])
87  ->getMock();
88  $resultForwardFactoryMock->expects($this->any())->method('create')->willReturn($this->resultForwardMock);
89 
90  $this->downloadMock = $this->getMockBuilder(\Magento\Sales\Model\Download::class)
91  ->disableOriginalConstructor()
92  ->setMethods(['downloadFile'])
93  ->getMock();
94 
95  $this->serializerMock = $this->getMockBuilder(Json::class)
96  ->disableOriginalConstructor()
97  ->setMethods(['serialize', 'unserialize'])
98  ->getMock();
99 
100  $requestMock = $this->getMockBuilder(\Magento\Framework\App\Request\Http::class)
101  ->disableOriginalConstructor()
102  ->setMethods(['getParam'])
103  ->getMock();
104  $requestMock->expects($this->any())->method('getParam')
105  ->will(
106  $this->returnValueMap(
107  [
108  ['id', null, self::OPTION_ID],
109  ['key', null, self::SECRET_KEY],
110  ]
111  )
112  );
113 
114  $this->itemOptionMock = $this->getMockBuilder(\Magento\Quote\Model\Quote\Item\Option::class)
115  ->disableOriginalConstructor()
116  ->setMethods(['load', 'getId', 'getCode', 'getProductId', 'getValue'])
117  ->getMock();
118 
119  $this->productOptionMock = $this->getMockBuilder(\Magento\Catalog\Model\Product\Option::class)
120  ->disableOriginalConstructor()
121  ->setMethods(['load', 'getId', 'getProductId', 'getType'])
122  ->getMock();
123 
124  $objectManagerMock = $this->getMockBuilder(\Magento\Sales\Model\Download::class)
125  ->disableOriginalConstructor()
126  ->setMethods(['create'])
127  ->getMock();
128  $objectManagerMock->expects($this->any())->method('create')
129  ->will(
130  $this->returnValueMap(
131  [
132  [\Magento\Quote\Model\Quote\Item\Option::class, $this->itemOptionMock],
133  [\Magento\Catalog\Model\Product\Option::class, $this->productOptionMock],
134  ]
135  )
136  );
137 
138  $contextMock = $this->getMockBuilder(\Magento\Backend\App\Action\Context::class)
139  ->disableOriginalConstructor()
140  ->setMethods(
141  [
142  'getRequest',
143  'getObjectManager',
144  ]
145  )
146  ->getMock();
147  $contextMock->expects($this->once())->method('getObjectManager')->willReturn($objectManagerMock);
148  $contextMock->expects($this->once())->method('getRequest')->willReturn($requestMock);
149 
150  $this->objectMock = $this->getMockBuilder(\Magento\Sales\Controller\Download\DownloadCustomOption::class)
151  ->setMethods(['endExecute'])
152  ->setConstructorArgs(
153  [
154  'context' => $contextMock,
155  'resultForwardFactory' => $resultForwardFactoryMock,
156  'download' => $this->downloadMock,
157  'unserialize' => $this->createMock(Unserialize::class),
158  'serializer' => $this->serializerMock
159  ]
160  )
161  ->getMock();
162  }
163 
170  public function testExecute($itemOptionValues, $productOptionValues, $noRouteOccurs)
171  {
172  if (!empty($itemOptionValues)) {
173  $this->itemOptionMock->expects($this->once())->method('load')->willReturnSelf();
174  $this->itemOptionMock->expects($this->once())
175  ->method('getId')
176  ->willReturn($itemOptionValues[self::OPTION_ID]);
177  $this->itemOptionMock->expects($this->any())
178  ->method('getCode')
179  ->willReturn($itemOptionValues[self::OPTION_CODE]);
180  $this->itemOptionMock->expects($this->any())
181  ->method('getProductId')
182  ->willReturn($itemOptionValues[self::OPTION_PRODUCT_ID]);
183  $this->itemOptionMock->expects($this->any())
184  ->method('getValue')
185  ->willReturn($itemOptionValues[self::OPTION_VALUE]);
186  }
187  if (!empty($productOptionValues)) {
188  $this->productOptionMock->expects($this->once())->method('load')->willReturnSelf();
189  $this->productOptionMock->expects($this->any())
190  ->method('getId')
191  ->willReturn($productOptionValues[self::OPTION_ID]);
192  $this->productOptionMock->expects($this->any())
193  ->method('getProductId')
194  ->willReturn($productOptionValues[self::OPTION_PRODUCT_ID]);
195  $this->productOptionMock->expects($this->any())
196  ->method('getType')
197  ->willReturn($productOptionValues[self::OPTION_TYPE]);
198  }
199  if ($noRouteOccurs) {
200  $this->resultForwardMock->expects($this->once())->method('forward')->with('noroute')->willReturn(true);
201  } else {
202  $unserializeResult = [self::SECRET_KEY => self::SECRET_KEY];
203 
204  $this->serializerMock->expects($this->once())
205  ->method('unserialize')
206  ->with($itemOptionValues[self::OPTION_VALUE])
207  ->willReturn($unserializeResult);
208 
209  $this->downloadMock->expects($this->once())
210  ->method('downloadFile')
211  ->with($unserializeResult)
212  ->willReturn(true);
213 
214  $this->objectMock->expects($this->once())->method('endExecute')->willReturn(true);
215  }
216  $this->objectMock->execute();
217  }
218 
222  public function executeDataProvider()
223  {
224  return [
225  [ //Good
226  [
227  self::OPTION_ID => self::OPTION_ID,
228  self::OPTION_CODE => self::OPTION_CODE,
229  self::OPTION_PRODUCT_ID => self::OPTION_PRODUCT_ID,
230  self::OPTION_VALUE => self::OPTION_VALUE
231  ],
232  [
233  self::OPTION_ID => self::OPTION_ID,
234  self::OPTION_PRODUCT_ID => self::OPTION_PRODUCT_ID,
235  self::OPTION_TYPE => self::OPTION_TYPE,
236  ],
237  false
238  ],
239  [ //No Option ID
240  [
241  self::OPTION_ID => false,
242  self::OPTION_CODE => self::OPTION_CODE,
243  self::OPTION_PRODUCT_ID => self::OPTION_PRODUCT_ID,
244  self::OPTION_VALUE => self::OPTION_VALUE
245  ],
246  [],
247  true
248  ],
249  [ //No Product Option
250  [
251  self::OPTION_ID => self::OPTION_ID,
252  self::OPTION_CODE => self::OPTION_CODE,
253  self::OPTION_PRODUCT_ID => self::OPTION_PRODUCT_ID,
254  self::OPTION_VALUE => self::OPTION_VALUE
255  ],
256  [],
257  true
258  ],
259  [ //No Product Option ID
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 => null,
268  self::OPTION_PRODUCT_ID => self::OPTION_PRODUCT_ID,
269  self::OPTION_TYPE => self::OPTION_TYPE,
270  ],
271  true
272  ],
273  [ //Not Matching Product IDs in Inventory Option
274  [
275  self::OPTION_ID => self::OPTION_ID,
276  self::OPTION_CODE => self::OPTION_CODE,
277  self::OPTION_PRODUCT_ID => 'bad_test_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 => self::OPTION_TYPE,
284  ],
285  true
286  ],
287  [ //Not Matching Product IDs in Product Option
288  [
289  self::OPTION_ID => self::OPTION_ID,
290  self::OPTION_CODE => self::OPTION_CODE,
291  self::OPTION_PRODUCT_ID => self::OPTION_PRODUCT_ID,
292  self::OPTION_VALUE => self::OPTION_VALUE
293  ],
294  [
295  self::OPTION_ID => self::OPTION_ID,
296  self::OPTION_PRODUCT_ID => 'bad_test_product_ID',
297  self::OPTION_TYPE => self::OPTION_TYPE,
298  ],
299  true
300  ],
301  [ //Incorrect Option Type
302  [
303  self::OPTION_ID => self::OPTION_ID,
304  self::OPTION_CODE => self::OPTION_CODE,
305  self::OPTION_PRODUCT_ID => self::OPTION_PRODUCT_ID,
306  self::OPTION_VALUE => self::OPTION_VALUE
307  ],
308  [
309  self::OPTION_ID => self::OPTION_ID,
310  self::OPTION_PRODUCT_ID => self::OPTION_PRODUCT_ID,
311  self::OPTION_TYPE => 'bad_test_option_type',
312  ],
313  true
314  ],
315  ];
316  }
317 
318  public function testExecuteBadSecretKey()
319  {
320  $this->itemOptionMock->expects($this->once())->method('load')->willReturnSelf();
321  $this->itemOptionMock->expects($this->once())->method('getId')->willReturn(self::OPTION_ID);
322  $this->itemOptionMock->expects($this->any())->method('getCode')->willReturn(self::OPTION_CODE);
323  $this->itemOptionMock->expects($this->any())->method('getProductId')->willReturn(self::OPTION_PRODUCT_ID);
324  $this->itemOptionMock->expects($this->any())->method('getValue')->willReturn(self::OPTION_VALUE);
325 
326  $this->productOptionMock->expects($this->once())->method('load')->willReturnSelf();
327  $this->productOptionMock->expects($this->any())->method('getId')->willReturn(self::OPTION_ID);
328  $this->productOptionMock->expects($this->any())->method('getProductId')->willReturn(self::OPTION_PRODUCT_ID);
329  $this->productOptionMock->expects($this->any())->method('getType')->willReturn(self::OPTION_TYPE);
330 
331  $this->serializerMock->expects($this->once())
332  ->method('unserialize')
333  ->with(self::OPTION_VALUE)
334  ->willReturn([self::SECRET_KEY => 'bad_test_secret_key']);
335 
336  $this->resultForwardMock->expects($this->once())->method('forward')->with('noroute')->willReturn(true);
337 
338  $this->objectMock->execute();
339  }
340 }
return false
Definition: gallery.phtml:36
testExecute($itemOptionValues, $productOptionValues, $noRouteOccurs)