5
5
*/
6
6
namespace Magento \Sales \Service \V1 ;
7
7
8
+ use Magento \Catalog \Api \ProductRepositoryInterface ;
9
+ use Magento \Framework \ObjectManagerInterface ;
10
+ use Magento \Sales \Api \Data \OrderItemInterface ;
11
+ use Magento \Sales \Api \ShipmentRepositoryInterface ;
12
+ use Magento \Sales \Model \Order ;
13
+
8
14
/**
9
15
* API test for creation of Shipment for certain Order.
10
16
*/
@@ -14,22 +20,28 @@ class ShipOrderTest extends \Magento\TestFramework\TestCase\WebapiAbstract
14
20
const SERVICE_VERSION = 'V1 ' ;
15
21
16
22
/**
17
- * @var \Magento\Framework\ ObjectManagerInterface
23
+ * @var ObjectManagerInterface
18
24
*/
19
25
private $ objectManager ;
20
26
21
27
/**
22
- * @var \Magento\Sales\Api\ ShipmentRepositoryInterface
28
+ * @var ShipmentRepositoryInterface
23
29
*/
24
30
private $ shipmentRepository ;
25
31
32
+ /**
33
+ * @var ProductRepositoryInterface
34
+ */
35
+ private $ productRepository ;
36
+
37
+ /**
38
+ * @inheritdoc
39
+ */
26
40
protected function setUp ()
27
41
{
28
42
$ this ->objectManager = \Magento \TestFramework \Helper \Bootstrap::getObjectManager ();
29
-
30
- $ this ->shipmentRepository = $ this ->objectManager ->get (
31
- \Magento \Sales \Api \ShipmentRepositoryInterface::class
32
- );
43
+ $ this ->shipmentRepository = $ this ->objectManager ->get (ShipmentRepositoryInterface::class);
44
+ $ this ->productRepository = $ this ->objectManager ->get (ProductRepositoryInterface::class);
33
45
}
34
46
35
47
/**
@@ -40,9 +52,8 @@ public function testConfigurableShipOrder()
40
52
$ this ->markTestIncomplete ('https://github.com/magento-engcom/msi/issues/1335 ' );
41
53
$ productsQuantity = 1 ;
42
54
43
- /** @var \Magento\Sales\Model\Order $existingOrder */
44
- $ existingOrder = $ this ->objectManager ->create (\Magento \Sales \Model \Order::class)
45
- ->loadByIncrementId ('100000001 ' );
55
+ /** @var Order $existingOrder */
56
+ $ existingOrder = $ this ->getOrder ('100000001 ' );
46
57
47
58
$ requestData = [
48
59
'orderId ' => $ existingOrder ->getId (),
@@ -83,9 +94,8 @@ public function testConfigurableShipOrder()
83
94
*/
84
95
public function testShipOrder ()
85
96
{
86
- /** @var \Magento\Sales\Model\Order $existingOrder */
87
- $ existingOrder = $ this ->objectManager ->create (\Magento \Sales \Model \Order::class)
88
- ->loadByIncrementId ('100000001 ' );
97
+ /** @var Order $existingOrder */
98
+ $ existingOrder = $ this ->getOrder ('100000001 ' );
89
99
90
100
$ requestData = [
91
101
'orderId ' => $ existingOrder ->getId (),
@@ -103,7 +113,7 @@ public function testShipOrder()
103
113
]
104
114
];
105
115
106
- /** @var \Magento\Sales\Api\Data\ OrderItemInterface $item */
116
+ /** @var OrderItemInterface $item */
107
117
foreach ($ existingOrder ->getAllItems () as $ item ) {
108
118
$ requestData ['items ' ][] = [
109
119
'order_item_id ' => $ item ->getItemId (),
@@ -121,9 +131,8 @@ public function testShipOrder()
121
131
$ this ->fail ('Failed asserting that Shipment was created ' );
122
132
}
123
133
124
- /** @var \Magento\Sales\Model\Order $updatedOrder */
125
- $ updatedOrder = $ this ->objectManager ->create (\Magento \Sales \Model \Order::class)
126
- ->loadByIncrementId ('100000001 ' );
134
+ /** @var Order $updatedOrder */
135
+ $ updatedOrder = $ this ->getOrder ('100000001 ' );
127
136
128
137
$ this ->assertNotEquals (
129
138
$ existingOrder ->getStatus (),
@@ -144,9 +153,8 @@ public function testShipOrderWithoutTrackingNumberReturnsError()
144
153
{
145
154
$ this ->_markTestAsRestOnly ('SOAP requires an tracking number to be provided so this case is not possible. ' );
146
155
147
- /** @var \Magento\Sales\Model\Order $existingOrder */
148
- $ existingOrder = $ this ->objectManager ->create (\Magento \Sales \Model \Order::class)
149
- ->loadByIncrementId ('100000001 ' );
156
+ /** @var Order $existingOrder */
157
+ $ existingOrder = $ this ->getOrder ('100000001 ' );
150
158
151
159
$ requestData = [
152
160
'orderId ' => $ existingOrder ->getId (),
@@ -170,9 +178,7 @@ public function testShipOrderWithoutTrackingNumberReturnsError()
170
178
*/
171
179
public function testPartialShipOrderWithBundleShippedSeparately ()
172
180
{
173
- /** @var \Magento\Sales\Model\Order $existingOrder */
174
- $ existingOrder = $ this ->objectManager ->create (\Magento \Sales \Model \Order::class)
175
- ->loadByIncrementId ('100000001 ' );
181
+ $ existingOrder = $ this ->getOrder ('100000001 ' );
176
182
177
183
$ requestData = [
178
184
'orderId ' => $ existingOrder ->getId (),
@@ -213,9 +219,8 @@ public function testPartialShipOrderWithBundleShippedSeparately()
213
219
214
220
$ this ->assertEquals (1 , $ shipment ->getTotalQty ());
215
221
216
- /** @var \Magento\Sales\Model\Order $existingOrder */
217
- $ existingOrder = $ this ->objectManager ->create (\Magento \Sales \Model \Order::class)
218
- ->loadByIncrementId ('100000001 ' );
222
+ /** @var Order $existingOrder */
223
+ $ existingOrder = $ this ->getOrder ('100000001 ' );
219
224
220
225
foreach ($ existingOrder ->getAllItems () as $ item ) {
221
226
if ($ item ->getItemId () == $ shippedItemId ) {
@@ -227,10 +232,75 @@ public function testPartialShipOrderWithBundleShippedSeparately()
227
232
}
228
233
229
234
/**
230
- * @param \Magento\Sales\Model\Order $order
235
+ * @magentoApiDataFixture Magento/Bundle/_files/order_with_2_bundles_shipping_separately.php
236
+ */
237
+ public function testPartialShipOrderWithTwoBundleShippedSeparatelyContainsSameSimple ()
238
+ {
239
+ /** @var Order $order */
240
+ $ order = $ this ->getOrder ('order_bundle_separately_shipped ' );
241
+
242
+ $ requestData = [
243
+ 'orderId ' => $ order ->getId (),
244
+ 'items ' => [],
245
+ 'comment ' => [
246
+ 'comment ' => 'Test Comment ' ,
247
+ 'is_visible_on_front ' => 1 ,
248
+ ],
249
+ 'tracks ' => []
250
+ ];
251
+
252
+ $ shippedItemId = null ;
253
+ $ parentItemId = null ;
254
+ foreach ($ order ->getAllItems () as $ item ) {
255
+ if ($ item ->getSku () === 'simple1 ' ) {
256
+ $ requestData ['items ' ][] = [
257
+ 'order_item_id ' => $ item ->getItemId (),
258
+ 'qty ' => $ item ->getQtyOrdered (),
259
+ ];
260
+ $ shippedItemId = $ item ->getItemId ();
261
+ $ parentItemId = $ item ->getParentItemId ();
262
+ break ;
263
+ }
264
+ }
265
+
266
+ $ shipmentId = $ this ->_webApiCall ($ this ->getServiceInfo ($ order ), $ requestData );
267
+ $ this ->assertNotEmpty ($ shipmentId );
268
+
269
+ try {
270
+ $ shipment = $ this ->shipmentRepository ->get ($ shipmentId );
271
+ } catch (\Magento \Framework \Exception \NoSuchEntityException $ e ) {
272
+ $ this ->fail ('Failed asserting that Shipment was created ' );
273
+ }
274
+
275
+ $ this ->assertEquals (1 , $ shipment ->getTotalQty ());
276
+
277
+ /** @var Order $existingOrder */
278
+ $ order = $ this ->getOrder ('order_bundle_separately_shipped ' );
279
+
280
+ foreach ($ order ->getAllItems () as $ item ) {
281
+ if (in_array ($ item ->getItemId (), [$ shippedItemId , $ parentItemId ])) {
282
+ $ this ->assertEquals (1 , $ item ->getQtyShipped ());
283
+ continue ;
284
+ }
285
+ $ this ->assertEquals (0 , $ item ->getQtyShipped ());
286
+ }
287
+
288
+ try {
289
+ $ this ->_webApiCall ($ this ->getServiceInfo ($ order ), $ requestData );
290
+ $ this ->fail ('Expected exception was not raised ' );
291
+ } catch (\Exception $ exception ) {
292
+ $ this ->assertExceptionMessage (
293
+ $ exception ,
294
+ 'Shipment Document Validation Error(s): You can \'t create a shipment without products. '
295
+ );
296
+ }
297
+ }
298
+
299
+ /**
300
+ * @param Order $order
231
301
* @return array
232
302
*/
233
- private function getServiceInfo (\ Magento \ Sales \ Model \ Order $ order )
303
+ private function getServiceInfo (Order $ order ): array
234
304
{
235
305
$ serviceInfo = [
236
306
'rest ' => [
@@ -243,6 +313,41 @@ private function getServiceInfo(\Magento\Sales\Model\Order $order)
243
313
'operation ' => self ::SERVICE_READ_NAME . 'execute ' ,
244
314
],
245
315
];
316
+
246
317
return $ serviceInfo ;
247
318
}
319
+
320
+ /**
321
+ * Returns order by increment id.
322
+ *
323
+ * @param string $incrementId
324
+ * @return Order
325
+ */
326
+ private function getOrder (string $ incrementId ): Order
327
+ {
328
+ return $ this ->objectManager ->create (Order::class)->loadByIncrementId ($ incrementId );
329
+ }
330
+
331
+ /**
332
+ * Assert correct exception message.
333
+ *
334
+ * @param \Exception $exception
335
+ * @param string $expectedMessage
336
+ * @return void
337
+ */
338
+ private function assertExceptionMessage (\Exception $ exception , string $ expectedMessage ): void
339
+ {
340
+ $ actualMessage = '' ;
341
+ switch (TESTS_WEB_API_ADAPTER ) {
342
+ case self ::ADAPTER_SOAP :
343
+ $ actualMessage = trim (preg_replace ('/\s+/ ' , ' ' , $ exception ->getMessage ()));
344
+ break ;
345
+ case self ::ADAPTER_REST :
346
+ $ error = $ this ->processRestExceptionResult ($ exception );
347
+ $ actualMessage = $ error ['message ' ];
348
+ break ;
349
+ }
350
+
351
+ $ this ->assertEquals ($ expectedMessage , $ actualMessage );
352
+ }
248
353
}
0 commit comments