Skip to content

Commit aec7157

Browse files
MAGETWO-70885: The 'incrementId' property of the order with state 'complete' is increased after order status update
- Add webapi tests for checking increment_id after shipment, invoice and creditmemo.
1 parent ef6748b commit aec7157

File tree

4 files changed

+299
-11
lines changed

4 files changed

+299
-11
lines changed

app/code/Magento/Sales/Model/OrderRepository.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
declare(strict_types=1);
67

78
namespace Magento\Sales\Model;
89

app/code/Magento/Sales/Model/ResourceModel/EntityAbstract.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
declare(strict_types=1);
7+
68
namespace Magento\Sales\Model\ResourceModel;
79

810
use Magento\Framework\Model\ResourceModel\Db\VersionControl\AbstractDb;

app/code/Magento/Sales/Test/Unit/Model/ResourceModel/OrderTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
declare(strict_types=1);
7+
68
namespace Magento\Sales\Test\Unit\Model\ResourceModel;
79

810
use Magento\Framework\Model\ResourceModel\Db\VersionControl\RelationComposite;

dev/tests/api-functional/testsuite/Magento/Sales/Service/V1/OrderUpdateTest.php

Lines changed: 294 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
declare(strict_types=1);
7+
68
namespace Magento\Sales\Service\V1;
79

10+
use Magento\Sales\Model\Order;
811
use Magento\TestFramework\TestCase\WebapiAbstract;
912
use Magento\Sales\Api\Data\OrderInterface;
1013

@@ -13,18 +16,18 @@
1316
*/
1417
class OrderUpdateTest extends WebapiAbstract
1518
{
16-
const RESOURCE_PATH = '/V1/orders';
19+
private const RESOURCE_PATH = '/V1/orders';
1720

18-
const SERVICE_NAME = 'salesOrderRepositoryV1';
21+
private const SERVICE_NAME = 'salesOrderRepositoryV1';
1922

20-
const SERVICE_VERSION = 'V1';
23+
private const SERVICE_VERSION = 'V1';
2124

22-
const ORDER_INCREMENT_ID = '100000001';
25+
private const ORDER_INCREMENT_ID = '100000001';
2326

2427
/**
2528
* @var \Magento\Framework\ObjectManagerInterface
2629
*/
27-
protected $objectManager;
30+
private $objectManager;
2831

2932
/**
3033
* @inheritDoc
@@ -41,11 +44,104 @@ protected function setUp()
4144
*/
4245
public function testOrderUpdate()
4346
{
44-
/** @var \Magento\Sales\Model\Order $order */
45-
$order = $this->objectManager->get(\Magento\Sales\Model\Order::class)
47+
/** @var Order $order */
48+
$order = $this->objectManager->get(Order::class)->loadByIncrementId(self::ORDER_INCREMENT_ID);
49+
$serviceInfo = [
50+
'rest' => [
51+
'resourcePath' => self::RESOURCE_PATH,
52+
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
53+
],
54+
'soap' => [
55+
'service' => self::SERVICE_NAME,
56+
'serviceVersion' => self::SERVICE_VERSION,
57+
'operation' => self::SERVICE_NAME . 'save',
58+
],
59+
];
60+
$result = $this->_webApiCall($serviceInfo, ['entity' => $this->getOrderData($order)]);
61+
$this->assertGreaterThan(1, count($result));
62+
/** @var Order $actualOrder */
63+
$actualOrder = $this->objectManager->get(Order::class)->load($order->getId());
64+
$this->assertEquals(
65+
$order->getData(OrderInterface::INCREMENT_ID),
66+
$actualOrder->getData(OrderInterface::INCREMENT_ID)
67+
);
68+
69+
//Ship the order and check increment id.
70+
$serviceInfo = [
71+
'rest' => [
72+
'resourcePath' => '/V1/order/' . $order->getId() . '/ship',
73+
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
74+
],
75+
'soap' => [
76+
'service' => 'salesShipOrderV1',
77+
'serviceVersion' => self::SERVICE_VERSION,
78+
'operation' => 'salesShipOrderV1' . 'execute',
79+
],
80+
];
81+
$shipmentId = $this->_webApiCall($serviceInfo, $this->getDataForShipment($order));
82+
$this->assertNotEmpty($shipmentId);
83+
$actualOrder = $this->objectManager->get(Order::class)->load($order->getId());
84+
$this->assertEquals(
85+
$order->getData(OrderInterface::INCREMENT_ID),
86+
$actualOrder->getData(OrderInterface::INCREMENT_ID)
87+
);
88+
89+
//Invoice the order and check increment id.
90+
$serviceInfo = [
91+
'rest' => [
92+
'resourcePath' => '/V1/invoices',
93+
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
94+
],
95+
'soap' => [
96+
'service' => 'salesInvoiceRepositoryV1',
97+
'serviceVersion' => self::SERVICE_VERSION,
98+
'operation' => 'salesInvoiceRepositoryV1' . 'save',
99+
],
100+
];
101+
102+
$result = $this->_webApiCall($serviceInfo, ['entity' => $this->getDataForInvoice($order)]);
103+
$this->assertNotEmpty($result);
104+
$actualOrder = $this->objectManager->get(Order::class)->load($order->getId());
105+
$this->assertEquals(
106+
$order->getData(OrderInterface::INCREMENT_ID),
107+
$actualOrder->getData(OrderInterface::INCREMENT_ID)
108+
);
109+
110+
//Create creditmemo for the order and check increment id.
111+
$serviceInfo = [
112+
'rest' => [
113+
'resourcePath' => '/V1/creditmemo',
114+
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
115+
],
116+
'soap' => [
117+
'service' => 'salesCreditmemoRepositoryV1',
118+
'serviceVersion' => self::SERVICE_VERSION,
119+
'operation' => 'salesCreditmemoRepositoryV1' . 'save',
120+
],
121+
];
122+
$result = $this->_webApiCall($serviceInfo, ['entity' => $this->getDataForCreditmemo($order)]);
123+
$this->assertNotEmpty($result);
124+
$actualOrder = $this->objectManager->get(Order::class)->load($order->getId());
125+
$this->assertEquals(
126+
$order->getData(OrderInterface::INCREMENT_ID),
127+
$actualOrder->getData(OrderInterface::INCREMENT_ID)
128+
);
129+
}
130+
131+
/**
132+
* Check order increment id after updating via webapi
133+
*
134+
* @magentoApiDataFixture Magento/Sales/_files/order.php
135+
*/
136+
public function testOrderStatusUpdate()
137+
{
138+
/** @var Order $order */
139+
$order = $this->objectManager->get(Order::class)
46140
->loadByIncrementId(self::ORDER_INCREMENT_ID);
47141

48142
$entityData = $this->getOrderData($order);
143+
$entityData[OrderInterface::STATE] = 'complete';
144+
$entityData[OrderInterface::STATUS] = 'complete';
49145

50146
$requestData = ['entity' => $entityData];
51147

@@ -63,8 +159,8 @@ public function testOrderUpdate()
63159
$result = $this->_webApiCall($serviceInfo, $requestData);
64160
$this->assertGreaterThan(1, count($result));
65161

66-
/** @var \Magento\Sales\Model\Order $actualOrder */
67-
$actualOrder = $this->objectManager->get(\Magento\Sales\Model\Order::class)->load($order->getId());
162+
/** @var Order $actualOrder */
163+
$actualOrder = $this->objectManager->get(Order::class)->load($order->getId());
68164
$this->assertEquals(
69165
$order->getData(OrderInterface::INCREMENT_ID),
70166
$actualOrder->getData(OrderInterface::INCREMENT_ID)
@@ -74,10 +170,10 @@ public function testOrderUpdate()
74170
/**
75171
* Prepare order data for request
76172
*
77-
* @param \Magento\Sales\Model\Order $order
173+
* @param Order $order
78174
* @return array
79175
*/
80-
private function getOrderData(\Magento\Sales\Model\Order $order)
176+
private function getOrderData(Order $order)
81177
{
82178
if (TESTS_WEB_API_ADAPTER == self::ADAPTER_SOAP) {
83179
$entityData = $order->getData();
@@ -116,4 +212,191 @@ private function getOrderData(\Magento\Sales\Model\Order $order)
116212
}
117213
return $orderData;
118214
}
215+
216+
/**
217+
* Get data for invoice from order.
218+
*
219+
* @param Order $order
220+
* @return array
221+
*/
222+
private function getDataForInvoice(Order $order): array
223+
{
224+
$orderItems = $order->getAllItems();
225+
return [
226+
'order_id' => $order->getId(),
227+
'base_currency_code' => null,
228+
'base_discount_amount' => null,
229+
'base_grand_total' => null,
230+
'base_discount_tax_compensation_amount' => null,
231+
'base_shipping_amount' => null,
232+
'base_shipping_discount_tax_compensation_amnt' => null,
233+
'base_shipping_incl_tax' => null,
234+
'base_shipping_tax_amount' => null,
235+
'base_subtotal' => null,
236+
'base_subtotal_incl_tax' => null,
237+
'base_tax_amount' => null,
238+
'base_total_refunded' => null,
239+
'base_to_global_rate' => null,
240+
'base_to_order_rate' => null,
241+
'billing_address_id' => null,
242+
'can_void_flag' => null,
243+
'created_at' => null,
244+
'discount_amount' => null,
245+
'discount_description' => null,
246+
'email_sent' => null,
247+
'entity_id' => null,
248+
'global_currency_code' => null,
249+
'grand_total' => null,
250+
'discount_tax_compensation_amount' => null,
251+
'increment_id' => null,
252+
'is_used_for_refund' => null,
253+
'order_currency_code' => null,
254+
'shipping_address_id' => null,
255+
'shipping_amount' => null,
256+
'shipping_discount_tax_compensation_amount' => null,
257+
'shipping_incl_tax' => null,
258+
'shipping_tax_amount' => null,
259+
'state' => null,
260+
'store_currency_code' => null,
261+
'store_id' => null,
262+
'store_to_base_rate' => null,
263+
'store_to_order_rate' => null,
264+
'subtotal' => null,
265+
'subtotal_incl_tax' => null,
266+
'tax_amount' => null,
267+
'total_qty' => '1',
268+
'transaction_id' => null,
269+
'updated_at' => null,
270+
'items' => [
271+
[
272+
'orderItemId' => $orderItems[0]->getId(),
273+
'qty' => 2,
274+
'additionalData' => null,
275+
'baseCost' => null,
276+
'baseDiscountAmount' => null,
277+
'baseDiscountTaxCompensationAmount' => null,
278+
'basePrice' => null,
279+
'basePriceInclTax' => null,
280+
'baseRowTotal' => null,
281+
'baseRowTotalInclTax' => null,
282+
'baseTaxAmount' => null,
283+
'description' => null,
284+
'discountAmount' => null,
285+
'discountTaxCompensationAmount' => null,
286+
'name' => null,
287+
'entity_id' => null,
288+
'parentId' => null,
289+
'price' => null,
290+
'priceInclTax' => null,
291+
'productId' => null,
292+
'rowTotal' => null,
293+
'rowTotalInclTax' => null,
294+
'sku' => 'sku' . uniqid(),
295+
'taxAmount' => null,
296+
],
297+
],
298+
];
299+
}
300+
301+
/**
302+
* Get data for creditmemo.
303+
*
304+
* @param Order $order
305+
* @return array
306+
*/
307+
private function getDataForCreditmemo(Order $order): array
308+
{
309+
$orderItem = current($order->getAllItems());
310+
$items = [
311+
$orderItem->getId() => ['order_item_id' => $orderItem->getId(), 'qty' => $orderItem->getQtyInvoiced()],
312+
];
313+
return [
314+
'adjustment' => null,
315+
'adjustment_negative' => null,
316+
'adjustment_positive' => null,
317+
'base_adjustment' => null,
318+
'base_adjustment_negative' => null,
319+
'base_adjustment_positive' => null,
320+
'base_currency_code' => null,
321+
'base_discount_amount' => null,
322+
'base_grand_total' => null,
323+
'base_discount_tax_compensation_amount' => null,
324+
'base_shipping_amount' => null,
325+
'base_shipping_discount_tax_compensation_amnt' => null,
326+
'base_shipping_incl_tax' => null,
327+
'base_shipping_tax_amount' => null,
328+
'base_subtotal' => null,
329+
'base_subtotal_incl_tax' => null,
330+
'base_tax_amount' => null,
331+
'base_to_global_rate' => null,
332+
'base_to_order_rate' => null,
333+
'billing_address_id' => null,
334+
'created_at' => null,
335+
'creditmemo_status' => null,
336+
'discount_amount' => null,
337+
'discount_description' => null,
338+
'email_sent' => null,
339+
'entity_id' => null,
340+
'global_currency_code' => null,
341+
'grand_total' => null,
342+
'discount_tax_compensation_amount' => null,
343+
'increment_id' => null,
344+
'invoice_id' => null,
345+
'order_currency_code' => null,
346+
'order_id' => $order->getId(),
347+
'shipping_address_id' => null,
348+
'shipping_amount' => null,
349+
'shipping_discount_tax_compensation_amount' => null,
350+
'shipping_incl_tax' => null,
351+
'shipping_tax_amount' => null,
352+
'state' => null,
353+
'store_currency_code' => null,
354+
'store_id' => null,
355+
'store_to_base_rate' => null,
356+
'store_to_order_rate' => null,
357+
'subtotal' => null,
358+
'subtotal_incl_tax' => null,
359+
'tax_amount' => null,
360+
'transaction_id' => null,
361+
'updated_at' => null,
362+
'items' => $items,
363+
];
364+
}
365+
366+
/**
367+
* Get data for shipment.
368+
*
369+
* @param Order $order
370+
* @return array
371+
*/
372+
private function getDataForShipment(Order $order): array
373+
{
374+
$requestShipData = [
375+
'orderId' => $order->getId(),
376+
'items' => [],
377+
'comment' => [
378+
'comment' => 'Test Comment',
379+
'is_visible_on_front' => 1,
380+
],
381+
'tracks' => [
382+
[
383+
'track_number' => 'TEST_TRACK_0001',
384+
'title' => 'Simple shipment track',
385+
'carrier_code' => 'UPS'
386+
]
387+
]
388+
];
389+
390+
foreach ($order->getAllItems() as $item) {
391+
if ($item->getProductType() == 'simple') {
392+
$requestShipData['items'][] = [
393+
'order_item_id' => $item->getItemId(),
394+
'qty' => $item->getQtyOrdered(),
395+
];
396+
break;
397+
}
398+
}
399+
400+
return $requestShipData;
401+
}
119402
}

0 commit comments

Comments
 (0)