397 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			397 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
declare(strict_types=1);
 | 
						|
 | 
						|
namespace Magento\Quote\Api;
 | 
						|
 | 
						|
use Magento\Catalog\Model\ResourceModel\Product as ProductResource;
 | 
						|
use Magento\Framework\Exception\AuthenticationException;
 | 
						|
use Magento\Framework\Webapi\Rest\Request;
 | 
						|
use Magento\Integration\Api\CustomerTokenServiceInterface;
 | 
						|
use Magento\Quote\Model\Quote;
 | 
						|
use Magento\Quote\Model\QuoteIdMask;
 | 
						|
use Magento\TestFramework\Helper\Bootstrap;
 | 
						|
use Magento\TestFramework\ObjectManager;
 | 
						|
use Magento\TestFramework\TestCase\WebapiAbstract;
 | 
						|
 | 
						|
/**
 | 
						|
 * Class for payment info in quote for registered customer.
 | 
						|
 */
 | 
						|
class CartAddingItemsTest extends WebapiAbstract
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * @var ObjectManager
 | 
						|
     */
 | 
						|
    protected $objectManager;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var ProductResource
 | 
						|
     */
 | 
						|
    private $productResource;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var array
 | 
						|
     */
 | 
						|
    private $createdQuotes = [];
 | 
						|
 | 
						|
    /**
 | 
						|
     * @inheritDoc
 | 
						|
     */
 | 
						|
    protected function setUp(): void
 | 
						|
    {
 | 
						|
        $this->objectManager = Bootstrap::getObjectManager();
 | 
						|
        $this->productResource = $this->objectManager->get(ProductResource::class);
 | 
						|
    }
 | 
						|
 | 
						|
    protected function tearDown(): void
 | 
						|
    {
 | 
						|
        /** @var Quote $quote */
 | 
						|
        $quote = $this->objectManager->create(Quote::class);
 | 
						|
        foreach ($this->createdQuotes as $quoteId) {
 | 
						|
            $quote->load($quoteId);
 | 
						|
            $quote->delete();
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Test qty for cart after adding grouped product qty specified only for goruped product.
 | 
						|
     *
 | 
						|
     * @magentoApiDataFixture Magento/GroupedProduct/_files/product_grouped_with_simple.php
 | 
						|
     * @magentoApiDataFixture Magento/Customer/_files/customer_one_address.php
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function testAddToCartGroupedWithParentQuantity(): void
 | 
						|
    {
 | 
						|
        $this->_markTestAsRestOnly();
 | 
						|
 | 
						|
        // Get customer ID token
 | 
						|
        /** @var CustomerTokenServiceInterface $customerTokenService */
 | 
						|
        $customerTokenService = $this->objectManager->create(CustomerTokenServiceInterface::class);
 | 
						|
        $token = $customerTokenService->createCustomerAccessToken(
 | 
						|
            'customer_one_address@test.com',
 | 
						|
            'password'
 | 
						|
        );
 | 
						|
 | 
						|
        // Creating empty cart for registered customer.
 | 
						|
        $serviceInfo = [
 | 
						|
            'rest' => [
 | 
						|
                'resourcePath' => '/V1/carts/mine',
 | 
						|
                'httpMethod' => Request::HTTP_METHOD_POST,
 | 
						|
                'token' => $token
 | 
						|
            ]
 | 
						|
        ];
 | 
						|
 | 
						|
        $quoteId = $this->_webApiCall($serviceInfo, ['customerId' => 999]); // customerId 999 will get overridden
 | 
						|
        $this->assertGreaterThan(0, $quoteId);
 | 
						|
 | 
						|
        /** @var CartRepositoryInterface $cartRepository */
 | 
						|
        $cartRepository = $this->objectManager->get(CartRepositoryInterface::class);
 | 
						|
        $quote = $cartRepository->get($quoteId);
 | 
						|
 | 
						|
        $quoteItems = $quote->getItemsCollection();
 | 
						|
        foreach ($quoteItems as $item) {
 | 
						|
            $quote->removeItem($item->getId())->save();
 | 
						|
        }
 | 
						|
 | 
						|
        $requestData = [
 | 
						|
            'cartItem' => [
 | 
						|
                'quote_id' => $quoteId,
 | 
						|
                'sku' => 'grouped',
 | 
						|
                'qty' => 7
 | 
						|
            ]
 | 
						|
        ];
 | 
						|
        $this->_webApiCall($this->getServiceInfoAddToCart($token), $requestData);
 | 
						|
 | 
						|
        foreach ($quote->getAllItems() as $item) {
 | 
						|
            $this->assertEquals(7, $item->getQty());
 | 
						|
        }
 | 
						|
        $this->createdQuotes[] = $quoteId;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Test price for cart after adding product to.
 | 
						|
     *
 | 
						|
     * @magentoApiDataFixture Magento/Catalog/_files/product_without_options_with_stock_data.php
 | 
						|
     * @magentoApiDataFixture Magento/Customer/_files/customer_one_address.php
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function testPriceForCreatingQuoteFromEmptyCart()
 | 
						|
    {
 | 
						|
        $this->_markTestAsRestOnly();
 | 
						|
 | 
						|
        // Get customer ID token
 | 
						|
        /** @var CustomerTokenServiceInterface $customerTokenService */
 | 
						|
        $customerTokenService = $this->objectManager->create(
 | 
						|
            CustomerTokenServiceInterface::class
 | 
						|
        );
 | 
						|
        $token = $customerTokenService->createCustomerAccessToken(
 | 
						|
            'customer_one_address@test.com',
 | 
						|
            'password'
 | 
						|
        );
 | 
						|
 | 
						|
        // Creating empty cart for registered customer.
 | 
						|
        $serviceInfo = [
 | 
						|
            'rest' => [
 | 
						|
                'resourcePath' => '/V1/carts/mine',
 | 
						|
                'httpMethod' => Request::HTTP_METHOD_POST,
 | 
						|
                'token' => $token
 | 
						|
            ]
 | 
						|
        ];
 | 
						|
 | 
						|
        $quoteId = $this->_webApiCall($serviceInfo, ['customerId' => 999]); // customerId 999 will get overridden
 | 
						|
        $this->assertGreaterThan(0, $quoteId);
 | 
						|
 | 
						|
        // Adding item to the cart
 | 
						|
        $requestData = [
 | 
						|
            'cartItem' => [
 | 
						|
                'quote_id' => $quoteId,
 | 
						|
                'sku' => 'simple',
 | 
						|
                'qty' => 1
 | 
						|
            ]
 | 
						|
        ];
 | 
						|
        $item = $this->_webApiCall($this->getServiceInfoAddToCart($token), $requestData);
 | 
						|
        $this->assertNotEmpty($item);
 | 
						|
        $this->assertEquals(10, $item['price']);
 | 
						|
 | 
						|
        // Get payment information
 | 
						|
        $serviceInfoForGettingPaymentInfo = [
 | 
						|
            'rest' => [
 | 
						|
                'resourcePath' => '/V1/carts/mine/payment-information',
 | 
						|
                'httpMethod' => Request::HTTP_METHOD_GET,
 | 
						|
                'token' => $token
 | 
						|
            ]
 | 
						|
        ];
 | 
						|
        $paymentInfo = $this->_webApiCall($serviceInfoForGettingPaymentInfo);
 | 
						|
        $this->assertEquals($paymentInfo['totals']['grand_total'], 10);
 | 
						|
 | 
						|
        $this->createdQuotes[] = $quoteId;
 | 
						|
//        /** @var \Magento\Quote\Model\Quote $quote */
 | 
						|
//        $quote = $this->objectManager->create(\Magento\Quote\Model\Quote::class);
 | 
						|
//        $quote->load($quoteId);
 | 
						|
//        $quote->delete();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Test qty for cart after adding grouped product with custom qty.
 | 
						|
     *
 | 
						|
     * @magentoApiDataFixture Magento/GroupedProduct/_files/product_grouped_with_simple.php
 | 
						|
     * @magentoApiDataFixture Magento/Customer/_files/customer_one_address.php
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function testAddToCartGroupedCustomQuantity(): void
 | 
						|
    {
 | 
						|
        $this->_markTestAsRestOnly();
 | 
						|
 | 
						|
        $firstProductId = $this->productResource->getIdBySku('simple_11');
 | 
						|
        $secondProductId = $this->productResource->getIdBySku('simple_22');
 | 
						|
        $qtyData = [$firstProductId => 2, $secondProductId => 4];
 | 
						|
 | 
						|
        // Get customer ID token
 | 
						|
        /** @var CustomerTokenServiceInterface $customerTokenService */
 | 
						|
        $customerTokenService = $this->objectManager->create(CustomerTokenServiceInterface::class);
 | 
						|
        $token = $customerTokenService->createCustomerAccessToken(
 | 
						|
            'customer_one_address@test.com',
 | 
						|
            'password'
 | 
						|
        );
 | 
						|
 | 
						|
        // Creating empty cart for registered customer.
 | 
						|
        $serviceInfo = [
 | 
						|
            'rest' => [
 | 
						|
                'resourcePath' => '/V1/carts/mine',
 | 
						|
                'httpMethod' => Request::HTTP_METHOD_POST,
 | 
						|
                'token' => $token
 | 
						|
            ]
 | 
						|
        ];
 | 
						|
 | 
						|
        $quoteId = $this->_webApiCall($serviceInfo, ['customerId' => 999]); // customerId 999 will get overridden
 | 
						|
        $this->assertGreaterThan(0, $quoteId);
 | 
						|
 | 
						|
        // Adding item to the cart
 | 
						|
        $productOptionData = [
 | 
						|
            'extension_attributes' => [
 | 
						|
                'grouped_options' => [
 | 
						|
                    ['id' => $firstProductId, 'qty' => $qtyData[$firstProductId]],
 | 
						|
                    ['id' => $secondProductId, 'qty' => $qtyData[$secondProductId]],
 | 
						|
                ]
 | 
						|
            ]
 | 
						|
        ];
 | 
						|
        $requestData = [
 | 
						|
            'cartItem' => [
 | 
						|
                'quote_id' => $quoteId,
 | 
						|
                'sku' => 'grouped',
 | 
						|
                'qty' => 1,
 | 
						|
                'product_option' => $productOptionData
 | 
						|
            ]
 | 
						|
        ];
 | 
						|
        $response = $this->_webApiCall($this->getServiceInfoAddToCart($token), $requestData);
 | 
						|
        $this->assertArrayHasKey('product_option', $response);
 | 
						|
        $this->assertEquals($response['product_option'], $productOptionData);
 | 
						|
 | 
						|
        /** @var CartRepositoryInterface $cartRepository */
 | 
						|
        $cartRepository = $this->objectManager->get(CartRepositoryInterface::class);
 | 
						|
        $quote = $cartRepository->get($quoteId);
 | 
						|
 | 
						|
        foreach ($quote->getAllItems() as $item) {
 | 
						|
            $this->assertEquals($qtyData[$item->getProductId()], $item->getQty());
 | 
						|
        }
 | 
						|
        $this->createdQuotes[] = $quoteId;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Test adding grouped product when qty for grouped_options not specified.
 | 
						|
     *
 | 
						|
     * @magentoApiDataFixture Magento/GroupedProduct/_files/product_grouped_with_simple.php
 | 
						|
     * @magentoApiDataFixture Magento/Customer/_files/customer_one_address.php
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function testAddToCartGroupedCustomQuantityNotAllParamsSpecified(): void
 | 
						|
    {
 | 
						|
        $this->_markTestAsRestOnly();
 | 
						|
 | 
						|
        $productId = $this->productResource->getIdBySku('simple_11');
 | 
						|
 | 
						|
        // Get customer ID token
 | 
						|
        /** @var CustomerTokenServiceInterface $customerTokenService */
 | 
						|
        $customerTokenService = $this->objectManager->create(CustomerTokenServiceInterface::class);
 | 
						|
        $token = $customerTokenService->createCustomerAccessToken(
 | 
						|
            'customer_one_address@test.com',
 | 
						|
            'password'
 | 
						|
        );
 | 
						|
 | 
						|
        // Creating empty cart for registered customer.
 | 
						|
        $serviceInfo = [
 | 
						|
            'rest' => ['resourcePath' => '/V1/carts/mine', 'httpMethod' => Request::HTTP_METHOD_POST, 'token' => $token]
 | 
						|
        ];
 | 
						|
 | 
						|
        $quoteId = $this->_webApiCall($serviceInfo, ['customerId' => 999]); // customerId 999 will get overridden
 | 
						|
        $this->assertGreaterThan(0, $quoteId);
 | 
						|
 | 
						|
        // Adding item to the cart
 | 
						|
        $requestData = [
 | 
						|
            'cartItem' => [
 | 
						|
                'quote_id' => $quoteId,
 | 
						|
                'sku' => 'grouped',
 | 
						|
                'qty' => 1,
 | 
						|
                'product_option' => [
 | 
						|
                    'extension_attributes' => [
 | 
						|
                        'grouped_options' => [
 | 
						|
                            ['id' => $productId],
 | 
						|
                        ]
 | 
						|
                    ]
 | 
						|
                ]
 | 
						|
            ]
 | 
						|
        ];
 | 
						|
 | 
						|
        $this->createdQuotes[] = $quoteId;
 | 
						|
 | 
						|
        $this->expectException(\Exception::class);
 | 
						|
        $this->expectExceptionMessage('Please specify id and qty for grouped options.');
 | 
						|
 | 
						|
        $this->_webApiCall($this->getServiceInfoAddToCart($token), $requestData);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Returns service info add to cart
 | 
						|
     *
 | 
						|
     * @param string $token
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    private function getServiceInfoAddToCart(string $token): array
 | 
						|
    {
 | 
						|
        return [
 | 
						|
            'rest' => [
 | 
						|
                'resourcePath' => '/V1/carts/mine/items',
 | 
						|
                'httpMethod' => Request::HTTP_METHOD_POST,
 | 
						|
                'token' => $token
 | 
						|
            ]
 | 
						|
        ];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Test for product name in different store view
 | 
						|
     *
 | 
						|
     * @magentoConfigFixture web/url/use_store 1
 | 
						|
     * @magentoApiDataFixture Magento/Catalog/_files/product_simple_multistore.php
 | 
						|
     * @magentoApiDataFixture Magento/Customer/_files/customer.php
 | 
						|
     *
 | 
						|
     * @param string $expectedProductName
 | 
						|
     * @param string|null $storeCode
 | 
						|
     *
 | 
						|
     * @return void
 | 
						|
     * @dataProvider dataProviderForMultiStoreView
 | 
						|
     * @throws AuthenticationException
 | 
						|
     */
 | 
						|
    public function testForProductNameAsPerStoreView(string $expectedProductName, ?string $storeCode = null): void
 | 
						|
    {
 | 
						|
        $this->_markTestAsRestOnly();
 | 
						|
 | 
						|
        // Get customer ID token
 | 
						|
        /** @var CustomerTokenServiceInterface $customerTokenService */
 | 
						|
        $customerTokenService = $this->objectManager->create(CustomerTokenServiceInterface::class);
 | 
						|
        $token = $customerTokenService->createCustomerAccessToken(
 | 
						|
            'customer@example.com',
 | 
						|
            'password'
 | 
						|
        );
 | 
						|
 | 
						|
        // Creating empty cart for registered customer.
 | 
						|
        $serviceInfo = [
 | 
						|
            'rest' => [
 | 
						|
                'resourcePath' => '/V1/carts/mine',
 | 
						|
                'httpMethod' => Request::HTTP_METHOD_POST,
 | 
						|
                'token' => $token
 | 
						|
            ]
 | 
						|
        ];
 | 
						|
        $quoteId = $this->_webApiCall($serviceInfo);
 | 
						|
        $this->assertGreaterThan(0, $quoteId);
 | 
						|
 | 
						|
        // Add product to cart
 | 
						|
        $requestData = [
 | 
						|
            'cartItem' => [
 | 
						|
                'quote_id' => $quoteId,
 | 
						|
                'sku' => 'simple',
 | 
						|
                'qty' => 1
 | 
						|
            ]
 | 
						|
        ];
 | 
						|
        $this->_webApiCall($this->getServiceInfoAddToCart($token), $requestData);
 | 
						|
 | 
						|
        // Fetch Cart info
 | 
						|
        $serviceInfo = [
 | 
						|
            'rest' => [
 | 
						|
                'resourcePath' => '/V1/carts/mine',
 | 
						|
                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
 | 
						|
                'token' => $token
 | 
						|
            ]
 | 
						|
        ];
 | 
						|
        /** @var \Magento\Quote\Api\Data\CartInterface $cart */
 | 
						|
        $cart = $this->_webApiCall($serviceInfo, [], null, $storeCode);
 | 
						|
        $carts = $cart['items'];
 | 
						|
        $actualProductName = $carts[0]['name'] ?? '';
 | 
						|
 | 
						|
        $this->assertEquals($expectedProductName, $actualProductName);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    public function dataProviderForMultiStoreView(): array
 | 
						|
    {
 | 
						|
        return [
 | 
						|
            'noStoreCodeInRequestPath' => [
 | 
						|
                'Simple Product One',
 | 
						|
                null
 | 
						|
            ],
 | 
						|
            'defaultStoreCodeInRequestPath' => [
 | 
						|
                'Simple Product One',
 | 
						|
                'default'
 | 
						|
            ],
 | 
						|
            'secondStoreCodeInRequestPath' => [
 | 
						|
                'StoreTitle',
 | 
						|
                'fixturestore'
 | 
						|
            ]
 | 
						|
        ];
 | 
						|
    }
 | 
						|
}
 |