Skip to content

Commit 46e21b2

Browse files
committed
MC-17518: Cart Rest API not showing all shipping assignments for multi-shipping
1 parent b4f8046 commit 46e21b2

File tree

8 files changed

+154
-61
lines changed

8 files changed

+154
-61
lines changed

app/code/Magento/Multishipping/Controller/Checkout/Plugin.php renamed to app/code/Magento/Multishipping/Plugin/DisableMultishippingMode.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55
*/
66
declare(strict_types=1);
77

8-
namespace Magento\Multishipping\Controller\Checkout;
8+
namespace Magento\Multishipping\Plugin;
99

1010
use Magento\Checkout\Model\Cart;
1111
use Magento\Framework\App\Action\Action;
1212

1313
/**
1414
* Turns Off Multishipping mode for Quote.
1515
*/
16-
class Plugin
16+
class DisableMultishippingMode
1717
{
1818
/**
1919
* @var Cart

app/code/Magento/Multishipping/Plugin/MultishippingQuoteRepositoryPlugin.php renamed to app/code/Magento/Multishipping/Plugin/MultishippingQuoteRepository.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
use Magento\Quote\Model\ShippingAssignmentFactory;
1616

1717
/**
18-
* Plugin for multishipping quote processing in WebAPI.
18+
* Plugin for multishipping quote processing.
1919
*/
20-
class MultishippingQuoteRepositoryPlugin
20+
class MultishippingQuoteRepository
2121
{
2222
/**
2323
* @var ShippingAssignmentFactory

app/code/Magento/Multishipping/Plugin/ResetShippingAssigmentPlugin.php renamed to app/code/Magento/Multishipping/Plugin/ResetShippingAssigment.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
/**
1414
* Resets quote shipping assignments when item is removed from multishipping quote.
1515
*/
16-
class ResetShippingAssigmentPlugin
16+
class ResetShippingAssigment
1717
{
1818
/**
1919
* @var ShippingAssignmentProcessor

app/code/Magento/Multishipping/Test/Unit/Controller/Checkout/PluginTest.php renamed to app/code/Magento/Multishipping/Test/Unit/Plugin/DisableMultishippingModeTest.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@
1010

1111
use Magento\Checkout\Controller\Index\Index;
1212
use Magento\Checkout\Model\Cart;
13-
use Magento\Multishipping\Controller\Checkout\Plugin;
13+
use Magento\Multishipping\Plugin\DisableMultishippingMode;
1414
use Magento\Quote\Api\Data\CartExtensionInterface;
1515
use Magento\Quote\Api\Data\ShippingAssignmentInterface;
1616
use Magento\Quote\Model\Quote;
1717

1818
/**
19-
* Class PluginTest
19+
* Class DisableMultishippingModeTest
2020
*/
21-
class PluginTest extends \PHPUnit\Framework\TestCase
21+
class DisableMultishippingModeTest extends \PHPUnit\Framework\TestCase
2222
{
2323
/**
2424
* @var \PHPUnit_Framework_MockObject_MockObject
@@ -31,7 +31,7 @@ class PluginTest extends \PHPUnit\Framework\TestCase
3131
private $quoteMock;
3232

3333
/**
34-
* @var Plugin
34+
* @var DisableMultishippingMode
3535
*/
3636
private $object;
3737

@@ -48,7 +48,7 @@ protected function setUp()
4848
$this->cartMock->expects($this->once())
4949
->method('getQuote')
5050
->will($this->returnValue($this->quoteMock));
51-
$this->object = new \Magento\Multishipping\Controller\Checkout\Plugin($this->cartMock);
51+
$this->object = new DisableMultishippingMode($this->cartMock);
5252
}
5353

5454
/**

app/code/Magento/Multishipping/etc/di.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@
1010
<plugin name="multishipping_shipping_addresses" type="Magento\Multishipping\Model\Cart\CartTotalRepositoryPlugin" />
1111
</type>
1212
<type name="Magento\Quote\Model\QuoteRepository">
13-
<plugin name="multishipping_quote_repository" type="Magento\Multishipping\Plugin\MultishippingQuoteRepositoryPlugin" />
13+
<plugin name="multishipping_quote_repository" type="Magento\Multishipping\Plugin\MultishippingQuoteRepository" />
1414
</type>
1515
</config>

app/code/Magento/Multishipping/etc/frontend/di.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,13 @@
3131
</arguments>
3232
</type>
3333
<type name="Magento\Checkout\Controller\Cart\Add">
34-
<plugin name="multishipping_disabler" type="Magento\Multishipping\Controller\Checkout\Plugin" sortOrder="50" />
34+
<plugin name="multishipping_disabler" type="Magento\Multishipping\Plugin\DisableMultishippingMode" sortOrder="50" />
3535
</type>
3636
<type name="Magento\Checkout\Controller\Cart\UpdatePost">
37-
<plugin name="multishipping_disabler" type="Magento\Multishipping\Controller\Checkout\Plugin" sortOrder="50" />
37+
<plugin name="multishipping_disabler" type="Magento\Multishipping\Plugin\DisableMultishippingMode" sortOrder="50" />
3838
</type>
3939
<type name="Magento\Checkout\Controller\Index\Index">
40-
<plugin name="multishipping_disabler" type="Magento\Multishipping\Controller\Checkout\Plugin" sortOrder="50" />
40+
<plugin name="multishipping_disabler" type="Magento\Multishipping\Plugin\DisableMultishippingMode" sortOrder="50" />
4141
</type>
4242
<type name="Magento\Checkout\Model\Cart">
4343
<plugin name="multishipping_session_mapper" type="Magento\Multishipping\Model\Checkout\Type\Multishipping\Plugin" sortOrder="50" />
@@ -46,6 +46,6 @@
4646
<plugin name="multishipping_clear_addresses" type="Magento\Multishipping\Model\Cart\Controller\CartPlugin" sortOrder="50" />
4747
</type>
4848
<type name="Magento\Quote\Model\Quote">
49-
<plugin name="multishipping_reset_shipping_assigment" type="Magento\Multishipping\Plugin\ResetShippingAssigmentPlugin"/>
49+
<plugin name="multishipping_reset_shipping_assigment" type="Magento\Multishipping\Plugin\ResetShippingAssigment"/>
5050
</type>
5151
</config>
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
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\Multishipping\Api;
9+
10+
use Magento\Framework\Api\FilterBuilder;
11+
use Magento\Framework\Api\SearchCriteriaBuilder;
12+
use Magento\Framework\Api\SortOrderBuilder;
13+
use Magento\Quote\Api\CartRepositoryInterface;
14+
use Magento\Quote\Model\Quote;
15+
use Magento\TestFramework\Helper\Bootstrap;
16+
use Magento\TestFramework\ObjectManager;
17+
use Magento\TestFramework\TestCase\WebapiAbstract;
18+
19+
/**
20+
* Tests web-api for multishipping quote.
21+
*/
22+
class CartRepositoryTest extends WebapiAbstract
23+
{
24+
/**
25+
* @var ObjectManager
26+
*/
27+
private $objectManager;
28+
29+
/**
30+
* @var SearchCriteriaBuilder
31+
*/
32+
private $searchCriteriaBuilder;
33+
34+
/**
35+
* @var SortOrderBuilder
36+
*/
37+
private $sortOrderBuilder;
38+
39+
/**
40+
* @var FilterBuilder
41+
*/
42+
private $filterBuilder;
43+
44+
/**
45+
* @inheritdoc
46+
*/
47+
protected function setUp()
48+
{
49+
$this->objectManager = Bootstrap::getObjectManager();
50+
$this->filterBuilder = $this->objectManager->create(FilterBuilder::class);
51+
$this->sortOrderBuilder = $this->objectManager->create(SortOrderBuilder::class);
52+
$this->searchCriteriaBuilder = $this->objectManager->create(SearchCriteriaBuilder::class);
53+
}
54+
55+
/**
56+
* @inheritdoc
57+
*/
58+
protected function tearDown()
59+
{
60+
try {
61+
/** @var CartRepositoryInterface $quoteRepository */
62+
$quoteRepository = $this->objectManager->get(CartRepositoryInterface::class);
63+
$cart = $this->getCart('multishipping_quote_id');
64+
$quoteRepository->delete($cart);
65+
} catch (\InvalidArgumentException $e) {
66+
// Do nothing if cart fixture was not used
67+
}
68+
parent::tearDown();
69+
}
70+
71+
/**
72+
* Tests that multishipping quote contains all addresses in shipping assignments.
73+
*
74+
* @magentoApiDataFixture Magento/Multishipping/Fixtures/quote_with_split_items.php
75+
*/
76+
public function testGetMultishippingCart()
77+
{
78+
$cart = $this->getCart('multishipping_quote_id');
79+
$cartId = $cart->getId();
80+
81+
$serviceInfo = [
82+
'rest' => [
83+
'resourcePath' => '/V1/carts/' . $cartId,
84+
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
85+
],
86+
'soap' => [
87+
'service' => 'quoteCartRepositoryV1',
88+
'serviceVersion' => 'V1',
89+
'operation' => 'quoteCartRepositoryV1Get',
90+
],
91+
];
92+
93+
$requestData = ['cartId' => $cartId];
94+
$cartData = $this->_webApiCall($serviceInfo, $requestData);
95+
96+
$shippingAssignments = $cart->getExtensionAttributes()->getShippingAssignments();
97+
foreach ($shippingAssignments as $key => $shippingAssignment) {
98+
$address = $shippingAssignment->getShipping()->getAddress();
99+
$cartItem = $shippingAssignment->getItems()[0];
100+
$this->assertEquals(
101+
$address->getId(),
102+
$cartData['extension_attributes']['shipping_assignments'][$key]['shipping']['address']['id']
103+
);
104+
$this->assertEquals(
105+
$cartItem->getSku(),
106+
$cartData['extension_attributes']['shipping_assignments'][$key]['items'][0]['sku']
107+
);
108+
$this->assertEquals(
109+
$cartItem->getQty(),
110+
$cartData['extension_attributes']['shipping_assignments'][$key]['items'][0]['qty']
111+
);
112+
}
113+
}
114+
115+
/**
116+
* Retrieve quote by given reserved order ID
117+
*
118+
* @param string $reservedOrderId
119+
* @return Quote
120+
* @throws \InvalidArgumentException
121+
*/
122+
private function getCart(string $reservedOrderId): Quote
123+
{
124+
/** @var SearchCriteriaBuilder $searchCriteriaBuilder */
125+
$searchCriteriaBuilder = $this->objectManager->get(SearchCriteriaBuilder::class);
126+
$searchCriteria = $searchCriteriaBuilder->addFilter('reserved_order_id', $reservedOrderId)
127+
->create();
128+
129+
/** @var CartRepositoryInterface $quoteRepository */
130+
$quoteRepository = $this->objectManager->get(CartRepositoryInterface::class);
131+
$items = $quoteRepository->getList($searchCriteria)->getItems();
132+
133+
if (empty($items)) {
134+
throw new \InvalidArgumentException('There is no quote with provided reserved order ID.');
135+
}
136+
137+
return array_pop($items);
138+
}
139+
}

dev/tests/api-functional/testsuite/Magento/Quote/Api/CartRepositoryTest.php

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,6 @@ protected function tearDown()
6666
$quoteRepository = $this->objectManager->get(CartRepositoryInterface::class);
6767
$cart = $this->getCart('test01');
6868
$quoteRepository->delete($cart);
69-
$cart = $this->getCart('multishipping_quote_id');
70-
$quoteRepository->delete($cart);
7169
} catch (\InvalidArgumentException $e) {
7270
// Do nothing if cart fixture was not used
7371
}
@@ -145,50 +143,6 @@ public function testGetCart()
145143
$this->assertEquals($cart->getStoreToQuoteRate(), $cartData['currency']['store_to_quote_rate']);
146144
}
147145

148-
/**
149-
* Tests that multishipping quote contains all addresses in shipping assignments.
150-
*
151-
* @magentoApiDataFixture Magento/Multishipping/Fixtures/quote_with_split_items.php
152-
*/
153-
public function testGetMultishippingCart()
154-
{
155-
$cart = $this->getCart('multishipping_quote_id');
156-
$cartId = $cart->getId();
157-
158-
$serviceInfo = [
159-
'rest' => [
160-
'resourcePath' => '/V1/carts/' . $cartId,
161-
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
162-
],
163-
'soap' => [
164-
'service' => 'quoteCartRepositoryV1',
165-
'serviceVersion' => 'V1',
166-
'operation' => 'quoteCartRepositoryV1Get',
167-
],
168-
];
169-
170-
$requestData = ['cartId' => $cartId];
171-
$cartData = $this->_webApiCall($serviceInfo, $requestData);
172-
173-
$shippingAssignments = $cart->getExtensionAttributes()->getShippingAssignments();
174-
foreach ($shippingAssignments as $key => $shippingAssignment) {
175-
$address = $shippingAssignment->getShipping()->getAddress();
176-
$cartItem = $shippingAssignment->getItems()[0];
177-
$this->assertEquals(
178-
$address->getId(),
179-
$cartData['extension_attributes']['shipping_assignments'][$key]['shipping']['address']['id']
180-
);
181-
$this->assertEquals(
182-
$cartItem->getSku(),
183-
$cartData['extension_attributes']['shipping_assignments'][$key]['items'][0]['sku']
184-
);
185-
$this->assertEquals(
186-
$cartItem->getQty(),
187-
$cartData['extension_attributes']['shipping_assignments'][$key]['items'][0]['qty']
188-
);
189-
}
190-
}
191-
192146
/**
193147
* Tests exception when cartId is not provided.
194148
*

0 commit comments

Comments
 (0)