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 = <<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 = <<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 = <<graphQlMutation($query); } /** * @param string $cartId * @param float $quantity * @param string $sku * @return void */ private function addProductToCart(string $cartId, float $quantity, string $sku): void { $query = <<graphQlMutation($query); } /** * @param string $cartId * @param array $auth * @return array */ private function setBillingAddress(string $cartId): void { $query = <<graphQlMutation($query); } /** * @param string $cartId * @return array */ private function setShippingAddress(string $cartId): array { $query = <<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 = <<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 = <<graphQlMutation($query); } /** * @param string $cartId * @return void */ private function placeOrder(string $cartId): void { $query = <<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); } }