|
26 | 26 | use Magento\Framework\DB\QueryBuilder;
|
27 | 27 | use Magento\Framework\DB\QueryBuilderFactory;
|
28 | 28 | use Magento\Framework\DB\QueryInterface;
|
| 29 | +use Magento\Framework\Exception\CouldNotSaveException; |
29 | 30 | use Magento\Framework\Stdlib\DateTime\DateTime;
|
30 | 31 | use Magento\Framework\Stdlib\DateTime\TimezoneInterface;
|
31 | 32 | use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
|
@@ -124,8 +125,10 @@ protected function setUp(): void
|
124 | 125 | 'getItemId',
|
125 | 126 | 'getProductId',
|
126 | 127 | 'setIsInStock',
|
| 128 | + 'getIsInStock', |
127 | 129 | 'setStockStatusChangedAutomaticallyFlag',
|
128 | 130 | 'getStockStatusChangedAutomaticallyFlag',
|
| 131 | + 'getStockStatusChangedAuto', |
129 | 132 | 'getManageStock',
|
130 | 133 | 'setLowStockDate',
|
131 | 134 | 'setStockStatusChangedAuto',
|
@@ -282,42 +285,72 @@ public function testDeleteByIdException()
|
282 | 285 | $this->assertTrue($this->model->deleteById($id));
|
283 | 286 | }
|
284 | 287 |
|
285 |
| - public function testSave() |
286 |
| - { |
| 288 | + /** |
| 289 | + * @param array $stockStateProviderMockConfig |
| 290 | + * @param array $stockItemMockConfig |
| 291 | + * @param array $existingStockItemMockConfig |
| 292 | + * @return void |
| 293 | + * @throws CouldNotSaveException |
| 294 | + * @dataProvider saveDataProvider |
| 295 | + */ |
| 296 | + public function testSave( |
| 297 | + array $stockStateProviderMockConfig, |
| 298 | + array $stockItemMockConfig, |
| 299 | + array $existingStockItemMockConfig |
| 300 | + ) { |
287 | 301 | $productId = 1;
|
288 |
| - |
289 |
| - $this->stockItemMock->expects($this->any())->method('getProductId')->willReturn($productId); |
290 |
| - $this->productMock->expects($this->once())->method('getId')->willReturn($productId); |
291 |
| - $this->productMock->expects($this->once())->method('getTypeId')->willReturn('typeId'); |
292 |
| - $this->stockConfigurationMock->expects($this->once())->method('isQty')->with('typeId')->willReturn(true); |
293 |
| - $this->stockStateProviderMock->expects($this->once()) |
294 |
| - ->method('verifyStock') |
295 |
| - ->with($this->stockItemMock) |
296 |
| - ->willReturn(false); |
297 |
| - $this->stockItemMock->expects($this->once())->method('getManageStock')->willReturn(true); |
298 |
| - $this->stockItemMock->expects($this->once())->method('setIsInStock')->with(false)->willReturnSelf(); |
299 |
| - $this->stockItemMock->expects($this->once()) |
300 |
| - ->method('setStockStatusChangedAutomaticallyFlag') |
301 |
| - ->with(true) |
302 |
| - ->willReturnSelf(); |
303 |
| - $this->stockItemMock->expects($this->any())->method('setLowStockDate')->willReturnSelf(); |
304 |
| - $this->stockStateProviderMock->expects($this->once()) |
305 |
| - ->method('verifyNotification') |
306 |
| - ->with($this->stockItemMock) |
| 302 | + $date = '2023-01-01 00:00:00'; |
| 303 | + $stockStateProviderMockConfig += [ |
| 304 | + 'verifyStock' => ['expects' => $this->once(), 'with' => [$this->stockItemMock], 'willReturn' => true,], |
| 305 | + 'verifyNotification' => [ |
| 306 | + 'expects' => $this->once(), |
| 307 | + 'with' => [$this->stockItemMock], |
| 308 | + 'willReturn' => true, |
| 309 | + ], |
| 310 | + ]; |
| 311 | + $existingStockItemMockConfig += [ |
| 312 | + 'getItemId' => ['expects' => $this->any(), 'willReturn' => 1,], |
| 313 | + 'getIsInStock' => ['expects' => $this->any(), 'willReturn' => false,], |
| 314 | + ]; |
| 315 | + $stockItemMockConfig += [ |
| 316 | + 'getItemId' => ['expects' => $this->any(), 'willReturn' => 1,], |
| 317 | + 'getManageStock' => ['expects' => $this->once(), 'willReturn' => true,], |
| 318 | + 'getIsInStock' => ['expects' => $this->any(), 'willReturn' => false,], |
| 319 | + 'getStockStatusChangedAuto' => ['expects' => $this->once(), 'willReturn' => 1,], |
| 320 | + 'getProductId' => ['expects' => $this->once(), 'willReturn' => $productId,], |
| 321 | + 'getWebsiteId' => ['expects' => $this->once(), 'willReturn' => 1,], |
| 322 | + 'getStockId' => ['expects' => $this->once(), 'willReturn' => 1,], |
| 323 | + 'setStockStatusChangedAuto' => ['expects' => $this->never(), 'with' => [1],], |
| 324 | + 'setIsInStock' => ['expects' => $this->once(), 'with' => [true],], |
| 325 | + 'setWebsiteId' => ['expects' => $this->once(), 'with' => [1], 'willReturnSelf' => true,], |
| 326 | + 'setStockId' => ['expects' => $this->once(), 'with' => [1], 'willReturnSelf' => true,], |
| 327 | + 'setLowStockDate' => [ |
| 328 | + 'expects' => $this->exactly(2), |
| 329 | + 'withConsecutive' => [[null], [$date],], |
| 330 | + 'willReturnSelf' => true, |
| 331 | + ], |
| 332 | + 'hasStockStatusChangedAutomaticallyFlag' => ['expects' => $this->once(), 'willReturn' => false,], |
| 333 | + |
| 334 | + ]; |
| 335 | + $existingStockItem = $this->createMock(Item::class); |
| 336 | + $this->stockItemFactoryMock->expects($this->any())->method('create')->willReturn($existingStockItem); |
| 337 | + $this->configMock($existingStockItem, $existingStockItemMockConfig); |
| 338 | + $this->configMock($this->stockItemMock, $stockItemMockConfig); |
| 339 | + $this->configMock($this->stockStateProviderMock, $stockStateProviderMockConfig); |
| 340 | + |
| 341 | + $this->productMock->expects($this->once()) |
| 342 | + ->method('getId') |
| 343 | + ->willReturn($productId); |
| 344 | + $this->productMock->expects($this->once()) |
| 345 | + ->method('getTypeId') |
| 346 | + ->willReturn('typeId'); |
| 347 | + $this->stockConfigurationMock->expects($this->once()) |
| 348 | + ->method('isQty') |
| 349 | + ->with('typeId') |
307 | 350 | ->willReturn(true);
|
308 | 351 | $this->dateTime->expects($this->once())
|
309 |
| - ->method('gmtDate'); |
310 |
| - $this->stockItemMock->expects($this->atLeastOnce())->method('setStockStatusChangedAuto')->willReturnSelf(); |
311 |
| - $this->stockItemMock->expects($this->once()) |
312 |
| - ->method('hasStockStatusChangedAutomaticallyFlag') |
313 |
| - ->willReturn(true); |
314 |
| - $this->stockItemMock->expects($this->once()) |
315 |
| - ->method('getStockStatusChangedAutomaticallyFlag') |
316 |
| - ->willReturn(true); |
317 |
| - $this->stockItemMock->expects($this->once())->method('getWebsiteId')->willReturn(1); |
318 |
| - $this->stockItemMock->expects($this->once())->method('setWebsiteId')->with(1)->willReturnSelf(); |
319 |
| - $this->stockItemMock->expects($this->once())->method('getStockId')->willReturn(1); |
320 |
| - $this->stockItemMock->expects($this->once())->method('setStockId')->with(1)->willReturnSelf(); |
| 352 | + ->method('gmtDate') |
| 353 | + ->willReturn($date); |
321 | 354 | $this->stockItemResourceMock->expects($this->once())
|
322 | 355 | ->method('save')
|
323 | 356 | ->with($this->stockItemMock)
|
@@ -385,4 +418,98 @@ public function testGetList()
|
385 | 418 |
|
386 | 419 | $this->assertEquals($queryCollectionMock, $this->model->getList($criteriaMock));
|
387 | 420 | }
|
| 421 | + |
| 422 | + /** |
| 423 | + * @return array |
| 424 | + */ |
| 425 | + public function saveDataProvider(): array |
| 426 | + { |
| 427 | + return [ |
| 428 | + 'should set isInStock=true if: verifyStock=true, isInStock=false, stockStatusChangedAuto=true' => [ |
| 429 | + 'stockStateProviderMockConfig' => [], |
| 430 | + 'stockItemMockConfig' => [], |
| 431 | + 'existingStockItemMockConfig' => [], |
| 432 | + ], |
| 433 | + 'should not set isInStock=true if: verifyStock=true, isInStock=false, stockStatusChangedAuto=false' => [ |
| 434 | + 'stockStateProviderMockConfig' => [], |
| 435 | + 'stockItemMockConfig' => [ |
| 436 | + 'setIsInStock' => ['expects' => $this->never(),], |
| 437 | + 'setStockStatusChangedAuto' => ['expects' => $this->never()], |
| 438 | + 'getStockStatusChangedAuto' => ['expects' => $this->once(), 'willReturn' => false,], |
| 439 | + ], |
| 440 | + 'existingStockItemMockConfig' => [], |
| 441 | + ], |
| 442 | + 'should set isInStock=false and stockStatusChangedAuto=true if: verifyStock=false and isInStock=true' => [ |
| 443 | + 'stockStateProviderMockConfig' => [ |
| 444 | + 'verifyStock' => ['expects' => $this->once(), 'willReturn' => false,], |
| 445 | + ], |
| 446 | + 'stockItemMockConfig' => [ |
| 447 | + 'getIsInStock' => ['expects' => $this->any(), 'willReturn' => true,], |
| 448 | + 'getStockStatusChangedAuto' => ['expects' => $this->never(),], |
| 449 | + 'setIsInStock' => ['expects' => $this->once(), 'with' => [false],], |
| 450 | + 'setStockStatusChangedAuto' => ['expects' => $this->once(), 'with' => [1],], |
| 451 | + ], |
| 452 | + 'existingStockItemMockConfig' => [], |
| 453 | + ], |
| 454 | + 'should set stockStatusChangedAuto=true if: verifyStock=false and isInStock=false' => [ |
| 455 | + 'stockStateProviderMockConfig' => [ |
| 456 | + 'verifyStock' => ['expects' => $this->once(), 'willReturn' => false,], |
| 457 | + ], |
| 458 | + 'stockItemMockConfig' => [ |
| 459 | + 'getIsInStock' => ['expects' => $this->any(), 'willReturn' => false,], |
| 460 | + 'getStockStatusChangedAuto' => ['expects' => $this->never(),], |
| 461 | + 'setIsInStock' => ['expects' => $this->never(),], |
| 462 | + 'setStockStatusChangedAuto' => ['expects' => $this->never(),], |
| 463 | + ], |
| 464 | + 'existingStockItemMockConfig' => [], |
| 465 | + ], |
| 466 | + 'should set stockStatusChangedAuto=true if: stockStatusChangedAutomaticallyFlag=true' => [ |
| 467 | + 'stockStateProviderMockConfig' => [], |
| 468 | + 'stockItemMockConfig' => [ |
| 469 | + 'getStockStatusChangedAuto' => ['expects' => $this->once(), 'willReturn' => false,], |
| 470 | + 'setIsInStock' => ['expects' => $this->never(),], |
| 471 | + 'setStockStatusChangedAuto' => ['expects' => $this->once(), 'with' => [1],], |
| 472 | + 'hasStockStatusChangedAutomaticallyFlag' => ['expects' => $this->once(), 'willReturn' => true,], |
| 473 | + 'getStockStatusChangedAutomaticallyFlag' => ['expects' => $this->once(), 'willReturn' => true,], |
| 474 | + ], |
| 475 | + 'existingStockItemMockConfig' => [ |
| 476 | + ], |
| 477 | + ], |
| 478 | + 'should set stockStatusChangedAuto=false if: getManageStock=false' => [ |
| 479 | + 'stockStateProviderMockConfig' => [], |
| 480 | + 'stockItemMockConfig' => [ |
| 481 | + 'getManageStock' => ['expects' => $this->once(), 'willReturn' => false], |
| 482 | + 'getStockStatusChangedAuto' => ['expects' => $this->never(), 'willReturn' => false,], |
| 483 | + 'setIsInStock' => ['expects' => $this->never(),], |
| 484 | + 'setStockStatusChangedAuto' => ['expects' => $this->once(), 'with' => [0],], |
| 485 | + ], |
| 486 | + 'existingStockItemMockConfig' => [ |
| 487 | + ], |
| 488 | + ] |
| 489 | + ]; |
| 490 | + } |
| 491 | + |
| 492 | + /** |
| 493 | + * @param MockObject $mockObject |
| 494 | + * @param array $configs |
| 495 | + * @return void |
| 496 | + */ |
| 497 | + private function configMock(MockObject $mockObject, array $configs): void |
| 498 | + { |
| 499 | + foreach ($configs as $method => $config) { |
| 500 | + $mockMethod = $mockObject->expects($config['expects'])->method($method); |
| 501 | + if (isset($config['with'])) { |
| 502 | + $mockMethod->with(...$config['with']); |
| 503 | + } |
| 504 | + if (isset($config['withConsecutive'])) { |
| 505 | + $mockMethod->withConsecutive(...$config['withConsecutive']); |
| 506 | + } |
| 507 | + if (isset($config['willReturnSelf'])) { |
| 508 | + $mockMethod->willReturnSelf(); |
| 509 | + } |
| 510 | + if (isset($config['willReturn'])) { |
| 511 | + $mockMethod->willReturn($config['willReturn']); |
| 512 | + } |
| 513 | + } |
| 514 | + } |
388 | 515 | }
|
0 commit comments