![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/dev/tests/api-functional/testsuite/Magento/Quote/Api/ |
<?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('[email protected]', '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' => '[email protected]' ] ]; return $requestData; } /** * Provides different types of customer id. * * @return array */ public function customerIdDataProvider() { return [[999],[null],['25']]; } }