390 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			390 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
namespace Magento\Quote\Api;
 | 
						|
 | 
						|
use Magento\Framework\Api\FilterBuilder;
 | 
						|
use Magento\Framework\Api\SearchCriteriaBuilder;
 | 
						|
use Magento\Framework\Api\SortOrderBuilder;
 | 
						|
use Magento\Framework\Api\SortOrder;
 | 
						|
use Magento\TestFramework\ObjectManager;
 | 
						|
use Magento\TestFramework\TestCase\WebapiAbstract;
 | 
						|
use Magento\Quote\Model\Quote;
 | 
						|
use Magento\Integration\Api\CustomerTokenServiceInterface;
 | 
						|
use Magento\Framework\Webapi\Rest\Request;
 | 
						|
 | 
						|
/**
 | 
						|
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
 | 
						|
 */
 | 
						|
class CartRepositoryTest extends WebapiAbstract
 | 
						|
{
 | 
						|
    private static $mineCartUrl = '/V1/carts/mine';
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var ObjectManager
 | 
						|
     */
 | 
						|
    private $objectManager;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var SearchCriteriaBuilder
 | 
						|
     */
 | 
						|
    private $searchCriteriaBuilder;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var SortOrderBuilder
 | 
						|
     */
 | 
						|
    private $sortOrderBuilder;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var FilterBuilder
 | 
						|
     */
 | 
						|
    private $filterBuilder;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @inheritdoc
 | 
						|
     */
 | 
						|
    protected function setUp(): void
 | 
						|
    {
 | 
						|
        $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
 | 
						|
        $this->filterBuilder = $this->objectManager->create(
 | 
						|
            \Magento\Framework\Api\FilterBuilder::class
 | 
						|
        );
 | 
						|
        $this->sortOrderBuilder = $this->objectManager->create(
 | 
						|
            \Magento\Framework\Api\SortOrderBuilder::class
 | 
						|
        );
 | 
						|
        $this->searchCriteriaBuilder = $this->objectManager->create(
 | 
						|
            \Magento\Framework\Api\SearchCriteriaBuilder::class
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    protected function tearDown(): void
 | 
						|
    {
 | 
						|
        try {
 | 
						|
            /** @var CartRepositoryInterface $quoteRepository */
 | 
						|
            $quoteRepository = $this->objectManager->get(CartRepositoryInterface::class);
 | 
						|
            $cart = $this->getCart('test01');
 | 
						|
            $quoteRepository->delete($cart);
 | 
						|
        } catch (\InvalidArgumentException $e) {
 | 
						|
            // Do nothing if cart fixture was not used
 | 
						|
        }
 | 
						|
        parent::tearDown();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Retrieve quote by given reserved order ID
 | 
						|
     *
 | 
						|
     * @param string $reservedOrderId
 | 
						|
     * @return \Magento\Quote\Model\Quote
 | 
						|
     * @throws \InvalidArgumentException
 | 
						|
     */
 | 
						|
    private function getCart($reservedOrderId)
 | 
						|
    {
 | 
						|
        /** @var SearchCriteriaBuilder $searchCriteriaBuilder */
 | 
						|
        $searchCriteriaBuilder = $this->objectManager->get(SearchCriteriaBuilder::class);
 | 
						|
        $searchCriteria = $searchCriteriaBuilder->addFilter('reserved_order_id', $reservedOrderId)
 | 
						|
            ->create();
 | 
						|
 | 
						|
        /** @var CartRepositoryInterface $quoteRepository */
 | 
						|
        $quoteRepository = $this->objectManager->get(CartRepositoryInterface::class);
 | 
						|
        $items = $quoteRepository->getList($searchCriteria)->getItems();
 | 
						|
 | 
						|
        if (empty($items)) {
 | 
						|
            throw new \InvalidArgumentException('There is no quote with provided reserved order ID.');
 | 
						|
        }
 | 
						|
 | 
						|
        return array_pop($items);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Tests successfull get cart web-api call.
 | 
						|
     *
 | 
						|
     * @magentoApiDataFixture Magento/Sales/_files/quote.php
 | 
						|
     */
 | 
						|
    public function testGetCart()
 | 
						|
    {
 | 
						|
        $cart = $this->getCart('test01');
 | 
						|
        $cartId = $cart->getId();
 | 
						|
 | 
						|
        $serviceInfo = [
 | 
						|
            'rest' => [
 | 
						|
                'resourcePath' => '/V1/carts/' . $cartId,
 | 
						|
                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
 | 
						|
            ],
 | 
						|
            'soap' => [
 | 
						|
                'service' => 'quoteCartRepositoryV1',
 | 
						|
                'serviceVersion' => 'V1',
 | 
						|
                'operation' => 'quoteCartRepositoryV1Get',
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $requestData = ['cartId' => $cartId];
 | 
						|
        $cartData = $this->_webApiCall($serviceInfo, $requestData);
 | 
						|
        $this->assertEquals($cart->getId(), $cartData['id']);
 | 
						|
        $this->assertEquals($cart->getCreatedAt(), $cartData['created_at']);
 | 
						|
        $this->assertEquals($cart->getUpdatedAt(), $cartData['updated_at']);
 | 
						|
        $this->assertEquals($cart->getIsActive(), $cartData['is_active']);
 | 
						|
        $this->assertEquals($cart->getIsVirtual(), $cartData['is_virtual']);
 | 
						|
        $this->assertEquals($cart->getOrigOrderId(), $cartData['orig_order_id']);
 | 
						|
        $this->assertEquals($cart->getItemsCount(), $cartData['items_count']);
 | 
						|
        $this->assertEquals($cart->getItemsQty(), $cartData['items_qty']);
 | 
						|
        //following checks will be uncommented when all cart related services are ready
 | 
						|
        $this->assertArrayHasKey('customer', $cartData);
 | 
						|
        $this->assertTrue($cartData['customer_is_guest']);
 | 
						|
        $this->assertArrayHasKey('currency', $cartData);
 | 
						|
        $this->assertEquals($cart->getGlobalCurrencyCode(), $cartData['currency']['global_currency_code']);
 | 
						|
        $this->assertEquals($cart->getBaseCurrencyCode(), $cartData['currency']['base_currency_code']);
 | 
						|
        $this->assertEquals($cart->getQuoteCurrencyCode(), $cartData['currency']['quote_currency_code']);
 | 
						|
        $this->assertEquals($cart->getStoreCurrencyCode(), $cartData['currency']['store_currency_code']);
 | 
						|
        $this->assertEquals($cart->getBaseToGlobalRate(), $cartData['currency']['base_to_global_rate']);
 | 
						|
        $this->assertEquals($cart->getBaseToQuoteRate(), $cartData['currency']['base_to_quote_rate']);
 | 
						|
        $this->assertEquals($cart->getStoreToBaseRate(), $cartData['currency']['store_to_base_rate']);
 | 
						|
        $this->assertEquals($cart->getStoreToQuoteRate(), $cartData['currency']['store_to_quote_rate']);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Tests exception when cartId is not provided.
 | 
						|
     *
 | 
						|
     */
 | 
						|
    public function testGetCartThrowsExceptionIfThereIsNoCartWithProvidedId()
 | 
						|
    {
 | 
						|
        $this->expectException(\Exception::class);
 | 
						|
        $this->expectExceptionMessage('No such entity with');
 | 
						|
 | 
						|
        $cartId = 9999;
 | 
						|
 | 
						|
        $serviceInfo = [
 | 
						|
            'soap' => [
 | 
						|
                'service' => 'quoteCartRepositoryV1',
 | 
						|
                'serviceVersion' => 'V1',
 | 
						|
                'operation' => 'quoteCartRepositoryV1Get',
 | 
						|
            ],
 | 
						|
            'rest' => [
 | 
						|
                'resourcePath' => '/V1/carts/' . $cartId,
 | 
						|
                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $requestData = ['cartId' => $cartId];
 | 
						|
        $this->_webApiCall($serviceInfo, $requestData);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Tests carts search.
 | 
						|
     *
 | 
						|
     * @magentoApiDataFixture Magento/Sales/_files/quote.php
 | 
						|
     */
 | 
						|
    public function testGetList()
 | 
						|
    {
 | 
						|
        $cart = $this->getCart('test01');
 | 
						|
 | 
						|
        // The following two filters are used as alternatives. The target cart does not match the first one.
 | 
						|
        $grandTotalFilter = $this->filterBuilder->setField('grand_total')
 | 
						|
            ->setConditionType('gteq')
 | 
						|
            ->setValue(15)
 | 
						|
            ->create();
 | 
						|
        $subtotalFilter = $this->filterBuilder->setField('subtotal')
 | 
						|
            ->setConditionType('eq')
 | 
						|
            ->setValue($cart->getSubtotal())
 | 
						|
            ->create();
 | 
						|
 | 
						|
        $yesterdayDate = (new \DateTime($cart->getCreatedAt()))->sub(new \DateInterval('P1D'))->format('Y-m-d');
 | 
						|
        $tomorrowDate = (new \DateTime($cart->getCreatedAt()))->add(new \DateInterval('P1D'))->format('Y-m-d');
 | 
						|
        $minCreatedAtFilter = $this->filterBuilder->setField('created_at')
 | 
						|
            ->setConditionType('gteq')
 | 
						|
            ->setValue($yesterdayDate)
 | 
						|
            ->create();
 | 
						|
        $maxCreatedAtFilter = $this->filterBuilder->setField('created_at')
 | 
						|
            ->setConditionType('lteq')
 | 
						|
            ->setValue($tomorrowDate)
 | 
						|
            ->create();
 | 
						|
 | 
						|
        $this->searchCriteriaBuilder->addFilters([$grandTotalFilter, $subtotalFilter]);
 | 
						|
        $this->searchCriteriaBuilder->addFilters([$minCreatedAtFilter]);
 | 
						|
        $this->searchCriteriaBuilder->addFilters([$maxCreatedAtFilter]);
 | 
						|
        $this->searchCriteriaBuilder->addFilter('reserved_order_id', 'test01');
 | 
						|
        /** @var SortOrder $sortOrder */
 | 
						|
        $sortOrder = $this->sortOrderBuilder->setField('subtotal')->setDirection(SortOrder::SORT_ASC)->create();
 | 
						|
        $this->searchCriteriaBuilder->setSortOrders([$sortOrder]);
 | 
						|
        $searchCriteria = $this->searchCriteriaBuilder->create()->__toArray();
 | 
						|
        $requestData = ['searchCriteria' => $searchCriteria];
 | 
						|
        $serviceInfo = [
 | 
						|
            'rest' => [
 | 
						|
                'resourcePath' => '/V1/carts/search' . '?' . http_build_query($requestData),
 | 
						|
                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
 | 
						|
            ],
 | 
						|
            'soap' => [
 | 
						|
                'service' => 'quoteCartRepositoryV1',
 | 
						|
                'serviceVersion' => 'V1',
 | 
						|
                'operation' => 'quoteCartRepositoryV1GetList',
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $searchResult = $this->_webApiCall($serviceInfo, $requestData);
 | 
						|
        $this->assertArrayHasKey('total_count', $searchResult);
 | 
						|
        $this->assertEquals(1, $searchResult['total_count']);
 | 
						|
        $this->assertArrayHasKey('items', $searchResult);
 | 
						|
        $this->assertCount(1, $searchResult['items']);
 | 
						|
 | 
						|
        $cartData = $searchResult['items'][0];
 | 
						|
        $this->assertEquals($cart->getId(), $cartData['id']);
 | 
						|
        $this->assertEquals($cart->getCreatedAt(), $cartData['created_at']);
 | 
						|
        $this->assertEquals($cart->getUpdatedAt(), $cartData['updated_at']);
 | 
						|
        $this->assertEquals($cart->getIsActive(), $cartData['is_active']);
 | 
						|
 | 
						|
        $this->assertArrayHasKey('customer_is_guest', $cartData);
 | 
						|
        $this->assertEquals(1, $cartData['customer_is_guest']);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     */
 | 
						|
    public function testGetListThrowsExceptionIfProvidedSearchFieldIsInvalid()
 | 
						|
    {
 | 
						|
        $this->expectException(\Exception::class);
 | 
						|
 | 
						|
        $serviceInfo = [
 | 
						|
            'soap' => [
 | 
						|
                'service' => 'quoteCartRepositoryV1',
 | 
						|
                'serviceVersion' => 'V1',
 | 
						|
                'operation' => 'quoteCartRepositoryV1GetList',
 | 
						|
            ],
 | 
						|
            'rest' => [
 | 
						|
                'resourcePath' => '/V1/carts/search',
 | 
						|
                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT,
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $invalidFilter = $this->filterBuilder->setField('invalid_field')
 | 
						|
            ->setConditionType('eq')
 | 
						|
            ->setValue(0)
 | 
						|
            ->create();
 | 
						|
 | 
						|
        $this->searchCriteriaBuilder->addFilters([$invalidFilter]);
 | 
						|
        $searchCriteria = $this->searchCriteriaBuilder->create()->__toArray();
 | 
						|
        $requestData = ['searchCriteria' => $searchCriteria];
 | 
						|
        $this->_webApiCall($serviceInfo, $requestData);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Saving quote - negative case, attempt to change customer id in the active quote for the user with Customer role.
 | 
						|
     *
 | 
						|
     * @dataProvider customerIdDataProvider
 | 
						|
     * @magentoApiDataFixture Magento/Checkout/_files/quote_with_shipping_method.php
 | 
						|
     */
 | 
						|
    public function testSaveQuoteException($customerId)
 | 
						|
    {
 | 
						|
        $this->expectException(\Exception::class);
 | 
						|
        $this->expectExceptionMessage('Invalid state change requested');
 | 
						|
 | 
						|
        $token = $this->getToken();
 | 
						|
 | 
						|
        /** @var Quote $quote */
 | 
						|
        $quote = $this->getCart('test_order_1');
 | 
						|
 | 
						|
        $requestData = $this->getRequestData($quote->getId());
 | 
						|
        // Replace to customer id not much with current user id..
 | 
						|
        $requestData['quote']['customer']['id'] = $customerId;
 | 
						|
 | 
						|
        $serviceInfo = [
 | 
						|
            'rest' => [
 | 
						|
                'resourcePath' => self::$mineCartUrl,
 | 
						|
                'httpMethod'   => Request::HTTP_METHOD_PUT,
 | 
						|
                'token'        => $token
 | 
						|
            ],
 | 
						|
            'soap' => [
 | 
						|
                'service' => 'quoteCartRepositoryV1',
 | 
						|
                'serviceVersion' => 'V1',
 | 
						|
                'operation' => 'quoteCartRepositoryV1Save',
 | 
						|
                'token' => $token
 | 
						|
            ]
 | 
						|
        ];
 | 
						|
 | 
						|
        $this->_webApiCall($serviceInfo, $requestData);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Saving quote - positive case: successful change correct customer data.
 | 
						|
     *
 | 
						|
     * @magentoApiDataFixture Magento/Checkout/_files/quote_with_shipping_method.php
 | 
						|
     */
 | 
						|
    public function testSaveQuote()
 | 
						|
    {
 | 
						|
        $token = $this->getToken();
 | 
						|
 | 
						|
        /** @var Quote $quote */
 | 
						|
        $quote = $this->getCart('test_order_1');
 | 
						|
 | 
						|
        $requestData = $this->getRequestData($quote->getId());
 | 
						|
 | 
						|
        $serviceInfo = [
 | 
						|
            'rest' => [
 | 
						|
                'resourcePath' => self::$mineCartUrl,
 | 
						|
                'httpMethod'   => Request::HTTP_METHOD_PUT,
 | 
						|
                'token'        => $token
 | 
						|
            ],
 | 
						|
            'soap' => [
 | 
						|
                'service'        => 'quoteCartRepositoryV1',
 | 
						|
                'serviceVersion' => 'V1',
 | 
						|
                'operation'      => 'quoteCartRepositoryV1Save',
 | 
						|
                'token'          => $token
 | 
						|
            ]
 | 
						|
        ];
 | 
						|
 | 
						|
        $this->_webApiCall($serviceInfo, $requestData);
 | 
						|
 | 
						|
        $quote->loadActive($requestData["quote"]["id"]);
 | 
						|
        $this->assertEquals($requestData["quote"]["customer"]["firstname"], $quote->getCustomerFirstname());
 | 
						|
        $this->assertEquals($requestData["quote"]["customer"]["middlename"], $quote->getCustomerMiddlename());
 | 
						|
        $this->assertEquals($requestData["quote"]["customer"]["lastname"], $quote->getCustomerLastname());
 | 
						|
        $this->assertEquals($requestData["quote"]["customer"]["email"], $quote->getCustomerEmail());
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Request to api for the current user token.
 | 
						|
     *
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    private function getToken()
 | 
						|
    {
 | 
						|
        $customerTokenService = $this->objectManager->create(
 | 
						|
            CustomerTokenServiceInterface::class
 | 
						|
        );
 | 
						|
 | 
						|
        return $customerTokenService->createCustomerAccessToken('customer@example.com', 'password');
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Request's data for tests.
 | 
						|
     *
 | 
						|
     * @param $quoteId Int
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    private function getRequestData($quoteId)
 | 
						|
    {
 | 
						|
        $requestData['quote'] = [
 | 
						|
            'id'       => $quoteId,
 | 
						|
            'store_id' => 1,
 | 
						|
            'customer' => [
 | 
						|
                'id'         => 1,
 | 
						|
                'middlename' => 'Middlename_Test',
 | 
						|
                'firstname'  => 'Firstname_Test',
 | 
						|
                'lastname'   => 'Lastname_Test',
 | 
						|
                'email'      => 'customer@test.com'
 | 
						|
            ]
 | 
						|
        ];
 | 
						|
 | 
						|
        return $requestData;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Provides different types of customer id.
 | 
						|
     *
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    public function customerIdDataProvider()
 | 
						|
    {
 | 
						|
        return [[999],[null],['25']];
 | 
						|
    }
 | 
						|
}
 |