diff --git a/app/code/Magento/QuoteGraphQl/Model/Resolver/ShippingAddress/SelectedShippingMethod.php b/app/code/Magento/QuoteGraphQl/Model/Resolver/ShippingAddress/SelectedShippingMethod.php index fb51d17b042d..c6f25dd78823 100644 --- a/app/code/Magento/QuoteGraphQl/Model/Resolver/ShippingAddress/SelectedShippingMethod.php +++ b/app/code/Magento/QuoteGraphQl/Model/Resolver/ShippingAddress/SelectedShippingMethod.php @@ -59,15 +59,7 @@ public function resolve(Field $field, $context, ResolveInfo $info, array $value 'base_amount' => null, ]; } else { - $data = [ - 'carrier_code' => null, - 'method_code' => null, - 'carrier_title' => $carrierTitle, - 'method_title' => $methodTitle, - 'amount' => null, - /** @deprecated The field should not be used on the storefront */ - 'base_amount' => null, - ]; + $data = null; } return $data; } diff --git a/app/code/Magento/QuoteGraphQl/Model/Resolver/ShippingAddresses.php b/app/code/Magento/QuoteGraphQl/Model/Resolver/ShippingAddresses.php index eb3b0966740e..ae97f7efda45 100644 --- a/app/code/Magento/QuoteGraphQl/Model/Resolver/ShippingAddresses.php +++ b/app/code/Magento/QuoteGraphQl/Model/Resolver/ShippingAddresses.php @@ -13,6 +13,8 @@ use Magento\Framework\GraphQl\Schema\Type\ResolveInfo; use Magento\Quote\Model\Quote; use Magento\QuoteGraphQl\Model\Cart\ExtractQuoteAddressData; +use Magento\Framework\GraphQl\Schema\Type\TypeRegistry; +use Magento\Framework\App\ObjectManager; /** * @inheritdoc @@ -24,12 +26,21 @@ class ShippingAddresses implements ResolverInterface */ private $extractQuoteAddressData; + /** + * @var TypeRegistry + */ + private $typeRegistry; + /** * @param ExtractQuoteAddressData $extractQuoteAddressData + * @param TypeRegistry|null $typeRegistry */ - public function __construct(ExtractQuoteAddressData $extractQuoteAddressData) - { + public function __construct( + ExtractQuoteAddressData $extractQuoteAddressData, + TypeRegistry $typeRegistry = null + ) { $this->extractQuoteAddressData = $extractQuoteAddressData; + $this->typeRegistry = $typeRegistry ?: ObjectManager::getInstance()->get(TypeRegistry::class); } /** @@ -48,9 +59,38 @@ public function resolve(Field $field, $context, ResolveInfo $info, array $value if (count($shippingAddresses)) { foreach ($shippingAddresses as $shippingAddress) { - $addressesData[] = $this->extractQuoteAddressData->execute($shippingAddress); + $address = $this->extractQuoteAddressData->execute($shippingAddress); + + if ($this->validateAddressFromSchema($address)) { + $addressesData[] = $address; + } } } return $addressesData; } + + /** + * Validate data from address against mandatory fields from graphql schema for address + * + * @param array $address + * @return bool + */ + private function validateAddressFromSchema(array $address) : bool + { + /** @var \Magento\Framework\GraphQL\Schema\Type\Input\InputObjectType $cartAddressInput */ + $cartAddressInput = $this->typeRegistry->get('CartAddressInput'); + $fields = $cartAddressInput->getFields(); + + foreach ($fields as $field) { + if ($field->getType() instanceof \Magento\Framework\GraphQL\Schema\Type\NonNull) { + // an array key has to exist but it's value should not be null + if (array_key_exists($field->name, $address) + && !is_array($address[$field->name]) + && !isset($address[$field->name])) { + return false; + } + } + } + return true; + } } diff --git a/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Customer/GetSelectedShippingMethodTest.php b/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Customer/GetSelectedShippingMethodTest.php index 1fafc753e498..f5700d27fea7 100644 --- a/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Customer/GetSelectedShippingMethodTest.php +++ b/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Customer/GetSelectedShippingMethodTest.php @@ -100,18 +100,7 @@ public function testGetSelectedShippingMethodBeforeSet() $shippingAddress = current($response['cart']['shipping_addresses']); self::assertArrayHasKey('selected_shipping_method', $shippingAddress); - - self::assertArrayHasKey('carrier_code', $shippingAddress['selected_shipping_method']); - self::assertNull($shippingAddress['selected_shipping_method']['carrier_code']); - - self::assertArrayHasKey('method_code', $shippingAddress['selected_shipping_method']); - self::assertNull($shippingAddress['selected_shipping_method']['method_code']); - - self::assertArrayHasKey('carrier_title', $shippingAddress['selected_shipping_method']); - self::assertNull($shippingAddress['selected_shipping_method']['carrier_title']); - - self::assertArrayHasKey('method_title', $shippingAddress['selected_shipping_method']); - self::assertNull($shippingAddress['selected_shipping_method']['method_title']); + self::assertNull($shippingAddress['selected_shipping_method']); } /** @@ -174,12 +163,7 @@ public function testGetGetSelectedShippingMethodIfShippingMethodIsNotSet() $shippingAddress = current($response['cart']['shipping_addresses']); self::assertArrayHasKey('selected_shipping_method', $shippingAddress); - - self::assertNull($shippingAddress['selected_shipping_method']['carrier_code']); - self::assertNull($shippingAddress['selected_shipping_method']['method_code']); - self::assertNull($shippingAddress['selected_shipping_method']['carrier_title']); - self::assertNull($shippingAddress['selected_shipping_method']['method_title']); - self::assertNull($shippingAddress['selected_shipping_method']['amount']); + self::assertNull($shippingAddress['selected_shipping_method']); } /** diff --git a/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Customer/GetSpecifiedShippingAddressTest.php b/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Customer/GetSpecifiedShippingAddressTest.php index de3c384e6578..2023603a21ee 100644 --- a/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Customer/GetSpecifiedShippingAddressTest.php +++ b/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Customer/GetSpecifiedShippingAddressTest.php @@ -92,28 +92,7 @@ public function testGetSpecifiedShippingAddressIfShippingAddressIsNotSet() self::assertArrayHasKey('cart', $response); self::assertArrayHasKey('shipping_addresses', $response['cart']); - $expectedShippingAddressData = [ - 'firstname' => null, - 'lastname' => null, - 'company' => null, - 'street' => [ - '' - ], - 'city' => null, - 'region' => [ - 'code' => null, - 'label' => null, - ], - 'postcode' => null, - 'country' => [ - 'code' => null, - 'label' => null, - ], - 'telephone' => null, - '__typename' => 'ShippingCartAddress', - 'customer_notes' => null, - ]; - self::assertEquals($expectedShippingAddressData, current($response['cart']['shipping_addresses'])); + self::assertEquals([], $response['cart']['shipping_addresses']); } /** diff --git a/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/GetSelectedShippingMethodTest.php b/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/GetSelectedShippingMethodTest.php index fa22786e7aca..6a75cab1ff4c 100644 --- a/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/GetSelectedShippingMethodTest.php +++ b/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/GetSelectedShippingMethodTest.php @@ -91,18 +91,7 @@ public function testGetSelectedShippingMethodBeforeSet() $shippingAddress = current($response['cart']['shipping_addresses']); self::assertArrayHasKey('selected_shipping_method', $shippingAddress); - - self::assertArrayHasKey('carrier_code', $shippingAddress['selected_shipping_method']); - self::assertNull($shippingAddress['selected_shipping_method']['carrier_code']); - - self::assertArrayHasKey('method_code', $shippingAddress['selected_shipping_method']); - self::assertNull($shippingAddress['selected_shipping_method']['method_code']); - - self::assertArrayHasKey('carrier_title', $shippingAddress['selected_shipping_method']); - self::assertNull($shippingAddress['selected_shipping_method']['carrier_title']); - - self::assertArrayHasKey('method_title', $shippingAddress['selected_shipping_method']); - self::assertNull($shippingAddress['selected_shipping_method']['method_title']); + self::assertNull($shippingAddress['selected_shipping_method']); } /** diff --git a/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/GetSpecifiedShippingAddressTest.php b/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/GetSpecifiedShippingAddressTest.php index f71915bab650..b5fa0d8f12df 100644 --- a/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/GetSpecifiedShippingAddressTest.php +++ b/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/GetSpecifiedShippingAddressTest.php @@ -82,27 +82,7 @@ public function testGetSpecifiedShippingAddressIfShippingAddressIsNotSet() self::assertArrayHasKey('cart', $response); self::assertArrayHasKey('shipping_addresses', $response['cart']); - $expectedShippingAddressData = [ - 'firstname' => null, - 'lastname' => null, - 'company' => null, - 'street' => [ - '' - ], - 'city' => null, - 'region' => [ - 'code' => null, - 'label' => null, - ], - 'postcode' => null, - 'country' => [ - 'code' => null, - 'label' => null, - ], - 'telephone' => null, - '__typename' => 'ShippingCartAddress', - ]; - self::assertEquals($expectedShippingAddressData, current($response['cart']['shipping_addresses'])); + self::assertEquals([], $response['cart']['shipping_addresses']); } /**