ShipOrderTest.php 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Sales\Service\V1;
  7. /**
  8. * API test for creation of Shipment for certain Order.
  9. */
  10. class ShipOrderTest extends \Magento\TestFramework\TestCase\WebapiAbstract
  11. {
  12. const SERVICE_READ_NAME = 'salesShipOrderV1';
  13. const SERVICE_VERSION = 'V1';
  14. /**
  15. * @var \Magento\Framework\ObjectManagerInterface
  16. */
  17. private $objectManager;
  18. /**
  19. * @var \Magento\Sales\Api\ShipmentRepositoryInterface
  20. */
  21. private $shipmentRepository;
  22. protected function setUp()
  23. {
  24. $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
  25. $this->shipmentRepository = $this->objectManager->get(
  26. \Magento\Sales\Api\ShipmentRepositoryInterface::class
  27. );
  28. }
  29. /**
  30. * @magentoApiDataFixture Magento/Sales/_files/order_configurable_product.php
  31. */
  32. public function testConfigurableShipOrder()
  33. {
  34. $this->markTestIncomplete('https://github.com/magento-engcom/msi/issues/1335');
  35. $productsQuantity = 1;
  36. /** @var \Magento\Sales\Model\Order $existingOrder */
  37. $existingOrder = $this->objectManager->create(\Magento\Sales\Model\Order::class)
  38. ->loadByIncrementId('100000001');
  39. $requestData = [
  40. 'orderId' => $existingOrder->getId(),
  41. ];
  42. $shipmentId = (int)$this->_webApiCall($this->getServiceInfo($existingOrder), $requestData);
  43. $this->assertNotEmpty($shipmentId);
  44. try {
  45. $shipment = $this->shipmentRepository->get($shipmentId);
  46. } catch (\Magento\Framework\Exception\NoSuchEntityException $e) {
  47. $this->fail('Failed asserting that Shipment was created');
  48. }
  49. $orderedQty = 0;
  50. /** @var \Magento\Sales\Model\Order\Item $item */
  51. foreach ($existingOrder->getItems() as $item) {
  52. if ($item->isDummy(true)) {
  53. continue;
  54. }
  55. $orderedQty += $item->getQtyOrdered();
  56. }
  57. $this->assertEquals(
  58. (int)$shipment->getTotalQty(),
  59. (int)$orderedQty,
  60. 'Failed asserting that quantity of ordered and shipped items is equal'
  61. );
  62. $this->assertEquals(
  63. $productsQuantity,
  64. count($shipment->getItems()),
  65. 'Failed asserting that quantity of products and sales shipment items is equal'
  66. );
  67. }
  68. /**
  69. * @magentoApiDataFixture Magento/Sales/_files/order_new.php
  70. */
  71. public function testShipOrder()
  72. {
  73. /** @var \Magento\Sales\Model\Order $existingOrder */
  74. $existingOrder = $this->objectManager->create(\Magento\Sales\Model\Order::class)
  75. ->loadByIncrementId('100000001');
  76. $requestData = [
  77. 'orderId' => $existingOrder->getId(),
  78. 'items' => [],
  79. 'comment' => [
  80. 'comment' => 'Test Comment',
  81. 'is_visible_on_front' => 1,
  82. ],
  83. 'tracks' => [
  84. [
  85. 'track_number' => 'TEST_TRACK_0001',
  86. 'title' => 'Simple shipment track',
  87. 'carrier_code' => 'UPS'
  88. ]
  89. ]
  90. ];
  91. /** @var \Magento\Sales\Api\Data\OrderItemInterface $item */
  92. foreach ($existingOrder->getAllItems() as $item) {
  93. $requestData['items'][] = [
  94. 'order_item_id' => $item->getItemId(),
  95. 'qty' => $item->getQtyOrdered(),
  96. ];
  97. }
  98. $result = $this->_webApiCall($this->getServiceInfo($existingOrder), $requestData);
  99. $this->assertNotEmpty($result);
  100. try {
  101. $this->shipmentRepository->get($result);
  102. } catch (\Magento\Framework\Exception\NoSuchEntityException $e) {
  103. $this->fail('Failed asserting that Shipment was created');
  104. }
  105. /** @var \Magento\Sales\Model\Order $updatedOrder */
  106. $updatedOrder = $this->objectManager->create(\Magento\Sales\Model\Order::class)
  107. ->loadByIncrementId('100000001');
  108. $this->assertNotEquals(
  109. $existingOrder->getStatus(),
  110. $updatedOrder->getStatus(),
  111. 'Failed asserting that Order status was changed'
  112. );
  113. }
  114. /**
  115. * Tests that not providing a tracking number produces the correct error. See MAGETWO-95429
  116. * @expectedException \Exception
  117. * @codingStandardsIgnoreStart
  118. * @expectedExceptionMessageRegExp /Shipment Document Validation Error\(s\):(?:\n|\\n)Please enter a tracking number./
  119. * @codingStandardsIgnoreEnd
  120. * @magentoApiDataFixture Magento/Sales/_files/order_new.php
  121. */
  122. public function testShipOrderWithoutTrackingNumberReturnsError()
  123. {
  124. $this->_markTestAsRestOnly('SOAP requires an tracking number to be provided so this case is not possible.');
  125. /** @var \Magento\Sales\Model\Order $existingOrder */
  126. $existingOrder = $this->objectManager->create(\Magento\Sales\Model\Order::class)
  127. ->loadByIncrementId('100000001');
  128. $requestData = [
  129. 'orderId' => $existingOrder->getId(),
  130. 'comment' => [
  131. 'comment' => 'Test Comment',
  132. 'is_visible_on_front' => 1,
  133. ],
  134. 'tracks' => [
  135. [
  136. 'title' => 'Simple shipment track',
  137. 'carrier_code' => 'UPS'
  138. ]
  139. ]
  140. ];
  141. $this->_webApiCall($this->getServiceInfo($existingOrder), $requestData);
  142. }
  143. /**
  144. * @magentoApiDataFixture Magento/Bundle/_files/order_with_bundle_shipped_separately.php
  145. */
  146. public function testPartialShipOrderWithBundleShippedSeparately()
  147. {
  148. /** @var \Magento\Sales\Model\Order $existingOrder */
  149. $existingOrder = $this->objectManager->create(\Magento\Sales\Model\Order::class)
  150. ->loadByIncrementId('100000001');
  151. $requestData = [
  152. 'orderId' => $existingOrder->getId(),
  153. 'items' => [],
  154. 'comment' => [
  155. 'comment' => 'Test Comment',
  156. 'is_visible_on_front' => 1,
  157. ],
  158. 'tracks' => [
  159. [
  160. 'track_number' => 'TEST_TRACK_0001',
  161. 'title' => 'Simple shipment track',
  162. 'carrier_code' => 'UPS'
  163. ]
  164. ]
  165. ];
  166. $shippedItemId = null;
  167. foreach ($existingOrder->getAllItems() as $item) {
  168. if ($item->getProductType() == 'simple') {
  169. $requestData['items'][] = [
  170. 'order_item_id' => $item->getItemId(),
  171. 'qty' => $item->getQtyOrdered(),
  172. ];
  173. $shippedItemId = $item->getItemId();
  174. break;
  175. }
  176. }
  177. $shipmentId = $this->_webApiCall($this->getServiceInfo($existingOrder), $requestData);
  178. $this->assertNotEmpty($shipmentId);
  179. try {
  180. $shipment = $this->shipmentRepository->get($shipmentId);
  181. } catch (\Magento\Framework\Exception\NoSuchEntityException $e) {
  182. $this->fail('Failed asserting that Shipment was created');
  183. }
  184. $this->assertEquals(1, $shipment->getTotalQty());
  185. /** @var \Magento\Sales\Model\Order $existingOrder */
  186. $existingOrder = $this->objectManager->create(\Magento\Sales\Model\Order::class)
  187. ->loadByIncrementId('100000001');
  188. foreach ($existingOrder->getAllItems() as $item) {
  189. if ($item->getItemId() == $shippedItemId) {
  190. $this->assertEquals(1, $item->getQtyShipped());
  191. continue;
  192. }
  193. $this->assertEquals(0, $item->getQtyShipped());
  194. }
  195. }
  196. /**
  197. * @param \Magento\Sales\Model\Order $order
  198. * @return array
  199. */
  200. private function getServiceInfo(\Magento\Sales\Model\Order $order)
  201. {
  202. $serviceInfo = [
  203. 'rest' => [
  204. 'resourcePath' => '/V1/order/' . $order->getId() . '/ship',
  205. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
  206. ],
  207. 'soap' => [
  208. 'service' => self::SERVICE_READ_NAME,
  209. 'serviceVersion' => self::SERVICE_VERSION,
  210. 'operation' => self::SERVICE_READ_NAME . 'execute',
  211. ],
  212. ];
  213. return $serviceInfo;
  214. }
  215. }