33 * Copyright © Magento, Inc. All rights reserved.
44 * See COPYING.txt for license details.
55 */
6+ declare (strict_types=1 );
7+
68namespace Magento \Sales \Service \V1 ;
79
10+ use Magento \Sales \Model \Order ;
811use Magento \TestFramework \TestCase \WebapiAbstract ;
912use Magento \Sales \Api \Data \OrderInterface ;
1013
1316 */
1417class 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