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,73 @@ 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
+ $ order = $ this ->getOrder ('order_bundle_separately_shipped ' );
240
+
241
+ $ requestData = [
242
+ 'orderId ' => $ order ->getId (),
243
+ 'items ' => [],
244
+ 'comment ' => [
245
+ 'comment ' => 'Test Comment ' ,
246
+ 'is_visible_on_front ' => 1 ,
247
+ ],
248
+ 'tracks ' => [],
249
+ ];
250
+
251
+ $ shippedItemId = null ;
252
+ $ parentItemId = null ;
253
+ foreach ($ order ->getAllItems () as $ item ) {
254
+ if ($ item ->getSku () === 'simple1 ' ) {
255
+ $ requestData ['items ' ][] = [
256
+ 'order_item_id ' => $ item ->getItemId (),
257
+ 'qty ' => $ item ->getQtyOrdered (),
258
+ ];
259
+ $ shippedItemId = $ item ->getItemId ();
260
+ $ parentItemId = $ item ->getParentItemId ();
261
+ break ;
262
+ }
263
+ }
264
+
265
+ $ shipmentId = $ this ->_webApiCall ($ this ->getServiceInfo ($ order ), $ requestData );
266
+ $ this ->assertNotEmpty ($ shipmentId );
267
+
268
+ try {
269
+ $ shipment = $ this ->shipmentRepository ->get ($ shipmentId );
270
+ } catch (\Magento \Framework \Exception \NoSuchEntityException $ e ) {
271
+ $ this ->fail ('Failed asserting that Shipment was created ' );
272
+ }
273
+
274
+ $ this ->assertEquals (1 , $ shipment ->getTotalQty ());
275
+
276
+ $ order = $ this ->getOrder ('order_bundle_separately_shipped ' );
277
+
278
+ foreach ($ order ->getAllItems () as $ item ) {
279
+ if (in_array ($ item ->getItemId (), [$ shippedItemId , $ parentItemId ])) {
280
+ $ this ->assertEquals (1 , $ item ->getQtyShipped ());
281
+ continue ;
282
+ }
283
+ $ this ->assertEquals (0 , $ item ->getQtyShipped ());
284
+ }
285
+
286
+ try {
287
+ $ this ->_webApiCall ($ this ->getServiceInfo ($ order ), $ requestData );
288
+ $ this ->fail ('Expected exception was not raised ' );
289
+ } catch (\Exception $ exception ) {
290
+ $ this ->assertExceptionMessage (
291
+ $ exception ,
292
+ 'Shipment Document Validation Error(s): You can \'t create a shipment without products. '
293
+ );
294
+ }
295
+ }
296
+
297
+ /**
298
+ * @param Order $order
231
299
* @return array
232
300
*/
233
- private function getServiceInfo (\ Magento \ Sales \ Model \ Order $ order )
301
+ private function getServiceInfo (Order $ order ): array
234
302
{
235
303
$ serviceInfo = [
236
304
'rest ' => [
@@ -243,6 +311,41 @@ private function getServiceInfo(\Magento\Sales\Model\Order $order)
243
311
'operation ' => self ::SERVICE_READ_NAME . 'execute ' ,
244
312
],
245
313
];
314
+
246
315
return $ serviceInfo ;
247
316
}
317
+
318
+ /**
319
+ * Returns order by increment id.
320
+ *
321
+ * @param string $incrementId
322
+ * @return Order
323
+ */
324
+ private function getOrder (string $ incrementId ): Order
325
+ {
326
+ return $ this ->objectManager ->create (Order::class)->loadByIncrementId ($ incrementId );
327
+ }
328
+
329
+ /**
330
+ * Assert correct exception message.
331
+ *
332
+ * @param \Exception $exception
333
+ * @param string $expectedMessage
334
+ * @return void
335
+ */
336
+ private function assertExceptionMessage (\Exception $ exception , string $ expectedMessage ): void
337
+ {
338
+ $ actualMessage = '' ;
339
+ switch (TESTS_WEB_API_ADAPTER ) {
340
+ case self ::ADAPTER_SOAP :
341
+ $ actualMessage = trim (preg_replace ('/\s+/ ' , ' ' , $ exception ->getMessage ()));
342
+ break ;
343
+ case self ::ADAPTER_REST :
344
+ $ error = $ this ->processRestExceptionResult ($ exception );
345
+ $ actualMessage = $ error ['message ' ];
346
+ break ;
347
+ }
348
+
349
+ $ this ->assertEquals ($ expectedMessage , $ actualMessage );
350
+ }
248
351
}
0 commit comments