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

444 lines
16 KiB
PHP
Executable File

<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Magento\Sales\Service\V1;
use Magento\Sales\Model\Order;
use Magento\TestFramework\TestCase\WebapiAbstract;
use Magento\Sales\Api\Data\OrderInterface;
/**
* Test order updating via webapi
*/
class OrderUpdateTest extends WebapiAbstract
{
private const RESOURCE_PATH = '/V1/orders';
private const SERVICE_NAME = 'salesOrderRepositoryV1';
private const SERVICE_VERSION = 'V1';
private const ORDER_INCREMENT_ID = '100000001';
/**
* @var \Magento\Framework\ObjectManagerInterface
*/
private $objectManager;
/**
* @inheritDoc
*/
protected function setUp(): void
{
$this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
}
/**
* Check order increment id after updating via webapi
*
* @magentoApiDataFixture Magento/Sales/_files/order.php
*/
public function testOrderUpdate()
{
/** @var Order $order */
$order = $this->objectManager->get(Order::class)->loadByIncrementId(self::ORDER_INCREMENT_ID);
$serviceInfo = [
'rest' => [
'resourcePath' => self::RESOURCE_PATH,
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
],
'soap' => [
'service' => self::SERVICE_NAME,
'serviceVersion' => self::SERVICE_VERSION,
'operation' => self::SERVICE_NAME . 'save',
],
];
$result = $this->_webApiCall($serviceInfo, ['entity' => $this->getOrderData($order)]);
$this->assertGreaterThan(1, count($result));
/** @var Order $actualOrder */
$actualOrder = $this->objectManager->get(Order::class)->load($order->getId());
$this->assertEquals(
$order->getData(OrderInterface::INCREMENT_ID),
$actualOrder->getData(OrderInterface::INCREMENT_ID)
);
//Ship the order and check increment id.
$serviceInfo = [
'rest' => [
'resourcePath' => '/V1/order/' . $order->getId() . '/ship',
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
],
'soap' => [
'service' => 'salesShipOrderV1',
'serviceVersion' => self::SERVICE_VERSION,
'operation' => 'salesShipOrderV1' . 'execute',
],
];
$shipmentId = $this->_webApiCall($serviceInfo, $this->getDataForShipment($order));
$this->assertNotEmpty($shipmentId);
$actualOrder = $this->objectManager->get(Order::class)->load($order->getId());
$this->assertEquals(
$order->getData(OrderInterface::INCREMENT_ID),
$actualOrder->getData(OrderInterface::INCREMENT_ID)
);
//Invoice the order and check increment id.
$serviceInfo = [
'rest' => [
'resourcePath' => '/V1/invoices',
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
],
'soap' => [
'service' => 'salesInvoiceRepositoryV1',
'serviceVersion' => self::SERVICE_VERSION,
'operation' => 'salesInvoiceRepositoryV1' . 'save',
],
];
$result = $this->_webApiCall($serviceInfo, ['entity' => $this->getDataForInvoice($order)]);
$this->assertNotEmpty($result);
$actualOrder = $this->objectManager->get(Order::class)->load($order->getId());
$this->assertEquals(
$order->getData(OrderInterface::INCREMENT_ID),
$actualOrder->getData(OrderInterface::INCREMENT_ID)
);
//Create creditmemo for the order and check increment id.
$serviceInfo = [
'rest' => [
'resourcePath' => '/V1/creditmemo',
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
],
'soap' => [
'service' => 'salesCreditmemoRepositoryV1',
'serviceVersion' => self::SERVICE_VERSION,
'operation' => 'salesCreditmemoRepositoryV1' . 'save',
],
];
$result = $this->_webApiCall($serviceInfo, ['entity' => $this->getDataForCreditmemo($order)]);
$this->assertNotEmpty($result);
$actualOrder = $this->objectManager->get(Order::class)->load($order->getId());
$this->assertEquals(
$order->getData(OrderInterface::INCREMENT_ID),
$actualOrder->getData(OrderInterface::INCREMENT_ID)
);
}
/**
* Check order increment id after updating via webapi
*
* @magentoApiDataFixture Magento/Sales/_files/order.php
*/
public function testOrderStatusUpdate()
{
/** @var Order $order */
$order = $this->objectManager->get(Order::class)
->loadByIncrementId(self::ORDER_INCREMENT_ID);
$entityData = $this->getOrderData($order);
$entityData[OrderInterface::STATE] = 'complete';
$entityData[OrderInterface::STATUS] = 'complete';
$requestData = ['entity' => $entityData];
$serviceInfo = [
'rest' => [
'resourcePath' => '/V1/orders',
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
],
'soap' => [
'service' => self::SERVICE_NAME,
'serviceVersion' => self::SERVICE_VERSION,
'operation' => self::SERVICE_NAME . 'save',
],
];
$result = $this->_webApiCall($serviceInfo, $requestData);
$this->assertGreaterThan(1, count($result));
/** @var Order $actualOrder */
$actualOrder = $this->objectManager->get(Order::class)->load($order->getId());
$this->assertEquals(
$order->getData(OrderInterface::INCREMENT_ID),
$actualOrder->getData(OrderInterface::INCREMENT_ID)
);
}
/**
* Check order increment id after updating via webapi
*
* @magentoApiDataFixture Magento/Sales/_files/order.php
*/
public function testOrderNoAttributesProvidedUpdate()
{
/** @var Order $order */
$order = $this->objectManager->get(Order::class)
->loadByIncrementId(self::ORDER_INCREMENT_ID);
$entityData = $this->getOrderData($order);
if (TESTS_WEB_API_ADAPTER == self::ADAPTER_SOAP) {
$this->markTestSkipped("Soap calls are more strict and contains attributes.");
return;
}
$requestData = ['entity' => ['entity_id' => $entityData['entity_id']]];
$serviceInfo = [
'rest' => [
'resourcePath' => '/V1/orders',
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
],
'soap' => [
'service' => self::SERVICE_NAME,
'serviceVersion' => self::SERVICE_VERSION,
'operation' => self::SERVICE_NAME . 'save',
],
];
$result = $this->_webApiCall($serviceInfo, $requestData);
$this->assertGreaterThan(1, count($result));
/** @var Order $actualOrder */
$actualOrder = $this->objectManager->get(Order::class)->load($order->getId());
$this->assertEquals(
$order->getData(OrderInterface::INCREMENT_ID),
$actualOrder->getData(OrderInterface::INCREMENT_ID)
);
}
/**
* Prepare order data for request
*
* @param Order $order
* @return array
*/
private function getOrderData(Order $order)
{
if (TESTS_WEB_API_ADAPTER == self::ADAPTER_SOAP) {
$entityData = $order->getData();
unset($entityData[OrderInterface::INCREMENT_ID]);
$entityData[OrderInterface::STATE] = 'processing';
$entityData[OrderInterface::STATUS] = 'processing';
$orderData = $order->getData();
$orderData['billing_address'] = $order->getBillingAddress()->getData();
$orderData['billing_address']['street'] = ['Street'];
$orderItems = [];
foreach ($order->getItems() as $item) {
$orderItems[] = $item->getData();
}
$orderData['items'] = $orderItems;
$shippingAddress = $order->getShippingAddress()->getData();
$orderData['extension_attributes']['shipping_assignments'] =
[
[
'shipping' => [
'address' => $shippingAddress,
'method' => 'flatrate_flatrate'
],
'items' => $order->getItems(),
'stock_id' => null,
]
];
} else {
$orderData = [
OrderInterface::ENTITY_ID => $order->getId(),
OrderInterface::STATE => 'processing',
OrderInterface::STATUS => 'processing'
];
}
return $orderData;
}
/**
* Get data for invoice from order.
*
* @param Order $order
* @return array
*/
private function getDataForInvoice(Order $order): array
{
$orderItems = $order->getAllItems();
return [
'order_id' => $order->getId(),
'base_currency_code' => null,
'base_discount_amount' => null,
'base_grand_total' => null,
'base_discount_tax_compensation_amount' => null,
'base_shipping_amount' => null,
'base_shipping_discount_tax_compensation_amnt' => null,
'base_shipping_incl_tax' => null,
'base_shipping_tax_amount' => null,
'base_subtotal' => null,
'base_subtotal_incl_tax' => null,
'base_tax_amount' => null,
'base_total_refunded' => null,
'base_to_global_rate' => null,
'base_to_order_rate' => null,
'billing_address_id' => null,
'can_void_flag' => null,
'created_at' => null,
'discount_amount' => null,
'discount_description' => null,
'email_sent' => null,
'entity_id' => null,
'global_currency_code' => null,
'grand_total' => null,
'discount_tax_compensation_amount' => null,
'increment_id' => null,
'is_used_for_refund' => null,
'order_currency_code' => null,
'shipping_address_id' => null,
'shipping_amount' => null,
'shipping_discount_tax_compensation_amount' => null,
'shipping_incl_tax' => null,
'shipping_tax_amount' => null,
'state' => null,
'store_currency_code' => null,
'store_id' => null,
'store_to_base_rate' => null,
'store_to_order_rate' => null,
'subtotal' => null,
'subtotal_incl_tax' => null,
'tax_amount' => null,
'total_qty' => '1',
'transaction_id' => null,
'updated_at' => null,
'items' => [
[
'orderItemId' => $orderItems[0]->getId(),
'qty' => 2,
'additionalData' => null,
'baseCost' => null,
'baseDiscountAmount' => null,
'baseDiscountTaxCompensationAmount' => null,
'basePrice' => null,
'basePriceInclTax' => null,
'baseRowTotal' => null,
'baseRowTotalInclTax' => null,
'baseTaxAmount' => null,
'description' => null,
'discountAmount' => null,
'discountTaxCompensationAmount' => null,
'name' => null,
'entity_id' => null,
'parentId' => null,
'price' => null,
'priceInclTax' => null,
'productId' => null,
'rowTotal' => null,
'rowTotalInclTax' => null,
'sku' => 'sku' . uniqid(),
'taxAmount' => null,
],
],
];
}
/**
* Get data for creditmemo.
*
* @param Order $order
* @return array
*/
private function getDataForCreditmemo(Order $order): array
{
$orderItem = current($order->getAllItems());
$items = [
$orderItem->getId() => ['order_item_id' => $orderItem->getId(), 'qty' => $orderItem->getQtyInvoiced()],
];
return [
'adjustment' => null,
'adjustment_negative' => null,
'adjustment_positive' => null,
'base_adjustment' => null,
'base_adjustment_negative' => null,
'base_adjustment_positive' => null,
'base_currency_code' => null,
'base_discount_amount' => null,
'base_grand_total' => null,
'base_discount_tax_compensation_amount' => null,
'base_shipping_amount' => null,
'base_shipping_discount_tax_compensation_amnt' => null,
'base_shipping_incl_tax' => null,
'base_shipping_tax_amount' => null,
'base_subtotal' => null,
'base_subtotal_incl_tax' => null,
'base_tax_amount' => null,
'base_to_global_rate' => null,
'base_to_order_rate' => null,
'billing_address_id' => null,
'created_at' => null,
'creditmemo_status' => null,
'discount_amount' => null,
'discount_description' => null,
'email_sent' => null,
'entity_id' => null,
'global_currency_code' => null,
'grand_total' => null,
'discount_tax_compensation_amount' => null,
'increment_id' => null,
'invoice_id' => null,
'order_currency_code' => null,
'order_id' => $order->getId(),
'shipping_address_id' => null,
'shipping_amount' => null,
'shipping_discount_tax_compensation_amount' => null,
'shipping_incl_tax' => null,
'shipping_tax_amount' => null,
'state' => null,
'store_currency_code' => null,
'store_id' => null,
'store_to_base_rate' => null,
'store_to_order_rate' => null,
'subtotal' => null,
'subtotal_incl_tax' => null,
'tax_amount' => null,
'transaction_id' => null,
'updated_at' => null,
'items' => $items,
];
}
/**
* Get data for shipment.
*
* @param Order $order
* @return array
*/
private function getDataForShipment(Order $order): array
{
$requestShipData = [
'orderId' => $order->getId(),
'items' => [],
'comment' => [
'comment' => 'Test Comment',
'is_visible_on_front' => 1,
],
'tracks' => [
[
'track_number' => 'TEST_TRACK_0001',
'title' => 'Simple shipment track',
'carrier_code' => 'UPS'
]
]
];
foreach ($order->getAllItems() as $item) {
if ($item->getProductType() == 'simple') {
$requestShipData['items'][] = [
'order_item_id' => $item->getItemId(),
'qty' => $item->getQtyOrdered(),
];
break;
}
}
return $requestShipData;
}
}