Skip to content

Commit 6c835b4

Browse files
committed
Merge remote-tracking branch 'magento-l3/ACP2E-2072' into AUG102023_PR_pradeep
2 parents 8c703f9 + e825bf0 commit 6c835b4

File tree

2 files changed

+306
-1
lines changed

2 files changed

+306
-1
lines changed

InventoryInStorePickupSales/Model/Order/IsFulfillable.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,12 @@ public function execute(OrderInterface $order): bool
7474
if ($item->getHasChildren()) {
7575
continue;
7676
}
77-
if (!$this->isItemFulfillable($item->getSku(), $sourceCode, (float)$item->getQtyOrdered())) {
77+
78+
$stockItem = $item->getProduct()->getExtensionAttributes()->getStockItem();
79+
if (!$stockItem->getManageStock()) {
80+
return $stockItem->getIsInStock() === (bool)SourceItemInterface::STATUS_IN_STOCK &&
81+
$this->sourceRepository->get($sourceCode)->isEnabled();
82+
} elseif (!$this->isItemFulfillable($item->getSku(), $sourceCode, (float)$item->getQtyOrdered())) {
7883
return false;
7984
}
8085
}
Lines changed: 300 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,300 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\InventoryInStorePickupSales\Test\Unit\Model\Order;
9+
10+
use Magento\Catalog\Model\Product;
11+
use Magento\Framework\Api\AbstractExtensibleObject;
12+
use Magento\Framework\Api\ExtensionAttributesInterface;
13+
use Magento\Framework\Api\SearchCriteria;
14+
use Magento\Framework\Api\SearchCriteriaBuilder;
15+
use Magento\Framework\Api\SearchCriteriaBuilderFactory;
16+
use Magento\InventoryApi\Api\Data\SourceInterface;
17+
use Magento\InventoryApi\Api\Data\SourceItemSearchResultsInterface;
18+
use Magento\InventoryApi\Api\SourceItemRepositoryInterface;
19+
use Magento\InventoryApi\Api\SourceRepositoryInterface;
20+
use Magento\InventoryInStorePickupSales\Model\Order\GetPickupLocationCode;
21+
use Magento\InventoryInStorePickupSales\Model\Order\IsFulfillable;
22+
use Magento\Sales\Api\Data\OrderInterface;
23+
use Magento\Sales\Model\Order\Item;
24+
use PHPUnit\Framework\MockObject\MockObject;
25+
use PHPUnit\Framework\TestCase;
26+
27+
/**
28+
*
29+
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
30+
*/
31+
class IsFulfillableTest extends TestCase
32+
{
33+
/**
34+
* @var IsFulfillable
35+
*/
36+
private $model;
37+
38+
/**
39+
* @var SourceItemRepositoryInterface|MockObject
40+
*/
41+
private $sourceItemRepository;
42+
43+
/**
44+
* @var SearchCriteriaBuilderFactory|MockObject
45+
*/
46+
private $searchCriteriaBuilderFactory;
47+
48+
/**
49+
* @var SourceRepositoryInterface|MockObject
50+
*/
51+
private $sourceRepository;
52+
53+
/**
54+
* @var GetPickupLocationCode|MockObject
55+
*/
56+
private $getPickupLocationCode;
57+
58+
/**
59+
* @var OrderInterface|MockObject
60+
*/
61+
private $orderMock;
62+
63+
/**
64+
* @var Item|MockObject
65+
*/
66+
private $itemMock;
67+
68+
/**
69+
* @var Product|MockObject
70+
*/
71+
private $productMock;
72+
73+
/**
74+
* @var ExtensionAttributesInterface|MockObject
75+
*/
76+
private $extensionAttributesMock;
77+
78+
/**
79+
* @var SourceInterface|MockObject
80+
*/
81+
private $sourceMock;
82+
83+
/**
84+
* @var Item|MockObject
85+
*/
86+
private $stockItemMock;
87+
88+
/**
89+
* @var SourceItemSearchResultsInterface|MockObject
90+
*/
91+
private $sourceItemSearchResultsInterface;
92+
93+
/**
94+
* @var AbstractExtensibleObject|MockObject
95+
*/
96+
private $abstractExtensibleObject;
97+
98+
/**
99+
* @var SearchCriteria|MockObject
100+
*/
101+
private $searchCriteriaMock;
102+
103+
/**
104+
* @var SearchCriteriaBuilder|MockObject
105+
*/
106+
private $searchCriteriaBuilderMock;
107+
108+
protected function setUp(): void
109+
{
110+
$this->sourceItemRepository = $this->getMockBuilder(SourceItemRepositoryInterface::class)
111+
->disableOriginalConstructor()
112+
->setMethods(['getList'])
113+
->getMock();
114+
115+
$this->sourceRepository = $this->getMockBuilder(SourceRepositoryInterface::class)
116+
->disableOriginalConstructor()
117+
->getMock();
118+
119+
$this->getPickupLocationCode = $this->getMockBuilder(GetPickupLocationCode::class)
120+
->disableOriginalConstructor()
121+
->getMock();
122+
123+
$this->orderMock = $this->getMockBuilder(OrderInterface::class)
124+
->disableOriginalConstructor()
125+
->getMock();
126+
127+
$this->itemMock = $this->getMockBuilder(Item::class)
128+
->disableOriginalConstructor()
129+
->setMethods(['getHasChildren', 'getQtyOrdered', 'getSku', 'getProduct'])
130+
->getMock();
131+
132+
$this->productMock = $this->getMockBuilder(Product::class)
133+
->disableOriginalConstructor()
134+
->getMock();
135+
136+
$this->extensionAttributesMock = $this->getMockBuilder(ExtensionAttributesInterface::class)
137+
->disableOriginalConstructor()
138+
->addMethods(['getStockItem'])
139+
->getMock();
140+
141+
$this->sourceMock = $this->getMockBuilder(SourceInterface::class)
142+
->disableOriginalConstructor()
143+
->getMock();
144+
145+
$this->stockItemMock = $this->getMockBuilder(\Magento\CatalogInventory\Model\Stock\Item::class)
146+
->disableOriginalConstructor()
147+
->setMethods(['getManageStock', 'getIsInStock'])
148+
->getMock();
149+
150+
$this->searchCriteriaBuilderFactory = $this
151+
->getMockBuilder(SearchCriteriaBuilderFactory::class)
152+
->disableOriginalConstructor()
153+
->setMethods(['create'])
154+
->getMock();
155+
156+
$this->sourceItemSearchResultsInterface = $this
157+
->getMockBuilder(SourceItemSearchResultsInterface::class)
158+
->disableOriginalConstructor()
159+
->getMock();
160+
161+
$this->abstractExtensibleObject = $this
162+
->getMockBuilder(AbstractExtensibleObject::class)
163+
->disableOriginalConstructor()
164+
->setMethods(['getQuantity', 'getStatus'])
165+
->getMock();
166+
167+
$this->searchCriteriaMock = $this
168+
->getMockBuilder(SearchCriteria::class)
169+
->disableOriginalConstructor()
170+
->getMock();
171+
172+
$this->searchCriteriaBuilderMock = $this
173+
->getMockBuilder(SearchCriteriaBuilder::class)
174+
->disableOriginalConstructor()
175+
->setMethods(['create', 'addFilter'])
176+
->getMock();
177+
178+
$this->model = new IsFulfillable(
179+
$this->sourceItemRepository,
180+
$this->searchCriteriaBuilderFactory,
181+
$this->sourceRepository,
182+
$this->getPickupLocationCode
183+
);
184+
}
185+
186+
/**
187+
* Test the execute method of IsFulfillable model.
188+
*
189+
* @dataProvider dataProvider
190+
* @param bool $manageStock
191+
* @param bool $inStock
192+
* @param float $qtyOrdered
193+
* @param float $quantity
194+
* @param bool $expectedResult
195+
* @return void
196+
*/
197+
public function testExecute(
198+
bool $manageStock,
199+
bool $inStock,
200+
float $qtyOrdered,
201+
float $quantity,
202+
bool $expectedResult
203+
): void {
204+
$this->getPickupLocationCode->expects($this->once())
205+
->method('execute')
206+
->with($this->orderMock)
207+
->willReturn('default');
208+
209+
$this->orderMock->expects($this->once())
210+
->method('getItems')
211+
->willReturn([$this->itemMock]);
212+
213+
$this->itemMock->expects($this->once())
214+
->method('getProduct')
215+
->willReturn($this->productMock);
216+
217+
$this->productMock->expects($this->once())
218+
->method('getExtensionAttributes')
219+
->willReturn($this->extensionAttributesMock);
220+
221+
$this->sourceRepository->expects($this->any())
222+
->method('get')
223+
->willReturn($this->sourceMock);
224+
225+
$this->stockItemMock->expects($this->once())
226+
->method('getManageStock')
227+
->willReturn($manageStock);
228+
229+
$this->stockItemMock->expects($this->any())
230+
->method('getIsInStock')
231+
->willReturn($inStock);
232+
233+
$this->extensionAttributesMock->expects($this->any())
234+
->method('getStockItem')
235+
->willReturn($this->stockItemMock);
236+
237+
$this->itemMock->expects($this->any())
238+
->method('getHasChildren')
239+
->willReturn(false);
240+
241+
$this->sourceMock->expects($this->any())
242+
->method('isEnabled')
243+
->willReturn(true);
244+
245+
$this->itemMock->expects($this->any())
246+
->method('getSku')
247+
->willReturn('SKU-1');
248+
249+
$this->itemMock->expects($this->any())
250+
->method('getQtyOrdered')
251+
->willReturn($qtyOrdered);
252+
253+
$this->searchCriteriaBuilderFactory
254+
->expects($this->any())
255+
->method('create')
256+
->willReturn($this->searchCriteriaBuilderMock);
257+
258+
$this->searchCriteriaBuilderMock->expects($this->any())
259+
->method('addFilter')
260+
->willReturn($this->searchCriteriaBuilderMock);
261+
262+
$this->searchCriteriaBuilderMock->expects($this->any())
263+
->method('create')
264+
->willReturn($this->searchCriteriaMock);
265+
266+
$this->sourceItemRepository->expects($this->any())
267+
->method('getList')
268+
->willReturn($this->sourceItemSearchResultsInterface);
269+
270+
$this->sourceItemSearchResultsInterface->expects($this->any())
271+
->method('getTotalCount')
272+
->willReturn(1);
273+
274+
$this->sourceItemSearchResultsInterface->expects($this->any())
275+
->method('getItems')
276+
->willReturn([$this->abstractExtensibleObject]);
277+
278+
$this->abstractExtensibleObject->expects($this->any())
279+
->method('getQuantity')
280+
->willReturn($quantity);
281+
282+
$this->abstractExtensibleObject->expects($this->any())
283+
->method('getStatus')
284+
->willReturn(1);
285+
286+
// Assertions to check the result.
287+
$this->assertEquals($expectedResult, $this->model->execute($this->orderMock));
288+
}
289+
290+
/**
291+
* @return array
292+
*/
293+
public function dataProvider(): array
294+
{
295+
return [
296+
[false, true, 1, 0, true],
297+
[false, false, 1, 0, false]
298+
];
299+
}
300+
}

0 commit comments

Comments
 (0)