363 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			363 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
namespace Magento\Quote\Api;
 | 
						|
 | 
						|
use Magento\Catalog\Model\Product;
 | 
						|
use Magento\CatalogInventory\Api\StockRegistryInterface;
 | 
						|
use Magento\CatalogInventory\Model\Stock;
 | 
						|
use Magento\Quote\Model\Quote;
 | 
						|
use Magento\Quote\Model\QuoteIdMask;
 | 
						|
use Magento\Quote\Model\QuoteIdMaskFactory;
 | 
						|
use Magento\Store\Model\StoreManagerInterface;
 | 
						|
use Magento\TestFramework\Helper\Bootstrap;
 | 
						|
use Magento\TestFramework\ObjectManager;
 | 
						|
use Magento\TestFramework\TestCase\WebapiAbstract;
 | 
						|
 | 
						|
/**
 | 
						|
 * Test for Magento\Quote\Api\GuestCartItemRepositoryInterface.
 | 
						|
 */
 | 
						|
class GuestCartItemRepositoryTest extends WebapiAbstract
 | 
						|
{
 | 
						|
    public const SERVICE_NAME = 'quoteGuestCartItemRepositoryV1';
 | 
						|
    private const SERVICE_VERSION = 'V1';
 | 
						|
    private const RESOURCE_PATH = '/V1/guest-carts/';
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var ObjectManager
 | 
						|
     */
 | 
						|
    private $objectManager;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @inheritdoc
 | 
						|
     */
 | 
						|
    protected function setUp(): void
 | 
						|
    {
 | 
						|
        $this->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);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |