Skip to content

Commit be831ac

Browse files
committed
ACP2E-1650:Create Shipment API
- addressed build failures
1 parent 80c2e62 commit be831ac

File tree

3 files changed

+75
-35
lines changed

3 files changed

+75
-35
lines changed

app/code/Magento/Bundle/Model/Sales/Order/BundleOrderTypeValidator.php

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,35 @@
99

1010
use Magento\Bundle\Model\Sales\Order\Shipment\BundleShipmentTypeValidator;
1111
use \Laminas\Validator\ValidatorInterface;
12+
use Magento\Framework\Phrase;
13+
use Magento\Framework\Webapi\Request;
1214
use Magento\Sales\Model\Order\Shipment;
1315

1416
/**
1517
* Validate if requested order items can be shipped according to bundle product shipment type
1618
*/
1719
class BundleOrderTypeValidator extends BundleShipmentTypeValidator implements ValidatorInterface
1820
{
19-
private const SHIPMENT_API_ROUTE = '/v1/shipment/';
21+
private const SHIPMENT_API_ROUTE = 'v1/shipment';
2022

2123
/**
2224
* @var array
2325
*/
2426
private array $messages = [];
2527

28+
/**
29+
* @var Request
30+
*/
31+
private Request $request;
32+
33+
/**
34+
* @param Request $request
35+
*/
36+
public function __construct(Request $request)
37+
{
38+
$this->request = $request;
39+
}
40+
2641
/**
2742
* Validates shipment items based on order item properties
2843
*
@@ -40,8 +55,8 @@ public function isValid($value): bool
4055
foreach ($value->getOrder()->getAllItems() as $orderItem) {
4156
foreach ($value->getItems() as $shipmentItem) {
4257
if ($orderItem->getItemId() == $shipmentItem->getOrderItemId()) {
43-
if ($result = $this->validate($orderItem)) {
44-
$this->messages[] = $result;
58+
if ($validationMessages = $this->validate($orderItem)) {
59+
$this->renderValidationMessages($validationMessages);
4560
}
4661
}
4762
}
@@ -61,12 +76,27 @@ public function getMessages(): array
6176
}
6277

6378
/**
79+
* Determines if the validation should be triggered or not
80+
*
6481
* @return bool
6582
*/
6683
private function canValidate(): bool
6784
{
68-
$request = \Magento\Framework\App\ObjectManager::getInstance()->get(\Magento\Framework\Webapi\Request::class);
85+
return str_contains(strtolower($this->request->getUri()->getPath()), self::SHIPMENT_API_ROUTE);
86+
}
6987

70-
return str_contains(strtolower($request->getUri()->getPath()), self::SHIPMENT_API_ROUTE);
88+
/**
89+
* Creates text based validation messages
90+
*
91+
* @param array $validationMessages
92+
* @return void
93+
*/
94+
private function renderValidationMessages(array $validationMessages): void
95+
{
96+
foreach ($validationMessages as $message) {
97+
if ($message instanceof Phrase) {
98+
$this->messages[] = $message->render();
99+
}
100+
}
71101
}
72102
}

app/code/Magento/Bundle/Test/Unit/Model/Sales/Order/BundleOrderTypeValidatorTest.php

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@
77

88
namespace Magento\Bundle\Test\Unit\Model\Sales\Order;
99

10+
use Laminas\Uri\Http as HttpUri;
1011
use Magento\Bundle\Model\Sales\Order\BundleOrderTypeValidator;
11-
use Magento\Framework\Phrase;
12+
use Magento\Framework\Webapi\Request;
1213
use Magento\Sales\Api\Data\OrderItemInterface;
1314
use Magento\Sales\Model\Order\Shipment;
1415
use PHPUnit\Framework\MockObject\MockObject;
@@ -17,6 +18,31 @@
1718

1819
class BundleOrderTypeValidatorTest extends TestCase
1920
{
21+
/**
22+
* @var Request|Request&MockObject|MockObject
23+
*/
24+
private Request $request;
25+
26+
/**
27+
* @var BundleOrderTypeValidator
28+
*/
29+
private BundleOrderTypeValidator $validator;
30+
31+
/**
32+
* @return void
33+
*/
34+
protected function setUp(): void
35+
{
36+
$this->request = $this->createMock(Request::class);
37+
$uri = $this->createMock(HttpUri::class);
38+
$uri->expects($this->any())->method('getPath')->willReturn('V1/shipment/');
39+
$this->request->expects($this->any())->method('getUri')->willReturn($uri);
40+
41+
$this->validator = new BundleOrderTypeValidator($this->request);
42+
43+
parent::setUp();
44+
}
45+
2046
/**
2147
* @return void
2248
*/
@@ -56,9 +82,8 @@ public function testIsValidSuccess(): void
5682
$shipment->expects($this->once())->method('getOrder')->willReturn($order);
5783

5884
try {
59-
$validator = new BundleOrderTypeValidator();
60-
$validator->isValid($shipment);
61-
$this->assertEmpty($validator->getMessages());
85+
$this->validator->isValid($shipment);
86+
$this->assertEmpty($this->validator->getMessages());
6287
} catch (\Exception $e) {
6388
$this->fail('Could not perform shipment validation. ' . $e->getMessage());
6489
}
@@ -91,19 +116,11 @@ public function testIsValidFailSeparateShipmentType(): void
91116
$shipment->expects($this->once())->method('getOrder')->willReturn($order);
92117

93118
try {
94-
$validator = new BundleOrderTypeValidator();
95-
$validator->isValid($shipment);
96-
$messages = $validator->getMessages();
119+
$this->validator->isValid($shipment);
120+
$messages = $this->validator->getMessages();
97121
$this->assertNotEmpty($messages);
98-
/** @var Phrase $validationMsg */
99-
$validationMsg = current($messages)[0];
100-
foreach ($validationMsg->getArguments() as $argument) {
101-
if (is_string($argument)) {
102-
$this->assertSame($argument, 'bundleSKU');
103-
} else {
104-
$this->assertTrue(in_array($argument->getText(), ['Separately', 'Bundle product options']));
105-
}
106-
}
122+
$this->assertStringContainsString("bundleSKU", current($messages));
123+
$this->assertStringContainsString("Separately", current($messages));
107124
} catch (\Exception $e) {
108125
$this->fail('Could not perform shipment validation. ' . $e->getMessage());
109126
}
@@ -140,19 +157,11 @@ public function testIsValidFailTogetherShipmentType(): void
140157
$shipment->expects($this->once())->method('getOrder')->willReturn($order);
141158

142159
try {
143-
$validator = new BundleOrderTypeValidator();
144-
$validator->isValid($shipment);
145-
$messages = $validator->getMessages();
160+
$this->validator->isValid($shipment);
161+
$messages = $this->validator->getMessages();
146162
$this->assertNotEmpty($messages);
147-
/** @var Phrase $validationMsg */
148-
$validationMsg = current($messages)[0];
149-
foreach ($validationMsg->getArguments() as $argument) {
150-
if (is_string($argument)) {
151-
$this->assertSame($argument, 'bundleSKU');
152-
} else {
153-
$this->assertTrue(in_array($argument->getText(), ['Together', 'Bundle product itself']));
154-
}
155-
}
163+
$this->assertStringContainsString("bundleSKU", current($messages));
164+
$this->assertStringContainsString("Together", current($messages));
156165
} catch (\Exception $e) {
157166
$this->fail('Could not perform shipment validation. ' . $e->getMessage());
158167
}

app/code/Magento/Sales/Model/Order/Shipment/Item.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -393,16 +393,17 @@ private function loadChildren(): void
393393
$collection = $this->_orderItem->getOrder()->getItemsCollection();
394394
$collection->filterByParent($this->_orderItem->getItemId());
395395

396+
$hasChildrenFlag = false;
396397
if ($collection->count()) {
397-
$this->_orderItem->setData('has_children', true);
398-
399398
/** @var \Magento\Sales\Model\Order\Item $childItem */
400399
foreach ($collection as $childItem) {
401400
if ($childItem->getItemId() != $this->_orderItem->getItemId()) {
402401
$this->_orderItem->addChildItem($childItem);
402+
$hasChildrenFlag = true;
403403
}
404404
}
405405
}
406+
$this->_orderItem->setData('has_children', $hasChildrenFlag);
406407
}
407408
}
408409
}

0 commit comments

Comments
 (0)