objectManager = Bootstrap::getObjectManager(); } /** * Test quote items * * @magentoApiDataFixture Magento/Checkout/_files/quote_with_items_saved.php */ public function testGetList() { /** @var Quote $quote */ $quote = $this->objectManager->create(Quote::class); $quote->load('test_order_item_with_items', 'reserved_order_id'); $cartId = $quote->getId(); /** @var QuoteIdMask $quoteIdMask */ $quoteIdMask = Bootstrap::getObjectManager() ->create(QuoteIdMaskFactory::class) ->create(); $quoteIdMask->load($cartId, 'quote_id'); //Use masked cart Id $cartId = $quoteIdMask->getMaskedId(); $output = []; /** @var \Magento\Quote\Api\Data\CartItemInterface $item */ foreach ($quote->getAllItems() as $item) { //Set masked Cart ID $item->setQuoteId($cartId); $data = [ 'item_id' => $item->getItemId(), 'sku' => $item->getSku(), 'name' => $item->getName(), 'price' => $item->getPrice(), 'qty' => $item->getQty(), 'product_type' => $item->getProductType(), 'quote_id' => $item->getQuoteId() ]; $output[] = $data; } $serviceInfo = [ 'rest' => [ 'resourcePath' => self::RESOURCE_PATH . $cartId . '/items', 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET, ], 'soap' => [ 'service' => self::SERVICE_NAME, 'serviceVersion' => self::SERVICE_VERSION, 'operation' => self::SERVICE_NAME . 'GetList', ], ]; $requestData = ["cartId" => $cartId]; $this->assertEquals($output, $this->_webApiCall($serviceInfo, $requestData)); } /** * @magentoApiDataFixture Magento/Checkout/_files/quote_with_address_saved.php * @magentoApiDataFixture Magento/Catalog/_files/product_without_options.php */ public function testAddItem() { /** @var Product $product */ $product = $this->objectManager->create(Product::class)->load(2); $productSku = $product->getSku(); /** @var Quote $quote */ $quote = $this->objectManager->create(Quote::class); $quote->load('test_order_1', 'reserved_order_id'); $cartId = $quote->getId(); /** @var QuoteIdMask $quoteIdMask */ $quoteIdMask = Bootstrap::getObjectManager() ->create(QuoteIdMaskFactory::class) ->create(); $quoteIdMask->load($cartId, 'quote_id'); //Use masked cart Id $cartId = $quoteIdMask->getMaskedId(); $serviceInfo = [ 'rest' => [ 'resourcePath' => self::RESOURCE_PATH . $cartId . '/items', 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST, ], 'soap' => [ 'service' => self::SERVICE_NAME, 'serviceVersion' => self::SERVICE_VERSION, 'operation' => self::SERVICE_NAME . 'Save', ], ]; $requestData = [ 'cartItem' => [ 'sku' => $productSku, 'qty' => 7, ], ]; if (TESTS_WEB_API_ADAPTER === self::ADAPTER_SOAP) { $requestData['cartItem']['quote_id'] = $cartId; } $this->_webApiCall($serviceInfo, $requestData); $this->assertTrue($quote->hasProductId(2)); $this->assertEquals(7, $quote->getItemByProduct($product)->getQty()); } /** * @magentoApiDataFixture Magento/Checkout/_files/quote_with_items_saved.php */ public function testRemoveItem() { /** @var Quote $quote */ $quote = $this->objectManager->create(Quote::class); $quote->load('test_order_item_with_items', 'reserved_order_id'); $cartId = $quote->getId(); /** @var QuoteIdMask $quoteIdMask */ $quoteIdMask = Bootstrap::getObjectManager() ->create(QuoteIdMaskFactory::class) ->create(); $quoteIdMask->load($cartId, 'quote_id'); //Use masked cart Id $cartId = $quoteIdMask->getMaskedId(); $product = $this->objectManager->create(Product::class); $productId = $product->getIdBySku('simple_one'); $product->load($productId); $itemId = $quote->getItemByProduct($product)->getId(); $serviceInfo = [ 'rest' => [ 'resourcePath' => self::RESOURCE_PATH . $cartId . '/items/' . $itemId, 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_DELETE, ], 'soap' => [ 'service' => self::SERVICE_NAME, 'serviceVersion' => self::SERVICE_VERSION, 'operation' => self::SERVICE_NAME . 'DeleteById', ], ]; $requestData = [ "cartId" => $cartId, "itemId" => $itemId, ]; $this->assertTrue($this->_webApiCall($serviceInfo, $requestData)); $quote = $this->objectManager->create(Quote::class); $quote->load('test_order_item_with_items', 'reserved_order_id'); $this->assertFalse($quote->hasProductId($productId)); } /** * @magentoApiDataFixture Magento/Checkout/_files/quote_with_items_saved.php * @param array $stockData * @param string|null $errorMessage * @dataProvider updateItemDataProvider */ public function testUpdateItem(array $stockData, string $errorMessage = null) { $this->updateStockData('simple_one', $stockData); /** @var Quote $quote */ $quote = $this->objectManager->create(Quote::class); $quote->load('test_order_item_with_items', 'reserved_order_id'); $cartId = $quote->getId(); /** @var QuoteIdMask $quoteIdMask */ $quoteIdMask = Bootstrap::getObjectManager() ->create(QuoteIdMaskFactory::class) ->create(); $quoteIdMask->load($cartId, 'quote_id'); //Use masked cart Id $cartId = $quoteIdMask->getMaskedId(); $product = $this->objectManager->create(Product::class); $productId = $product->getIdBySku('simple_one'); $product->load($productId); $itemId = $quote->getItemByProduct($product)->getId(); $serviceInfo = [ 'rest' => [ 'resourcePath' => self::RESOURCE_PATH . $cartId . '/items/' . $itemId, 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT, ], 'soap' => [ 'service' => self::SERVICE_NAME, 'serviceVersion' => self::SERVICE_VERSION, 'operation' => self::SERVICE_NAME . 'Save', ], ]; $requestData['cartItem']['qty'] = 5; if (TESTS_WEB_API_ADAPTER === self::ADAPTER_SOAP) { $requestData['cartItem'] += [ 'quote_id' => $cartId, 'itemId' => $itemId, ]; } if ($errorMessage) { $this->expectExceptionMessage($errorMessage); } $this->_webApiCall($serviceInfo, $requestData); $quote = $this->objectManager->create(Quote::class); $quote->load('test_order_item_with_items', 'reserved_order_id'); $this->assertTrue($quote->hasProductId(1)); $item = $quote->getItemByProduct($product); $this->assertEquals(5, $item->getQty()); $this->assertEquals($itemId, $item->getItemId()); } /** * Verifies that store id for quote and quote item is being changed accordingly to the requested store code * * @magentoApiDataFixture Magento/Checkout/_files/quote_with_items_saved.php * @magentoApiDataFixture Magento/Store/_files/second_store.php */ public function testUpdateItemWithChangingStoreId() { /** @var Quote $quote */ $quote = $this->objectManager->create(Quote::class); $quote->load('test_order_item_with_items', 'reserved_order_id'); $cartId = $quote->getId(); /** @var QuoteIdMask $quoteIdMask */ $quoteIdMask = Bootstrap::getObjectManager() ->create(QuoteIdMaskFactory::class) ->create(); $quoteIdMask->load($cartId, 'quote_id'); $cartId = $quoteIdMask->getMaskedId(); $product = $this->objectManager->create(Product::class); $productId = $product->getIdBySku('simple'); $product->load($productId); $itemId = $quote->getItemByProduct($product)->getId(); $serviceInfo = [ 'rest' => [ 'resourcePath' => self::RESOURCE_PATH . $cartId . '/items/' . $itemId, 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT, ], 'soap' => [ 'service' => self::SERVICE_NAME, 'serviceVersion' => self::SERVICE_VERSION, 'operation' => self::SERVICE_NAME . 'Save', ], ]; $requestData['cartItem']['qty'] = 5; if (TESTS_WEB_API_ADAPTER === self::ADAPTER_SOAP) { $requestData['cartItem'] += [ 'quote_id' => $cartId, 'itemId' => $itemId, ]; } $this->_webApiCall($serviceInfo, $requestData, null, 'fixture_second_store'); $quote = $this->objectManager->create(Quote::class); $quote->load('test_order_item_with_items', 'reserved_order_id'); $this->assertTrue($quote->hasProductId(1)); $item = $quote->getItemByProduct($product); /** @var StoreManagerInterface $storeManager */ $storeManager = $this->objectManager->get(StoreManagerInterface::class); $storeId = $storeManager->getStore('fixture_second_store') ->getId(); $this->assertEquals($storeId, $quote->getStoreId()); $this->assertEquals($storeId, $item->getStoreId()); } /** * @return array */ public function updateItemDataProvider(): array { return [ [ [] ], [ [ 'qty' => 0, 'is_in_stock' => 1, 'use_config_manage_stock' => 0, 'manage_stock' => 1, 'use_config_backorders' => 0, 'backorders' => Stock::BACKORDERS_YES_NOTIFY, ] ], [ [ 'qty' => 0, 'is_in_stock' => 1, 'use_config_manage_stock' => 0, 'manage_stock' => 1, 'use_config_backorders' => 0, 'backorders' => Stock::BACKORDERS_NO, ], 'There are no source items with the in stock status' ], [ [ 'qty' => 2, 'is_in_stock' => 1, 'use_config_manage_stock' => 0, 'manage_stock' => 1, 'use_config_backorders' => 0, 'backorders' => Stock::BACKORDERS_NO, ], 'The requested qty is not available' ] ]; } /** * Update product stock * * @param string $sku * @param array $stockData * @return void */ private function updateStockData(string $sku, array $stockData): void { if ($stockData) { /** @var $stockRegistry StockRegistryInterface */ $stockRegistry = $this->objectManager->create(StockRegistryInterface::class); $stockItem = $stockRegistry->getStockItemBySku($sku); $stockItem->addData($stockData); $stockRegistry->updateStockItemBySku($sku, $stockItem); } } }