From 6c01aaf4776a0f7897c0ab218c06454c8b00ed94 Mon Sep 17 00:00:00 2001 From: "vadim.malesh" Date: Tue, 23 Jun 2020 12:57:49 +0300 Subject: [PATCH] fix "parent" products sku inconsistency with product_id --- app/code/Magento/Quote/Model/Quote/Item.php | 2 +- .../Api/OrderItemRepositoryTest.php | 82 ++++++++++++++----- ..._one_configurable_product_for_customer.php | 41 ++++++++++ ...igurable_product_for_customer_rollback.php | 14 ++++ 4 files changed, 118 insertions(+), 21 deletions(-) create mode 100644 dev/tests/integration/testsuite/Magento/ConfigurableProduct/_files/order_with_one_configurable_product_for_customer.php create mode 100644 dev/tests/integration/testsuite/Magento/ConfigurableProduct/_files/order_with_one_configurable_product_for_customer_rollback.php diff --git a/app/code/Magento/Quote/Model/Quote/Item.php b/app/code/Magento/Quote/Model/Quote/Item.php index 2e4a9c7ded683..7ad76b434d4a0 100644 --- a/app/code/Magento/Quote/Model/Quote/Item.php +++ b/app/code/Magento/Quote/Model/Quote/Item.php @@ -430,7 +430,7 @@ public function setProduct($product) $this->setData('product', $product) ->setProductId($product->getId()) ->setProductType($product->getTypeId()) - ->setSku($this->getProduct()->getSku()) + ->setSku($product->getSku()) ->setName($product->getName()) ->setWeight($this->getProduct()->getWeight()) ->setTaxClassId($product->getTaxClassId()) diff --git a/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/OrderItemRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/OrderItemRepositoryTest.php index 4014674cd4532..b1db66f445b96 100644 --- a/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/OrderItemRepositoryTest.php +++ b/dev/tests/api-functional/testsuite/Magento/ConfigurableProduct/Api/OrderItemRepositoryTest.php @@ -3,10 +3,24 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ + +declare(strict_types=1); + namespace Magento\ConfigurableProduct\Api; +use Magento\Framework\Api\FilterBuilder; +use Magento\Framework\Api\SearchCriteriaBuilder; +use Magento\Framework\Webapi\Rest\Request; +use Magento\Sales\Model\OrderFactory; +use Magento\Sales\Model\Order\Item; +use Magento\TestFramework\Helper\Bootstrap; +use Magento\TestFramework\ObjectManager; +use Magento\Catalog\Model\ResourceModel\Product as ProductResource; use Magento\TestFramework\TestCase\WebapiAbstract; +/** + * Test for get order item + */ class OrderItemRepositoryTest extends WebapiAbstract { const RESOURCE_PATH = '/V1/orders/items'; @@ -17,29 +31,47 @@ class OrderItemRepositoryTest extends WebapiAbstract const ORDER_INCREMENT_ID = '100000001'; /** - * @var \Magento\TestFramework\ObjectManager + * @var ObjectManager */ - protected $objectManager; + private $objectManager; + /** + * @var ProductResource + */ + private $productResource; + + /** + * @var OrderFactory + */ + private $orderFactory; + + /** + * @inheritdoc + */ protected function setUp(): void { - $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); + $this->objectManager = Bootstrap::getObjectManager(); + $this->productResource = $this->objectManager->get(ProductResource::class); + $this->orderFactory = $this->objectManager->get(OrderFactory::class); } /** - * @magentoApiDataFixture Magento/ConfigurableProduct/_files/order_item_with_configurable_and_options.php + * Test get order item + * + * @magentoApiDataFixture Magento/ConfigurableProduct/_files/order_with_one_configurable_product_for_customer.php + * + * @return void */ - public function testGet() + public function testGet(): void { - /** @var \Magento\Sales\Model\Order $order */ - $order = $this->objectManager->create(\Magento\Sales\Model\Order::class); + $order = $this->orderFactory->create(); $order->loadByIncrementId(self::ORDER_INCREMENT_ID); $orderItem = current($order->getItems()); $serviceInfo = [ 'rest' => [ 'resourcePath' => self::RESOURCE_PATH . '/' . $orderItem->getId(), - 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET, + 'httpMethod' => Request::HTTP_METHOD_GET, ], 'soap' => [ 'service' => self::SERVICE_NAME, @@ -55,18 +87,21 @@ public function testGet() } /** - * @magentoApiDataFixture Magento/ConfigurableProduct/_files/order_item_with_configurable_and_options.php + * Test get order item list + * + * @magentoApiDataFixture Magento/ConfigurableProduct/_files/order_with_one_configurable_product_for_customer.php + * + * @return void */ - public function testGetList() + public function testGetList(): void { - /** @var \Magento\Sales\Model\Order $order */ - $order = $this->objectManager->create(\Magento\Sales\Model\Order::class); + $order = $this->orderFactory->create(); $order->loadByIncrementId(self::ORDER_INCREMENT_ID); - /** @var $searchCriteriaBuilder \Magento\Framework\Api\SearchCriteriaBuilder */ - $searchCriteriaBuilder = $this->objectManager->create(\Magento\Framework\Api\SearchCriteriaBuilder::class); - /** @var $filterBuilder \Magento\Framework\Api\FilterBuilder */ - $filterBuilder = $this->objectManager->create(\Magento\Framework\Api\FilterBuilder::class); + /** @var $searchCriteriaBuilder SearchCriteriaBuilder */ + $searchCriteriaBuilder = $this->objectManager->create(SearchCriteriaBuilder::class); + /** @var $filterBuilder FilterBuilder */ + $filterBuilder = $this->objectManager->create(FilterBuilder::class); $searchCriteriaBuilder->addFilters( [ @@ -81,7 +116,7 @@ public function testGetList() $serviceInfo = [ 'rest' => [ 'resourcePath' => self::RESOURCE_PATH . '?' . http_build_query($requestData), - 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET, + 'httpMethod' => Request::HTTP_METHOD_GET, ], 'soap' => [ 'service' => self::SERVICE_NAME, @@ -94,24 +129,31 @@ public function testGetList() $this->assertIsArray($response); $this->assertArrayHasKey('items', $response); - $this->assertCount(1, $response['items']); + $this->assertCount(2, $response['items']); $this->assertIsArray($response['items'][0]); $this->assertOrderItem(current($order->getItems()), $response['items'][0]); } /** - * @param \Magento\Sales\Model\Order\Item $orderItem + * Order item assert + * + * @param Item $orderItem * @param array $response * @return void */ - protected function assertOrderItem(\Magento\Sales\Model\Order\Item $orderItem, array $response) + private function assertOrderItem(Item $orderItem, array $response): void { $expected = $orderItem->getBuyRequest()->getSuperAttribute(); + $this->assertEquals($orderItem->getProductId(), $this->productResource->getIdBySku($response['sku'])); $this->assertArrayHasKey('product_option', $response); $this->assertArrayHasKey('extension_attributes', $response['product_option']); $this->assertArrayHasKey('configurable_item_options', $response['product_option']['extension_attributes']); + $this->assertArrayHasKey('sku', $response); + $this->assertArrayHasKey('product_id', $response); + $this->assertEquals($response['product_id'], $this->productResource->getIdBySku($response['sku'])); + $actualOptions = $response['product_option']['extension_attributes']['configurable_item_options']; $this->assertIsArray($actualOptions); diff --git a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/_files/order_with_one_configurable_product_for_customer.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/_files/order_with_one_configurable_product_for_customer.php new file mode 100644 index 0000000000000..09de61d7657ba --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/_files/order_with_one_configurable_product_for_customer.php @@ -0,0 +1,41 @@ +requireDataFixture('Magento/Customer/_files/customer.php'); +Resolver::getInstance()->requireDataFixture('Magento/GraphQl/Quote/_files/customer/create_empty_cart.php'); +Resolver::getInstance()->requireDataFixture('Magento/CatalogRule/_files/configurable_product.php'); +Resolver::getInstance()->requireDataFixture('Magento/GraphQl/Quote/_files/add_configurable_product.php'); +Resolver::getInstance()->requireDataFixture('Magento/GraphQl/Quote/_files/set_new_shipping_address.php'); +Resolver::getInstance()->requireDataFixture('Magento/GraphQl/Quote/_files/set_new_billing_address.php'); +Resolver::getInstance()->requireDataFixture('Magento/GraphQl/Quote/_files/set_flatrate_shipping_method.php'); +Resolver::getInstance()->requireDataFixture('Magento/GraphQl/Quote/_files/set_checkmo_payment_method.php'); + +$objectManager = Bootstrap::getObjectManager(); +$cartRepository = $objectManager->get(CartRepositoryInterface::class); +$getMaskedQuoteIdByReservedOrderId = $objectManager->get(GetMaskedQuoteIdByReservedOrderId::class); +$quoteIdMaskFactory = $objectManager->get(QuoteIdMaskFactory::class); +$quoteManagement = $objectManager->get(QuoteManagement::class); +$orderRepository = $objectManager->get(OrderRepositoryInterface::class); + +$quoteMask = $getMaskedQuoteIdByReservedOrderId->execute('test_quote'); +$quoteId = $quoteIdMaskFactory->create() + ->load($quoteMask, 'masked_id') + ->getId(); +$quote = $cartRepository->get($quoteId); + +$order = $quoteManagement->submit($quote); +$order->setIncrementId('100000001'); +$orderRepository->save($order); diff --git a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/_files/order_with_one_configurable_product_for_customer_rollback.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/_files/order_with_one_configurable_product_for_customer_rollback.php new file mode 100644 index 0000000000000..28d9b3357932e --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/_files/order_with_one_configurable_product_for_customer_rollback.php @@ -0,0 +1,14 @@ +requireDataFixture('Magento/Customer/_files/customer_rollback.php'); +Resolver::getInstance()->requireDataFixture('Magento/CatalogRule/_files/configurable_product_rollback.php'); +Resolver::getInstance()->requireDataFixture('Magento/GraphQl/Quote/_files/customer/create_empty_cart_rollback.php'); +Resolver::getInstance()->requireDataFixture('Magento/Sales/_files/default_rollback.php');