magento2-docker/dev/tests/api-functional/testsuite/Magento/Quote/Api/CartRepositoryTest.php

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']];
}
}