/
githubmirror
/
magento2
Обзор
Документация
Войти
/
githubmirror
/
magento2
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
2.4-develop
dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Customer/SetShippingAddressOnCartTest.php
2 208 строк
66 KB
Raj Mohan R
AC-16236::Upgrade Core Test Framework to PHPUnit 12 and Migrate from PHPUnit 10
11 фев 2026, 13:51
11 фев 2026, 13:51
152ed41
Код
Авторство
О чём код?
<?php /** * Copyright 2018 Adobe * All Rights Reserved. */ declare(strict_types=1); namespace Magento\GraphQl\Quote\Customer; use Magento\Catalog\Test\Fixture\Product as ProductFixture; use Magento\Customer\Api\AddressRepositoryInterface; use Magento\Customer\Api\CustomerRepositoryInterface; use Magento\Customer\Test\Fixture\Customer; use Magento\Customer\Test\Fixture\CustomerWithAddresses; use Magento\Framework\Api\SearchCriteriaBuilder; use Magento\GraphQl\Quote\GetMaskedQuoteIdByReservedOrderId; use Magento\Integration\Api\CustomerTokenServiceInterface; use Magento\Quote\Model\QuoteFactory; use Magento\Quote\Model\QuoteIdToMaskedQuoteIdInterface; use Magento\Quote\Model\ResourceModel\Quote as QuoteResource; use Magento\Quote\Test\Fixture\AddProductToCart; use Magento\Quote\Test\Fixture\CustomerCart as CustomerCartFixture; use Magento\Quote\Test\Fixture\QuoteIdMask; use Magento\TestFramework\Fixture\DataFixture; use Magento\TestFramework\Fixture\DataFixtureStorageManager; use Magento\TestFramework\Helper\Bootstrap; use Magento\TestFramework\TestCase\GraphQlAbstract; use PHPUnit\Framework\Attributes\DataProvider; /** * Test for set shipping addresses on cart mutation * * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class SetShippingAddressOnCartTest extends GraphQlAbstract { /** * @var QuoteResource */ private $quoteResource; /** * @var QuoteFactory */ private $quoteFactory; /** * @var QuoteIdToMaskedQuoteIdInterface */ private $quoteIdToMaskedId; /** * @var GetMaskedQuoteIdByReservedOrderId */ private $getMaskedQuoteIdByReservedOrderId; /** * @var CustomerTokenServiceInterface */ private $customerTokenService; /** * @var AddressRepositoryInterface */ private $customerAddressRepository; /** * @var SearchCriteriaBuilder */ private $searchCriteriaBuilder; /** * @var CustomerRepositoryInterface */ private $customerRepository; protected function setUp(): void { $this->quoteResource = Bootstrap::getObjectManager()->get(QuoteResource::class); $this->quoteFactory = Bootstrap::getObjectManager()->get(QuoteFactory::class); $this->quoteIdToMaskedId = Bootstrap::getObjectManager()->get(QuoteIdToMaskedQuoteIdInterface::class); $this->getMaskedQuoteIdByReservedOrderId = Bootstrap::getObjectManager() ->get(GetMaskedQuoteIdByReservedOrderId::class); $this->customerTokenService = Bootstrap::getObjectManager()->get(CustomerTokenServiceInterface::class); $this->customerAddressRepository = Bootstrap::getObjectManager()->get(AddressRepositoryInterface::class); $this->searchCriteriaBuilder = Bootstrap::getObjectManager()->get(SearchCriteriaBuilder::class); $this->customerRepository = Bootstrap::getObjectManager()->get(CustomerRepositoryInterface::class); } /** * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php */ public function testSetNewShippingAddressOnCartWithSimpleProduct() { $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: [ { address: { firstname: "test firstname" lastname: "test lastname" company: "test company" street: ["test street 1", "test street 2"] city: "test city" region: "AZ" region_id: 4 postcode: "887766" country_code: "US" telephone: "88776655" } customer_notes: "Test note" } ] } ) { cart { shipping_addresses { firstname lastname company street city postcode telephone country { label code } __typename customer_notes } } } } QUERY; $response = $this->graphQlMutation($query, [], '', $this->getHeaderMap()); self::assertArrayHasKey('cart', $response['setShippingAddressesOnCart']); $cartResponse = $response['setShippingAddressesOnCart']['cart']; self::assertArrayHasKey('shipping_addresses', $cartResponse); $shippingAddressResponse = current($cartResponse['shipping_addresses']); $this->assertNewShippingAddressFields($shippingAddressResponse); } /** * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php */ public function testSetShippingAddressOnCartWithRegionIdForSimpleProduct() { $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: [ { address: { firstname: "Francesco" lastname: "Alba" company: "Magento" street: ["Via Solferino", "45"] city: "Ceriano Laghetto" region: "58" postcode: "20816" country_code: "FR" telephone: "3273581975", save_in_address_book: false } } ] } ) { cart { shipping_addresses { firstname lastname company street city region { code label } postcode telephone country { label code } } } } } QUERY; $response = $this->graphQlMutation($query, [], '', $this->getHeaderMap()); self::assertArrayHasKey('cart', $response['setShippingAddressesOnCart']); $cartResponse = $response['setShippingAddressesOnCart']['cart']; self::assertArrayHasKey('shipping_addresses', $cartResponse); $shippingAddressResponse = current($cartResponse['shipping_addresses']); $this->assertShippingAddressWithRegionIdFields($shippingAddressResponse); } /** * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoApiDataFixture Magento/Catalog/_files/product_virtual.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_virtual_product.php * */ public function testSetNewShippingAddressOnCartWithVirtualProduct() { $this->expectException(\Exception::class); $this->expectExceptionMessage('Shipping address is not allowed on cart: cart contains no items for shipment.'); $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: [ { address: { firstname: "test firstname" lastname: "test lastname" company: "test company" street: ["test street 1", "test street 2"] city: "test city" region: "AZ" region_id: 4 postcode: "887766" country_code: "US" telephone: "88776655" } } ] } ) { cart { shipping_addresses { city } } } } QUERY; $this->graphQlMutation($query, [], '', $this->getHeaderMap()); } /** * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoApiDataFixture Magento/Customer/_files/customer_two_addresses.php * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php */ public function testSetShippingAddressFromAddressBook() { $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: [ { customer_address_id: 1 } ] } ) { cart { shipping_addresses { firstname lastname company street city postcode telephone } } } } QUERY; $response = $this->graphQlMutation($query, [], '', $this->getHeaderMap()); self::assertArrayHasKey('cart', $response['setShippingAddressesOnCart']); $cartResponse = $response['setShippingAddressesOnCart']['cart']; self::assertArrayHasKey('shipping_addresses', $cartResponse); $shippingAddressResponse = current($cartResponse['shipping_addresses']); $this->assertSavedShippingAddressFields($shippingAddressResponse); } /** * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoApiDataFixture Magento/Customer/_files/customer_two_addresses.php * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php */ public function testVerifyShippingAddressType() { $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: [ { customer_address_id: 1 } ] } ) { cart { shipping_addresses { __typename } } } } QUERY; $response = $this->graphQlMutation($query, [], '', $this->getHeaderMap()); $shippingAddresses = current($response['setShippingAddressesOnCart']['cart']['shipping_addresses']); self::assertArrayHasKey('__typename', $shippingAddresses); self::assertEquals('ShippingCartAddress', $shippingAddresses['__typename']); } /** * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php * */ public function testSetNonExistentShippingAddressFromAddressBook() { $this->expectException(\Exception::class); $this->expectExceptionMessage('Could not find a address with ID "100"'); $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: [ { customer_address_id: 100 } ] } ) { cart { shipping_addresses { city } } } } QUERY; $this->graphQlMutation($query, [], '', $this->getHeaderMap()); } /** * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoApiDataFixture Magento/Customer/_files/customer_two_addresses.php * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php */ public function testSetNewShippingAddressAndFromAddressBookAtSameTime() { $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: [ { customer_address_id: 1, address: { firstname: "test firstname" lastname: "test lastname" company: "test company" street: ["test street 1", "test street 2"] city: "test city" region: "AZ" postcode: "887766" country_code: "US" telephone: "88776655" } } ] } ) { cart { shipping_addresses { city } } } } QUERY; self::expectExceptionMessage( 'The shipping address cannot contain "customer_address_id" or ' . '"customer_address_uid" together with "address".' ); $this->graphQlMutation($query, [], '', $this->getHeaderMap()); } /** * _security * @magentoApiDataFixture Magento/Customer/_files/three_customers.php * @magentoApiDataFixture Magento/Customer/_files/customer_address.php * @magentoApiDataFixture Magento/Checkout/_files/quote_with_simple_product_saved.php * */ public function testSetShippingAddressIfCustomerIsNotOwnerOfAddress() { $this->expectException(\Exception::class); $this->expectExceptionMessage('Current customer does not have permission to address with ID "1"'); $maskedQuoteId = $this->assignQuoteToCustomer('test_order_with_simple_product_without_address', 2); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: [ { customer_address_id: 1 } ] } ) { cart { shipping_addresses { postcode } } } } QUERY; $this->graphQlMutation($query, [], '', $this->getHeaderMap('customer2@search.example.com')); } #[ DataFixture(CustomerWithAddresses::class, as: 'customer'), DataFixture(Customer::class, as: 'customer2'), DataFixture(Customer::class, as: 'customer3'), DataFixture(ProductFixture::class, ['sku' => 'simple'], as: 'product'), DataFixture(CustomerCartFixture::class, ['customer_id' => '$customer.id$'], as: 'cart'), DataFixture(QuoteIdMask::class, ['cart_id' => '$cart.id$'], 'quoteIdMask'), DataFixture(AddProductToCart::class, ['cart_id' => '$cart.id$', 'product_id' => '$product.id$']) ] public function testSetShippingAddressToAnotherCustomerCart() { $maskedQuoteId = DataFixtureStorageManager::getStorage()->get('quoteIdMask')->getMaskedId(); $this->expectException(\Exception::class); $this->expectExceptionMessage( "The current user cannot perform operations on cart \"$maskedQuoteId\"" ); $query = <<<MUTATION mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: [ { customer_address_id: 1 } ] } ) { cart { shipping_addresses { postcode } } } } MUTATION; $this->graphQlMutation( $query, [], '', $this->getHeaderMap(DataFixtureStorageManager::getStorage()->get('customer2')->getEmail()) ); } /** * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php * * @param string $input * @param string $message * @throws \Exception */ #[DataProvider('dataProviderUpdateWithMissedRequiredParameters')] public function testSetNewShippingAddressWithMissedRequiredParameters(string $input, string $message) { $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); $input = str_replace('cart_id_value', $maskedQuoteId, $input); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { {$input} } ) { cart { shipping_addresses { city } } } } QUERY; $this->expectExceptionMessage($message); $this->graphQlMutation($query, [], '', $this->getHeaderMap()); } /** * Covers case with empty street * * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php * */ public function testSetNewShippingAddressWithMissedRequiredStreetParameters() { $this->expectException(\Exception::class); $this->expectExceptionMessage('Field CartAddressInput.street of required type [String]! was not provided.'); $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: [ { address: { country_code: "US" firstname: "J" lastname: "D" telephone: "+" city: "C" } } ] } ) { cart { shipping_addresses { city } } } } QUERY; $this->graphQlMutation($query, [], '', $this->getHeaderMap()); } /** * @return array */ public static function dataProviderUpdateWithMissedRequiredParameters(): array { return [ 'missed_region' => [ 'cart_id: "cart_id_value" shipping_addresses: [{ address: { firstname: "test firstname" lastname: "test lastname" company: "test company" street: ["test street 1", "test street 2"] city: "test city" postcode: "887766" country_code: "US" telephone: "88776655" } }]', 'Region is required.' ], 'missed_postal_code' => [ 'cart_id: "cart_id_value" shipping_addresses: [{ address: { firstname: "test firstname" lastname: "test lastname" company: "test company" street: ["test street 1", "test street 2"] city: "test city" region: "TX" region_id: 57 country_code: "US" telephone: "88776655" } }]', '"postcode" is required. Enter and try again.' ], 'wrong_required_region' => [ 'cart_id: "cart_id_value" shipping_addresses: [{ address: { firstname: "test firstname" lastname: "test lastname" company: "test company" street: ["test street 1", "test street 2"] region: "wrong region" region_id: 17 city: "test city" country_code: "US" postcode: "887766" telephone: "88776655" } }]', 'The region_id does not match the selected country or region' ], 'wrong_required_region_name' => [ 'cart_id: "cart_id_value" shipping_addresses: [{ address: { firstname: "test firstname" lastname: "test lastname" company: "test company" street: ["test street 1", "test street 2"] region: "wrong region" region_id: 45 city: "test city" country_code: "US" postcode: "887766" telephone: "88776655" } }]', 'The region_id does not match the selected country or region' ], ]; } /** * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php * */ public function testSetMultipleNewShippingAddresses() { $this->expectException(\Exception::class); $this->expectExceptionMessage('You cannot specify multiple shipping addresses.'); $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: [ { address: { firstname: "test firstname" lastname: "test lastname" company: "test company" street: ["test street 1", "test street 2"] city: "test city" region: "AZ" postcode: "887766" country_code: "US" telephone: "88776655" } }, { address: { firstname: "test firstname 2" lastname: "test lastname 2" company: "test company 2" street: ["test street 1", "test street 2"] city: "test city" region: "AZ" postcode: "887766" country_code: "US" telephone: "88776655" } } ] } ) { cart { shipping_addresses { city } } } } QUERY; $this->graphQlMutation($query, [], '', $this->getHeaderMap()); } /** * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php */ public function testSetNewShippingAddressOnCartWithRedundantStreetLine() { $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: [ { address: { firstname: "test firstname" lastname: "test lastname" company: "test company" street: ["test street 1", "test street 2", "test street 3"] city: "test city" region: "AZ" region_id: 4 postcode: "887766" country_code: "US" telephone: "88776655" } } ] } ) { cart { shipping_addresses { firstname } } } } QUERY; self::expectExceptionMessage('"Street Address" cannot contain more than 2 lines.'); $this->graphQlMutation($query, [], '', $this->getHeaderMap()); } /** * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoApiDataFixture Magento/Customer/_files/customer_address.php */ public function testSetShippingAddressOnNonExistentCart() { $this->expectException(\Exception::class); $this->expectExceptionMessage('Could not find a cart with ID "non_existent_masked_id"'); $maskedQuoteId = 'non_existent_masked_id'; $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: [ { customer_address_id: 1 } ] } ) { cart { shipping_addresses { city } } } } QUERY; $this->graphQlMutation($query, [], '', $this->getHeaderMap()); } /** * _security * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoApiDataFixture Magento/Customer/_files/customer_address.php * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/guest/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php */ public function testSetShippingAddressToGuestCart() { $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: { customer_address_id: 1 } } ) { cart { shipping_addresses { city } } } } QUERY; $this->expectExceptionMessage( "The current user cannot perform operations on cart \"{$maskedQuoteId}\"" ); $this->graphQlMutation($query, [], '', $this->getHeaderMap()); } /** * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php */ public function testSetShippingAddressWithLowerCaseCountry() { $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "{$maskedQuoteId}" shipping_addresses: [ { address: { firstname: "John" lastname: "Doe" street: ["6161 West Centinella Avenue"] city: "Culver City" region: "CA" region_id: 12 postcode: "90230" country_code: "us" telephone: "555-555-55-55" } } ] } ) { cart { shipping_addresses { region { code } country { code } } } } } QUERY; $result = $this->graphQlMutation($query, [], '', $this->getHeaderMap()); self::assertCount(1, $result['setShippingAddressesOnCart']['cart']['shipping_addresses']); $address = reset($result['setShippingAddressesOnCart']['cart']['shipping_addresses']); $this->assertEquals('US', $address['country']['code']); $this->assertEquals('CA', $address['region']['code']); } /** * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php */ public function testWithInvalidShippingAddressesInput() { $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: [ { address: { firstname: "John" lastname: "Doe" street: ["6161 West Centinella Avenue"] city: "Culver City" region: "CA" postcode: "90230" country_code: "USS" telephone: "555-555-55-55" } } ] } ) { cart { shipping_addresses { city } } } } QUERY; $this->expectExceptionMessage('Country is not available'); $this->graphQlMutation($query, [], '', $this->getHeaderMap()); } /** * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php */ public function testSetShippingAddressesWithNotRequiredRegion() { $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: [ { address: { firstname: "Vasyl" lastname: "Doe" street: ["Via della Posta"] city: "Vatican City" region: "Vatican City" postcode: "00120" country_code: "VA" telephone: "555-555-55-55" } } ] } ) { cart { shipping_addresses { region { label } country { code } } } } } QUERY; $response = $this->graphQlMutation($query, [], '', $this->getHeaderMap()); self::assertArrayHasKey('cart', $response['setShippingAddressesOnCart']); $cartResponse = $response['setShippingAddressesOnCart']['cart']; self::assertEquals('VA', $cartResponse['shipping_addresses'][0]['country']['code']); self::assertEquals('Vatican City', $cartResponse['shipping_addresses'][0]['region']['label']); } /** * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php */ public function testSetNewShippingAddressWithSaveInAddressBook() { $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: [ { address: { firstname: "test firstname" lastname: "test lastname" company: "test company" street: ["test street 1", "test street 2"] city: "test city" region: "AZ" region_id: 4 postcode: "887766" country_code: "US" telephone: "88776655" save_in_address_book: true } customer_notes: "Test note" } ] } ) { cart { shipping_addresses { firstname lastname company street city postcode telephone country { code label } region { code label } __typename customer_notes } } } } QUERY; $response = $this->graphQlMutation($query, [], '', $this->getHeaderMap()); $customer = $this->customerRepository->get('customer@example.com'); $searchCriteria = $this->searchCriteriaBuilder->addFilter('parent_id', $customer->getId())->create(); $addresses = $this->customerAddressRepository->getList($searchCriteria)->getItems(); self::assertCount(0, $addresses); self::assertArrayHasKey('cart', $response['setShippingAddressesOnCart']); $cartResponse = $response['setShippingAddressesOnCart']['cart']; self::assertArrayHasKey('shipping_addresses', $cartResponse); $shippingAddressResponse = current($cartResponse['shipping_addresses']); $this->assertNewShippingAddressFields($shippingAddressResponse); foreach ($addresses as $address) { $this->customerAddressRepository->delete($address); } } /** * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php */ public function testSetNewShippingAddressWithNotSaveInAddressBook() { $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: [ { address: { firstname: "test firstname" lastname: "test lastname" company: "test company" street: ["test street 1", "test street 2"] city: "test city" region: "AZ" region_id: 4 postcode: "887766" country_code: "US" telephone: "88776655" save_in_address_book: false } customer_notes: "Test note" } ] } ) { cart { shipping_addresses { firstname lastname company street city postcode telephone country { code label } __typename customer_notes } } } } QUERY; $response = $this->graphQlMutation($query, [], '', $this->getHeaderMap()); $customer = $this->customerRepository->get('customer@example.com'); $searchCriteria = $this->searchCriteriaBuilder->addFilter('parent_id', $customer->getId())->create(); $addresses = $this->customerAddressRepository->getList($searchCriteria)->getItems(); self::assertCount(0, $addresses); self::assertArrayHasKey('cart', $response['setShippingAddressesOnCart']); $cartResponse = $response['setShippingAddressesOnCart']['cart']; self::assertArrayHasKey('shipping_addresses', $cartResponse); $shippingAddressResponse = current($cartResponse['shipping_addresses']); $this->assertNewShippingAddressFields($shippingAddressResponse); foreach ($addresses as $address) { $this->customerAddressRepository->delete($address); } } /** * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php */ public function testSetShippingAddressOnCartWithBothRegionAndRegionId() { $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: [ { address: { firstname: "test firstname" lastname: "test lastname" company: "test company" street: ["test street 1", "test street 2"] city: "APO" region: "AE" region_id: 10 postcode: "887766" country_code: "US" telephone: "88776655" } } ] } ) { cart { shipping_addresses { firstname lastname company street city postcode telephone country { label code } region { code label region_id } __typename } } } } QUERY; $response = $this->graphQlMutation($query, [], '', $this->getHeaderMap()); $this->assertArrayHasKey('cart', $response['setShippingAddressesOnCart']); $cartResponse = $response['setShippingAddressesOnCart']['cart']; $this->assertArrayHasKey('shipping_addresses', $cartResponse); $shippingAddressResponse = current($cartResponse['shipping_addresses']); $expectedRegionCode = "AE"; $expectedRegionLabel = "Armed Forces Middle East"; $this->assertEquals($expectedRegionCode, $shippingAddressResponse['region']['code']); $this->assertEquals($expectedRegionLabel, $shippingAddressResponse['region']['label']); $this->assertEquals(10, $shippingAddressResponse['region']['region_id']); } /** * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php */ public function testSetShippingAddressOnCartWithFreeFormRegionForNoRequiredCountry() { $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: [ { address: { firstname: "test firstname" lastname: "test lastname" company: "test company" street: ["test street 1", "test street 2"] city: "London" region: "Some" postcode: "887766" country_code: "GB" telephone: "88776655" } } ] } ) { cart { shipping_addresses { firstname lastname company street city postcode telephone country { label code } region { code label region_id } __typename } } } } QUERY; $response = $this->graphQlMutation($query, [], '', $this->getHeaderMap()); $this->assertArrayHasKey('cart', $response['setShippingAddressesOnCart']); $cartResponse = $response['setShippingAddressesOnCart']['cart']; $this->assertArrayHasKey('shipping_addresses', $cartResponse); $shippingAddressResponse = current($cartResponse['shipping_addresses']); $expectedRegionCode = "Some"; $expectedRegionLabel = "Some"; $this->assertEquals($expectedRegionCode, $shippingAddressResponse['region']['code']); $this->assertEquals($expectedRegionLabel, $shippingAddressResponse['region']['label']); $this->assertEquals(null, $shippingAddressResponse['region']['region_id']); } /** * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php */ public function testSetShippingAddressOnCartWithRegionOnExistingDuplicateRegionCode() { $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: [ { address: { firstname: "John" lastname: "Smith" company: "Magento" street: ["Magento Pkwy", "Main Street"] city: "APO" region: "AE" postcode: "09369" country_code: "US" telephone: "8675309" } } ] } ) { cart { shipping_addresses { firstname lastname company street city postcode telephone country { label code } region { code label } __typename } } } } QUERY; $this->expectExceptionMessage( 'Region input is ambiguous. Specify region_id.' ); $this->graphQlMutation($query, [], '', $this->getHeaderMap()); } /** * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php */ public function testSetShippingAddressOnCartWithRegionOnExistingDuplicateRegionCodeWithWrongRegionId() { $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: [ { address: { firstname: "John" lastname: "Smith" company: "Magento" street: ["Magento Pkwy", "Main Street"] city: "APO" region: "AE" region_id: 17 postcode: "09369" country_code: "US" telephone: "8675309" } } ] } ) { cart { shipping_addresses { firstname lastname company street city postcode telephone country { label code } region { code label } __typename } } } } QUERY; $this->expectExceptionMessage( 'The region_id does not match the selected country or region' ); $this->graphQlMutation($query, [], '', $this->getHeaderMap()); } /** * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php */ public function testSetShippingAddressOnCartWithWrongRegionId() { $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: [ { address: { firstname: "test firstname" lastname: "test lastname" company: "test company" street: ["test street 1", "test street 2"] city: "Dallas" region: "TX" region_id: 45 postcode: "887766" country_code: "US" telephone: "88776655" } } ] } ) { cart { shipping_addresses { firstname lastname company street city postcode telephone country { label code } region { code label } __typename } } } } QUERY; $this->expectExceptionMessage( 'The region_id does not match the selected country or region' ); $this->graphQlMutation($query, [], '', $this->getHeaderMap()); } /** * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php */ public function testSetShippingAddressOnCartWithCorrectRegionId() { $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: [ { address: { firstname: "test firstname" lastname: "test lastname" company: "test company" street: ["test street 1", "test street 2"] city: "Dallas" region: "TX" region_id: 57 postcode: "887766" country_code: "US" telephone: "88776655" } } ] } ) { cart { shipping_addresses { firstname lastname company street city postcode telephone country { label code } region { code label } __typename } } } } QUERY; $response = $this->graphQlMutation($query, [], '', $this->getHeaderMap()); $this->assertArrayHasKey('cart', $response['setShippingAddressesOnCart']); $cartResponse = $response['setShippingAddressesOnCart']['cart']; $this->assertArrayHasKey('shipping_addresses', $cartResponse); $shippingAddressResponse = current($cartResponse['shipping_addresses']); $expectedRegionCode = "TX"; $expectedRegionLabel = "Texas"; $this->assertEquals($expectedRegionCode, $shippingAddressResponse['region']['code']); $this->assertEquals($expectedRegionLabel, $shippingAddressResponse['region']['label']); } /** * @magentoApiDataFixture Magento/Customer/_files/customer_without_addresses.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function testSetShippingAddressOnCartWithCreateCustomerAddressRegionCodeAndRegionId() { $newAddress = [ 'region' => [ 'region_code' => 'NY', 'region_id' => 43 ], 'country_code' => 'US', 'street' => ['Line 1 Street', 'Line 2'], 'company' => 'Company name', 'telephone' => '123456789', 'postcode' => '10019', 'city' => 'Manhattan', 'firstname' => 'Adam', 'lastname' => 'Phillis' ]; $mutation = <<<MUTATION mutation { createCustomerAddress(input: { region: { region_code: "{$newAddress['region']['region_code']}" region_id: {$newAddress['region']['region_id']} } country_code: {$newAddress['country_code']} street: ["{$newAddress['street'][0]}","{$newAddress['street'][1]}"] company: "{$newAddress['company']}" telephone: "{$newAddress['telephone']}" postcode: "{$newAddress['postcode']}" city: "{$newAddress['city']}" firstname: "{$newAddress['firstname']}" lastname: "{$newAddress['lastname']}" }) { id customer_id region { region region_id region_code } country_code street company telephone postcode city firstname lastname } } MUTATION; $userName = 'customer@example.com'; $password = 'password'; $response = $this->graphQlMutation($mutation, [], '', $this->getHeaderMap($userName, $password)); $this->assertArrayHasKey('createCustomerAddress', $response); $this->assertArrayHasKey('customer_id', $response['createCustomerAddress']); $this->assertEquals(null, $response['createCustomerAddress']['customer_id']); $this->assertArrayHasKey('id', $response['createCustomerAddress']); $id = $response['createCustomerAddress']['id']; $this->assertEquals(43, $response["createCustomerAddress"]["region"]["region_id"]); $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: { customer_address_id: $id } } ) { cart { shipping_addresses { city region{ code label region_id } } } } } QUERY; $userName = 'customer@example.com'; $password = 'password'; $shippingAddressesResponse = $this->graphQlMutation( $query, [], '', $this->getHeaderMap($userName, $password) ); $cartResponse = $shippingAddressesResponse["setShippingAddressesOnCart"]["cart"]["shipping_addresses"][0]; $this->assertEquals( 43, $cartResponse["region"]["region_id"] ); } /** * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/set_new_billing_address.php */ public function testSetNewShippingAddressAndPlaceOrder() { $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: [ { address: { firstname: "test firstname" lastname: "test lastname" company: "test company" street: ["test street 1", "test street 2"] city: "test city" region: "AZ" postcode: "887766" country_code: "US" telephone: "88776655" save_in_address_book: true } customer_notes: "Test note" } ] } ) { cart { shipping_addresses { firstname lastname company street city postcode telephone country { code label } __typename customer_notes } } } } QUERY; $response = $this->graphQlMutation($query, [], '', $this->getHeaderMap()); $this->graphQlMutation( $this->getSetShippingMethodsQuery($maskedQuoteId, 'flatrate', 'flatrate'), [], '', $this->getHeaderMap() ); $this->graphQlMutation( $this->getSetPaymentMethodQuery( $maskedQuoteId, 'checkmo' ), [], '', $this->getHeaderMap() ); $this->graphQlMutation( $this->getPlaceOrderQuery($maskedQuoteId), [], '', $this->getHeaderMap() ); $customer = $this->customerRepository->get('customer@example.com'); $searchCriteria = $this->searchCriteriaBuilder->addFilter('parent_id', $customer->getId())->create(); $addresses = $this->customerAddressRepository->getList($searchCriteria)->getItems(); self::assertCount(1, $addresses); self::assertArrayHasKey('cart', $response['setShippingAddressesOnCart']); $cartResponse = $response['setShippingAddressesOnCart']['cart']; self::assertArrayHasKey('shipping_addresses', $cartResponse); $shippingAddressResponse = current($cartResponse['shipping_addresses']); $this->assertNewShippingAddressFields($shippingAddressResponse); foreach ($addresses as $address) { $this->customerAddressRepository->delete($address); } } /** * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/set_new_billing_address.php */ public function testSetNewShippingAddressWithDefaultValueOfSaveInAddressBookAndPlaceOrder() { $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: [ { address: { firstname: "test firstname" lastname: "test lastname" company: "test company" street: ["test street 1", "test street 2"] city: "test city" region: "AZ" postcode: "887766" country_code: "US" telephone: "88776655" } customer_notes: "Test note" } ] } ) { cart { shipping_addresses { firstname lastname company street city postcode telephone country { code label } __typename customer_notes } } } } QUERY; $response = $this->graphQlMutation($query, [], '', $this->getHeaderMap()); $this->graphQlMutation( $this->getSetShippingMethodsQuery($maskedQuoteId, 'flatrate', 'flatrate'), [], '', $this->getHeaderMap() ); $this->graphQlMutation( $this->getSetPaymentMethodQuery( $maskedQuoteId, 'checkmo' ), [], '', $this->getHeaderMap() ); $this->graphQlMutation( $this->getPlaceOrderQuery($maskedQuoteId), [], '', $this->getHeaderMap() ); $customer = $this->customerRepository->get('customer@example.com'); $searchCriteria = $this->searchCriteriaBuilder->addFilter('parent_id', $customer->getId())->create(); $addresses = $this->customerAddressRepository->getList($searchCriteria)->getItems(); $this->assertCount(1, $addresses); $this->assertArrayHasKey('cart', $response['setShippingAddressesOnCart']); $cartResponse = $response['setShippingAddressesOnCart']['cart']; $this->assertArrayHasKey('shipping_addresses', $cartResponse); $shippingAddressResponse = current($cartResponse['shipping_addresses']); $this->assertNewShippingAddressFields($shippingAddressResponse); foreach ($addresses as $address) { $this->customerAddressRepository->delete($address); } } /** * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php */ public function testSetShippingAddressOnCartWithNullCustomerAddressId() { $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: [ { customer_address_id: null } ] } ) { cart { shipping_addresses { firstname lastname company street city postcode telephone country { label code } region { code label } __typename } } } } QUERY; $this->expectExceptionMessage( 'The shipping address must contain either "customer_address_id" or ' . '"customer_address_uid" or "address".' ); $this->graphQlMutation($query, [], '', $this->getHeaderMap()); } /** * Verify the all the whitelisted fields for a New Address Object * * @param array $shippingAddressResponse */ private function assertNewShippingAddressFields(array $shippingAddressResponse): void { $assertionMap = [ ['response_field' => 'firstname', 'expected_value' => 'test firstname'], ['response_field' => 'lastname', 'expected_value' => 'test lastname'], ['response_field' => 'company', 'expected_value' => 'test company'], ['response_field' => 'street', 'expected_value' => [0 => 'test street 1', 1 => 'test street 2']], ['response_field' => 'city', 'expected_value' => 'test city'], ['response_field' => 'postcode', 'expected_value' => '887766'], ['response_field' => 'telephone', 'expected_value' => '88776655'], ['response_field' => 'country', 'expected_value' => ['code' => 'US', 'label' => 'US']], ['response_field' => '__typename', 'expected_value' => 'ShippingCartAddress'], ['response_field' => 'customer_notes', 'expected_value' => 'Test note'] ]; $this->assertResponseFields($shippingAddressResponse, $assertionMap); } /** * Verify the all the whitelisted fields for a New Address with region id Object * * @param array $shippingAddressResponse */ private function assertShippingAddressWithRegionIdFields(array $shippingAddressResponse): void { $assertionMap = [ ['response_field' => 'firstname', 'expected_value' => 'Francesco'], ['response_field' => 'lastname', 'expected_value' => 'Alba'], ['response_field' => 'company', 'expected_value' => 'Magento'], ['response_field' => 'street', 'expected_value' => [0 => 'Via Solferino', 1 => '45']], ['response_field' => 'city', 'expected_value' => 'Ceriano Laghetto'], ['response_field' => 'postcode', 'expected_value' => '20816'], ['response_field' => 'telephone', 'expected_value' => '3273581975'], ['response_field' => 'region', 'expected_value' => ['code' => '58', 'label' => 'Nièvre']], ['response_field' => 'country', 'expected_value' => ['code' => 'FR', 'label' => 'FR']] ]; $this->assertResponseFields($shippingAddressResponse, $assertionMap); } /** * Verify the all the whitelisted fields for a Address Object * * @param array $shippingAddressResponse */ private function assertSavedShippingAddressFields(array $shippingAddressResponse): void { $assertionMap = [ ['response_field' => 'firstname', 'expected_value' => 'John'], ['response_field' => 'lastname', 'expected_value' => 'Smith'], ['response_field' => 'company', 'expected_value' => 'CompanyName'], ['response_field' => 'street', 'expected_value' => [0 => 'Green str, 67']], ['response_field' => 'city', 'expected_value' => 'CityM'], ['response_field' => 'postcode', 'expected_value' => '75477'], ['response_field' => 'telephone', 'expected_value' => '3468676'] ]; $this->assertResponseFields($shippingAddressResponse, $assertionMap); } /** * @param string $username * @param string $password * @return array */ private function getHeaderMap(string $username = 'customer@example.com', string $password = 'password'): array { $customerToken = $this->customerTokenService->createCustomerAccessToken($username, $password); $headerMap = ['Authorization' => 'Bearer ' . $customerToken]; return $headerMap; } /** * @param string $reservedOrderId * @param int $customerId * @return string */ private function assignQuoteToCustomer( string $reservedOrderId = 'test_order_with_simple_product_without_address', int $customerId = 1 ): string { $quote = $this->quoteFactory->create(); $this->quoteResource->load($quote, $reservedOrderId, 'reserved_order_id'); $quote->setCustomerId($customerId); $this->quoteResource->save($quote); return $this->quoteIdToMaskedId->execute((int)$quote->getId()); } /** * @param string $maskedQuoteId * @param string $shippingMethodCode * @param string $shippingCarrierCode * @return string */ private function getSetShippingMethodsQuery( string $maskedQuoteId, string $shippingMethodCode, string $shippingCarrierCode ): string { return <<<QUERY mutation { setShippingMethodsOnCart(input: { cart_id: "$maskedQuoteId", shipping_methods: [{ carrier_code: "$shippingCarrierCode" method_code: "$shippingMethodCode" }] }) { cart { shipping_addresses { selected_shipping_method { carrier_code method_code carrier_title method_title amount { value currency } } } } } } QUERY; } /** * @param string $maskedQuoteId * @param string $methodCode * @return string */ private function getSetPaymentMethodQuery( string $maskedQuoteId, string $methodCode ) : string { return <<<QUERY mutation { setPaymentMethodOnCart(input: { cart_id: "$maskedQuoteId" payment_method: { code: "$methodCode" } }) { cart { selected_payment_method { code } } } } QUERY; } /** * @param string $maskedQuoteId * @return string */ private function getPlaceOrderQuery(string $maskedQuoteId): string { return <<<QUERY mutation { placeOrder(input: {cart_id: "{$maskedQuoteId}"}) { order { order_number } } } QUERY; } /** * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/set_new_billing_address.php * @magentoConfigFixture default_store checkout/options/guest_checkout 0 */ public function testSetNewShippingAddressAndPlaceOrderWithGuestCheckoutDisabled() { $this->testSetNewShippingAddressAndPlaceOrder(); } /** * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoApiDataFixture Magento/Customer/_files/attribute_telephone_not_required_address.php * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php */ public function testSetNewShippingAddressWithoutTelephone() { $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: { address: { firstname: "test firstname" lastname: "test lastname" company: "test company" street: ["test street 1", "test street 2"] city: "test city" region: "AZ" postcode: "887766" country_code: "US" telephone: "" } } } ) { cart { shipping_addresses { firstname lastname company street city postcode telephone country { code label } __typename } } } } QUERY; $response = $this->graphQlMutation($query, [], '', $this->getHeaderMap()); self::assertArrayHasKey('cart', $response['setShippingAddressesOnCart']); $cartResponse = $response['setShippingAddressesOnCart']['cart']; self::assertArrayHasKey('shipping_addresses', $cartResponse); $shippingAddressResponse = current($cartResponse['shipping_addresses']); $this->assertNewAddressWithoutTelephone($shippingAddressResponse); } /** * Verify the all the whitelisted fields for a New Address Object without telephone * * @param array $addressResponse */ private function assertNewAddressWithoutTelephone( array $addressResponse ): void { $assertionMap = [ ['response_field' => 'firstname', 'expected_value' => 'test firstname'], ['response_field' => 'lastname', 'expected_value' => 'test lastname'], ['response_field' => 'company', 'expected_value' => 'test company'], ['response_field' => 'street', 'expected_value' => [0 => 'test street 1', 1 => 'test street 2']], ['response_field' => 'city', 'expected_value' => 'test city'], ['response_field' => 'postcode', 'expected_value' => '887766'], ['response_field' => 'telephone', 'expected_value' => ''], ['response_field' => 'country', 'expected_value' => ['code' => 'US', 'label' => 'US']], ['response_field' => '__typename', 'expected_value' => 'ShippingCartAddress'] ]; $this->assertResponseFields($addressResponse, $assertionMap); } #[ DataFixture(Customer::class, as: 'customer'), DataFixture(ProductFixture::class, as: 'product'), DataFixture(CustomerCartFixture::class, ['customer_id' => '$customer.id$'], as: 'cart'), DataFixture(AddProductToCart::class, [ 'cart_id' => '$cart.id$', 'product_id' => '$product.id$', 'qty' => 1 ]), DataFixture(QuoteIdMask::class, ['cart_id' => '$cart.id$'], 'quoteIdMask') ] public function testSetShippingAddressWithEmptyPostcodeAndTelephone() { /** @var \Magento\Customer\Model\Customer $customer */ $customer = DataFixtureStorageManager::getStorage()->get('customer'); $customerData = $this->customerRepository->getById($customer->getId()); $maskedQuoteId = DataFixtureStorageManager::getStorage()->get('quoteIdMask')->getMaskedId(); $query = <<<QUERY mutation { setShippingAddressesOnCart( input: { cart_id: "$maskedQuoteId" shipping_addresses: [ { address: { firstname: "test firstname" lastname: "test lastname" company: "test company" street: ["test street 1", "test street 2"] city: "test city" region: "AZ" region_id: 4 postcode: "" country_code: "US" telephone: "" } } ] } ) { cart { shipping_addresses { postcode telephone } } } } QUERY; $this->expectExceptionMessage('"postcode" is required. Enter and try again.'); $this->graphQlMutation($query, [], '', $this->getHeaderMap($customerData->getEmail())); } }