magento2-docker/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/CheckoutEndToEndTest.php

437 lines
11 KiB
PHP
Executable File

<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Magento\GraphQl\Quote\Guest;
use Magento\Quote\Model\QuoteIdMaskFactory;
use Magento\Quote\Model\ResourceModel\Quote as QuoteResource;
use Magento\Framework\Registry;
use Magento\Quote\Model\ResourceModel\Quote\CollectionFactory as QuoteCollectionFactory;
use Magento\Sales\Api\OrderRepositoryInterface;
use Magento\Sales\Model\ResourceModel\Order\CollectionFactory;
use Magento\TestFramework\Helper\Bootstrap;
use Magento\TestFramework\TestCase\GraphQlAbstract;
/**
* End to checkout tests for guest
*/
class CheckoutEndToEndTest extends GraphQlAbstract
{
/**
* @var Registry
*/
private $registry;
/**
* @var QuoteCollectionFactory
*/
private $quoteCollectionFactory;
/**
* @var QuoteResource
*/
private $quoteResource;
/**
* @var QuoteIdMaskFactory
*/
private $quoteIdMaskFactory;
/**
* @var CollectionFactory
*/
private $orderCollectionFactory;
/**
* @var OrderRepositoryInterface
*/
private $orderRepository;
protected function setUp(): void
{
parent::setUp();
$objectManager = Bootstrap::getObjectManager();
$this->registry = $objectManager->get(Registry::class);
$this->quoteCollectionFactory = $objectManager->get(QuoteCollectionFactory::class);
$this->quoteResource = $objectManager->get(QuoteResource::class);
$this->quoteIdMaskFactory = $objectManager->get(QuoteIdMaskFactory::class);
$this->orderCollectionFactory = $objectManager->get(CollectionFactory::class);
$this->orderRepository = $objectManager->get(OrderRepositoryInterface::class);
}
/**
* @magentoApiDataFixture Magento/Catalog/_files/products_with_layered_navigation_attribute.php
*/
public function testCheckoutWorkflow()
{
$quantity = 2;
$sku = $this->findProduct();
$cartId = $this->createEmptyCart();
$this->setGuestEmailOnCart($cartId);
$this->addProductToCart($cartId, $quantity, $sku);
$this->setBillingAddress($cartId);
$shippingMethod = $this->setShippingAddress($cartId);
$paymentMethod = $this->setShippingMethod($cartId, $shippingMethod);
$this->setPaymentMethod($cartId, $paymentMethod);
$this->placeOrder($cartId);
}
/**
* @return string
*/
private function findProduct(): string
{
$query = <<<QUERY
{
products (
filter: {
sku: {
eq:"simple1"
}
}
pageSize: 1
currentPage: 1
) {
items {
sku
}
}
}
QUERY;
$response = $this->graphQlQuery($query);
self::assertArrayHasKey('products', $response);
self::assertArrayHasKey('items', $response['products']);
self::assertCount(1, $response['products']['items']);
$product = current($response['products']['items']);
self::assertArrayHasKey('sku', $product);
self::assertNotEmpty($product['sku']);
return $product['sku'];
}
/**
* @return string
*/
private function createEmptyCart(): string
{
$query = <<<QUERY
mutation {
createEmptyCart
}
QUERY;
$response = $this->graphQlMutation($query);
self::assertArrayHasKey('createEmptyCart', $response);
self::assertNotEmpty($response['createEmptyCart']);
return $response['createEmptyCart'];
}
/**
* @param string $cartId
* @return void
*/
private function setGuestEmailOnCart(string $cartId): void
{
$query = <<<QUERY
mutation {
setGuestEmailOnCart(
input: {
cart_id: "{$cartId}"
email: "customer@example.com"
}
) {
cart {
email
}
}
}
QUERY;
$this->graphQlMutation($query);
}
/**
* @param string $cartId
* @param float $quantity
* @param string $sku
* @return void
*/
private function addProductToCart(string $cartId, float $quantity, string $sku): void
{
$query = <<<QUERY
mutation {
addSimpleProductsToCart(
input: {
cart_id: "{$cartId}"
cart_items: [
{
data: {
quantity: {$quantity}
sku: "{$sku}"
}
}
]
}
) {
cart {
items {
quantity
product {
sku
}
}
}
}
}
QUERY;
$this->graphQlMutation($query);
}
/**
* @param string $cartId
* @param array $auth
* @return array
*/
private function setBillingAddress(string $cartId): void
{
$query = <<<QUERY
mutation {
setBillingAddressOnCart(
input: {
cart_id: "{$cartId}"
billing_address: {
address: {
firstname: "test firstname"
lastname: "test lastname"
company: "test company"
street: ["test street 1", "test street 2"]
city: "test city"
postcode: "887766"
telephone: "88776655"
region: "TX"
country_code: "US"
}
}
}
) {
cart {
billing_address {
__typename
}
}
}
}
QUERY;
$this->graphQlMutation($query);
}
/**
* @param string $cartId
* @return array
*/
private function setShippingAddress(string $cartId): array
{
$query = <<<QUERY
mutation {
setShippingAddressesOnCart(
input: {
cart_id: "$cartId"
shipping_addresses: [
{
address: {
firstname: "test firstname"
lastname: "test lastname"
company: "test company"
street: ["test street 1", "test street 2"]
city: "test city"
region: "TX"
postcode: "887766"
country_code: "US"
telephone: "88776655"
}
}
]
}
) {
cart {
shipping_addresses {
available_shipping_methods {
carrier_code
method_code
amount {
value
}
}
}
}
}
}
QUERY;
$response = $this->graphQlMutation($query);
self::assertArrayHasKey('setShippingAddressesOnCart', $response);
self::assertArrayHasKey('cart', $response['setShippingAddressesOnCart']);
self::assertArrayHasKey('shipping_addresses', $response['setShippingAddressesOnCart']['cart']);
self::assertCount(1, $response['setShippingAddressesOnCart']['cart']['shipping_addresses']);
$shippingAddress = current($response['setShippingAddressesOnCart']['cart']['shipping_addresses']);
self::assertArrayHasKey('available_shipping_methods', $shippingAddress);
self::assertCount(1, $shippingAddress['available_shipping_methods']);
$availableShippingMethod = current($shippingAddress['available_shipping_methods']);
self::assertArrayHasKey('carrier_code', $availableShippingMethod);
self::assertNotEmpty($availableShippingMethod['carrier_code']);
self::assertArrayHasKey('method_code', $availableShippingMethod);
self::assertNotEmpty($availableShippingMethod['method_code']);
self::assertArrayHasKey('amount', $availableShippingMethod);
self::assertArrayHasKey('value', $availableShippingMethod['amount']);
self::assertNotEmpty($availableShippingMethod['amount']['value']);
return $availableShippingMethod;
}
/**
* @param string $cartId
* @param array $method
* @return array
*/
private function setShippingMethod(string $cartId, array $method): array
{
$query = <<<QUERY
mutation {
setShippingMethodsOnCart(input: {
cart_id: "{$cartId}",
shipping_methods: [
{
carrier_code: "{$method['carrier_code']}"
method_code: "{$method['method_code']}"
}
]
}) {
cart {
available_payment_methods {
code
title
}
}
}
}
QUERY;
$response = $this->graphQlMutation($query);
self::assertArrayHasKey('setShippingMethodsOnCart', $response);
self::assertArrayHasKey('cart', $response['setShippingMethodsOnCart']);
self::assertArrayHasKey('available_payment_methods', $response['setShippingMethodsOnCart']['cart']);
self::assertCount(1, $response['setShippingMethodsOnCart']['cart']['available_payment_methods']);
$availablePaymentMethod = current($response['setShippingMethodsOnCart']['cart']['available_payment_methods']);
self::assertArrayHasKey('code', $availablePaymentMethod);
self::assertNotEmpty($availablePaymentMethod['code']);
self::assertArrayHasKey('title', $availablePaymentMethod);
self::assertNotEmpty($availablePaymentMethod['title']);
return $availablePaymentMethod;
}
/**
* @param string $cartId
* @param array $method
* @return void
*/
private function setPaymentMethod(string $cartId, array $method): void
{
$query = <<<QUERY
mutation {
setPaymentMethodOnCart(
input: {
cart_id: "{$cartId}"
payment_method: {
code: "{$method['code']}"
}
}
) {
cart {
selected_payment_method {
code
}
}
}
}
QUERY;
$this->graphQlMutation($query);
}
/**
* @param string $cartId
* @return void
*/
private function placeOrder(string $cartId): void
{
$query = <<<QUERY
mutation {
placeOrder(
input: {
cart_id: "{$cartId}"
}
) {
order {
order_number
}
}
}
QUERY;
$response = $this->graphQlMutation($query);
self::assertArrayHasKey('placeOrder', $response);
self::assertArrayHasKey('order', $response['placeOrder']);
self::assertArrayHasKey('order_number', $response['placeOrder']['order']);
self::assertNotEmpty($response['placeOrder']['order']['order_number']);
}
protected function tearDown(): void
{
$this->deleteQuote();
$this->deleteOrder();
parent::tearDown();
}
/**
* @return void
*/
private function deleteQuote(): void
{
$quoteCollection = $this->quoteCollectionFactory->create();
foreach ($quoteCollection as $quote) {
$this->quoteResource->delete($quote);
$quoteIdMask = $this->quoteIdMaskFactory->create();
$quoteIdMask->setQuoteId($quote->getId())
->delete();
}
}
/**
* @return void
*/
private function deleteOrder()
{
$this->registry->unregister('isSecureArea');
$this->registry->register('isSecureArea', true);
$orderCollection = $this->orderCollectionFactory->create();
foreach ($orderCollection as $order) {
$this->orderRepository->delete($order);
}
$this->registry->unregister('isSecureArea');
$this->registry->register('isSecureArea', false);
}
}