diff --git a/app/code/Magento/SalesGraphQl/Model/Resolver/OrderIsVirtual.php b/app/code/Magento/SalesGraphQl/Model/Resolver/OrderIsVirtual.php new file mode 100644 index 0000000000000..0e9dacc489115 --- /dev/null +++ b/app/code/Magento/SalesGraphQl/Model/Resolver/OrderIsVirtual.php @@ -0,0 +1,43 @@ +getIsVirtual(); + } +} diff --git a/app/code/Magento/SalesGraphQl/etc/schema.graphqls b/app/code/Magento/SalesGraphQl/etc/schema.graphqls index e89eaea286f5f..e865f563e6e92 100644 --- a/app/code/Magento/SalesGraphQl/etc/schema.graphqls +++ b/app/code/Magento/SalesGraphQl/etc/schema.graphqls @@ -78,6 +78,7 @@ type CustomerOrder @doc(description: "Contains details about each of the custome token: String! @doc(description: "The token that can be used to retrieve the order using order query.") @resolver(class: "Magento\\SalesGraphQl\\Model\\Resolver\\Token") applied_coupons: [AppliedCoupon!]! @doc(description: "Coupons applied to the order.") email: String @doc(description: "Order customer email.") + is_virtual: Boolean! @doc(description: "`TRUE` if the order is virtual") @resolver(class: "Magento\\SalesGraphQl\\Model\\Resolver\\OrderIsVirtual") } type OrderAddress @doc(description: "Contains detailed information about an order's billing and shipping addresses."){ diff --git a/dev/tests/api-functional/testsuite/Magento/GraphQl/Sales/OrderIsVirtualTest.php b/dev/tests/api-functional/testsuite/Magento/GraphQl/Sales/OrderIsVirtualTest.php new file mode 100644 index 0000000000000..81a02292af09c --- /dev/null +++ b/dev/tests/api-functional/testsuite/Magento/GraphQl/Sales/OrderIsVirtualTest.php @@ -0,0 +1,161 @@ +customerTokenService = Bootstrap::getObjectManager()->get(CustomerTokenServiceInterface::class); + $this->fixtures = Bootstrap::getObjectManager()->get(DataFixtureStorageManager::class)->getStorage(); + } + + /** + * Test graphql customer orders is not virtual + * + * @return void + * @throws AuthenticationException|LocalizedException + * @throws Exception + */ + #[ + DataFixture(ProductFixture::class, as: 'product'), + DataFixture(CustomerFixture::class, as: 'customer'), + DataFixture(CustomerCartFixture::class, ['customer_id' => '$customer.id$'], as: 'quote'), + DataFixture(AddProductToCartFixture::class, ['cart_id' => '$quote.id$', 'product_id' => '$product.id$']), + DataFixture(SetBillingAddressFixture::class, ['cart_id' => '$quote.id$']), + DataFixture(SetShippingAddressFixture::class, ['cart_id' => '$quote.id$']), + DataFixture(SetDeliveryMethodFixture::class, ['cart_id' => '$quote.id$']), + DataFixture(SetPaymentMethodFixture::class, ['cart_id' => '$quote.id$']), + DataFixture(PlaceOrderFixture::class, ['cart_id' => '$quote.id$'], 'order'), + ] + public function testCustomerOrderIsNotVirtual(): void + { + $customerEmail = $this->fixtures->get('customer')->getEmail(); + $response = $this->graphQlQuery( + $this->getCustomerOrdersQuery(), + [], + '', + $this->getCustomerAuthHeaders($customerEmail) + ); + self::assertArrayHasKey('customerOrders', $response); + self::assertArrayHasKey('items', $response['customerOrders']); + self::assertCount(1, $response['customerOrders']['items']); + self::assertFalse($response['customerOrders']['items'][0]['is_virtual']); + } + + /** + * Test graphql customer orders is virtual + * + * @return void + * @throws AuthenticationException|LocalizedException + * @throws Exception + */ + #[ + DataFixture(ProductFixture::class, ['type_id' => 'virtual'], as: 'product'), + DataFixture(CustomerFixture::class, as: 'customer'), + DataFixture(CustomerCartFixture::class, ['customer_id' => '$customer.id$'], as: 'quote'), + DataFixture(AddProductToCartFixture::class, ['cart_id' => '$quote.id$', 'product_id' => '$product.id$']), + DataFixture(SetBillingAddressFixture::class, ['cart_id' => '$quote.id$']), + DataFixture(SetPaymentMethodFixture::class, ['cart_id' => '$quote.id$']), + DataFixture(PlaceOrderFixture::class, ['cart_id' => '$quote.id$'], 'order'), + ] + public function testCustomerOrderIsVirtual(): void + { + $customerEmail = $this->fixtures->get('customer')->getEmail(); + $response = $this->graphQlQuery( + $this->getCustomerOrdersQuery(), + [], + '', + $this->getCustomerAuthHeaders($customerEmail) + ); + self::assertArrayHasKey('customerOrders', $response); + self::assertArrayHasKey('items', $response['customerOrders']); + self::assertCount(1, $response['customerOrders']['items']); + self::assertTrue($response['customerOrders']['items'][0]['is_virtual']); + } + + /** + * Generate graphql query body for customer orders with 'is_virtual' field + * + * @return string + */ + private function getCustomerOrdersQuery(): string + { + return <<customerTokenService->createCustomerAccessToken($email, 'password'); + return ['Authorization' => 'Bearer ' . $customerToken]; + } +}