magento2-docker/dev/tests/api-functional/testsuite/Magento/GraphQl/Sales/CustomerOrders/OrderShipmentsTest.php

329 lines
12 KiB
PHP
Executable File

<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Magento\GraphQl\Sales\CustomerOrders;
use Magento\Framework\DB\Transaction;
use Magento\Framework\Registry;
use Magento\GraphQl\GetCustomerAuthenticationHeader;
use Magento\GraphQl\Sales\Fixtures\CustomerPlaceOrder;
use Magento\Sales\Api\OrderRepositoryInterface;
use Magento\Sales\Model\Order;
use Magento\Sales\Model\Order\Shipment;
use Magento\Sales\Model\Order\ShipmentFactory;
use Magento\Sales\Model\ResourceModel\Order\Collection as OrderCollection;
use Magento\TestFramework\Helper\Bootstrap;
use Magento\TestFramework\TestCase\GraphQlAbstract;
class OrderShipmentsTest extends GraphQlAbstract
{
/**
* @var GetCustomerAuthenticationHeader
*/
private $getCustomerAuthHeader;
/**
* @var OrderRepositoryInterface
*/
private $orderRepository;
protected function setUp(): void
{
$this->getCustomerAuthHeader = Bootstrap::getObjectManager()->get(GetCustomerAuthenticationHeader::class);
$this->orderRepository = Bootstrap::getObjectManager()->get(OrderRepositoryInterface::class);
}
protected function tearDown(): void
{
$this->cleanupOrders();
}
/**
* @magentoApiDataFixture Magento/GraphQl/Sales/_files/customer_order_with_simple_shipment.php
*/
public function testGetOrderShipment()
{
$query = $this->getQuery('100000555');
$authHeader = $this->getCustomerAuthHeader->execute('customer_uk_address@test.com', 'password');
$orderModel = $this->fetchOrderModel('100000555');
$result = $this->graphQlQuery($query, [], '', $authHeader);
$this->assertArrayNotHasKey('errors', $result);
$this->assertCount(1, $result['customer']['orders']['items']);
$order = $result['customer']['orders']['items'][0];
$this->assertEquals('Flat Rate', $order['carrier']);
$this->assertEquals('Flat Rate - Fixed', $order['shipping_method']);
$this->assertArrayHasKey('shipments', $order);
/** @var Shipment $orderShipmentModel */
$orderShipmentModel = $orderModel->getShipmentsCollection()->getFirstItem();
$shipment = $order['shipments'][0];
$this->assertEquals(base64_encode($orderShipmentModel->getIncrementId()), $shipment['id']);
$this->assertEquals($orderShipmentModel->getIncrementId(), $shipment['number']);
//Check Tracking
$this->assertCount(1, $shipment['tracking']);
$tracking = $shipment['tracking'][0];
$this->assertEquals('ups', $tracking['carrier']);
$this->assertEquals('United Parcel Service', $tracking['title']);
$this->assertEquals('1234567890', $tracking['number']);
//Check Items
$this->assertCount(2, $shipment['items']);
foreach ($orderShipmentModel->getItems() as $expectedItem) {
$sku = $expectedItem->getSku();
$findItem = array_filter($shipment['items'], function ($item) use ($sku) {
return $item['product_sku'] === $sku;
});
$this->assertCount(1, $findItem);
$actualItem = reset($findItem);
$expectedEncodedId = base64_encode($expectedItem->getEntityId());
$this->assertEquals($expectedEncodedId, $actualItem['id']);
$this->assertEquals($expectedItem->getSku(), $actualItem['product_sku']);
$this->assertEquals($expectedItem->getName(), $actualItem['product_name']);
$this->assertEquals($expectedItem->getPrice(), $actualItem['product_sale_price']['value']);
$this->assertEquals('USD', $actualItem['product_sale_price']['currency']);
$this->assertEquals('1', $actualItem['quantity_shipped']);
//Check correct order_item
$this->assertNotEmpty($actualItem['order_item']);
$this->assertEquals($expectedItem->getSku(), $actualItem['order_item']['product_sku']);
}
//Check comments
$this->assertCount(1, $shipment['comments']);
$this->assertEquals('This comment is visible to the customer', $shipment['comments'][0]['message']);
$this->assertNotEmpty($shipment['comments'][0]['timestamp']);
}
/**
* @magentoApiDataFixture Magento/GraphQl/Sales/_files/customer_order_with_multiple_shipments.php
*/
public function testGetOrderShipmentsMultiple()
{
$query = $this->getQuery('100000555');
$authHeader = $this->getCustomerAuthHeader->execute('customer_uk_address@test.com', 'password');
$result = $this->graphQlQuery($query, [], '', $authHeader);
$this->assertArrayNotHasKey('errors', $result);
$order = $result['customer']['orders']['items'][0];
$shipments = $order['shipments'];
$this->assertCount(2, $shipments);
$this->assertEquals('0000000098', $shipments[0]['number']);
$this->assertCount(1, $shipments[0]['items']);
$this->assertEquals('0000000099', $shipments[1]['number']);
$this->assertCount(1, $shipments[1]['items']);
}
/**
* @magentoConfigFixture default_store carriers/ups/active 1
* @magentoApiDataFixture Magento/GraphQl/Sales/_files/customer_order_with_ups_shipping.php
*/
public function testOrderShipmentWithUpsCarrier()
{
$query = $this->getQuery('100000001');
$authHeader = $this->getCustomerAuthHeader->execute('customer@example.com', 'password');
$result = $this->graphQlQuery($query, [], '', $authHeader);
$this->assertArrayNotHasKey('errors', $result);
$this->assertEquals('UPS Next Day Air', $result['customer']['orders']['items'][0]['shipping_method']);
$this->assertEquals('United Parcel Service', $result['customer']['orders']['items'][0]['carrier']);
$shipments = $result['customer']['orders']['items'][0]['shipments'];
$expectedTracking = [
'title' => 'United Parcel Service',
'carrier' => 'ups',
'number' => '987654321'
];
$this->assertEquals($expectedTracking, $shipments[0]['tracking'][0]);
}
/**
* @magentoConfigFixture default_store carriers/ups/active 1
* @magentoApiDataFixture Magento/Customer/_files/customer.php
* @magentoApiDataFixture Magento/Bundle/_files/bundle_product_two_dropdown_options.php
*/
public function testOrderShipmentWithBundleProduct()
{
//Place order with bundled product
/** @var CustomerPlaceOrder $bundleProductOrderFixture */
$bundleProductOrderFixture = Bootstrap::getObjectManager()->create(CustomerPlaceOrder::class);
$placeOrderResponse = $bundleProductOrderFixture->placeOrderWithBundleProduct(
['email' => 'customer@example.com', 'password' => 'password'],
['sku' => 'bundle-product-two-dropdown-options']
);
$orderNumber = $placeOrderResponse['placeOrder']['order']['order_number'];
$this->shipOrder($orderNumber);
$result = $this->graphQlQuery(
$this->getQuery(),
[],
'',
$this->getCustomerAuthHeader->execute('customer@example.com', 'password')
);
$this->assertArrayNotHasKey('errors', $result);
$shipments = $result['customer']['orders']['items'][0]['shipments'];
$shipmentBundleItem = $shipments[0]['items'][0];
$shipmentItemAssertionMap = [
'order_item' => [
'product_sku' => 'bundle-product-two-dropdown-options-simple1-simple2'
],
'product_name' => 'Bundle Product With Two dropdown options',
'product_sku' => 'bundle-product-two-dropdown-options-simple1-simple2',
'product_sale_price' => [
'value' => 15,
'currency' => 'USD'
],
'bundle_options' => [
[
'label' => 'Drop Down Option 1',
'values' => [
[
'product_name' => 'Simple Product1',
'product_sku' => 'simple1',
'quantity' => 1,
'price' => ['value' => 1]
]
]
],
[
'label' => 'Drop Down Option 2',
'values' => [
[
'product_name' => 'Simple Product2',
'product_sku' => 'simple2',
'quantity' => 2,
'price' => ['value' => 2]
]
]
]
]
];
$this->assertResponseFields($shipmentBundleItem, $shipmentItemAssertionMap);
}
/**
* Get query that fetch orders and shipment information
*
* @param string|null $orderId
* @return string
*/
private function getQuery(string $orderId = null)
{
$filter = $orderId ? "(filter:{number:{eq:\"$orderId\"}})" : "";
return <<<QUERY
{
customer {
orders {$filter}{
items {
number
status
items {
product_sku
}
carrier
shipping_method
shipments {
id
number
tracking {
title
carrier
number
}
items {
id
order_item {
product_sku
}
product_name
product_sku
product_sale_price {
value
currency
}
... on BundleShipmentItem {
bundle_options {
label
values {
product_name
product_sku
quantity
price {
value
}
}
}
}
quantity_shipped
}
comments {
timestamp
message
}
}
}
}
}
}
QUERY;
}
/**
* Get model instance for order by number
*
* @param string $orderNumber
* @return Order
*/
private function fetchOrderModel(string $orderNumber): Order
{
/** @var Order $order */
$order = Bootstrap::getObjectManager()->get(Order::class);
$order->loadByIncrementId($orderNumber);
return $order;
}
/**
* Create shipment for order
*
* @param string $orderNumber
*/
private function shipOrder(string $orderNumber): void
{
$order = $this->fetchOrderModel($orderNumber);
$order->setIsInProcess(true);
/** @var Transaction $transaction */
$transaction = Bootstrap::getObjectManager()->create(Transaction::class);
$items = [];
foreach ($order->getItems() as $orderItem) {
$items[$orderItem->getId()] = $orderItem->getQtyOrdered();
}
$shipment = Bootstrap::getObjectManager()->get(ShipmentFactory::class)->create($order, $items);
$shipment->register();
$transaction->addObject($shipment)->addObject($order)->save();
}
/**
* Clean up orders
*/
private function cleanupOrders()
{
$registry = Bootstrap::getObjectManager()->get(Registry::class);
$registry->unregister('isSecureArea');
$registry->register('isSecureArea', true);
/** @var $order \Magento\Sales\Model\Order */
$orderCollection = Bootstrap::getObjectManager()->create(OrderCollection::class);
foreach ($orderCollection as $order) {
$this->orderRepository->delete($order);
}
$registry->unregister('isSecureArea');
$registry->register('isSecureArea', false);
}
}