magento2-docker/dev/tests/api-functional/testsuite/Magento/Tax/Api/TaxRuleRepositoryInterfaceT...

655 lines
24 KiB
PHP
Executable File

<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Tax\Api;
use Magento\Framework\Api\FilterBuilder;
use Magento\Framework\Api\SearchCriteriaBuilder;
use Magento\Framework\Api\SortOrderBuilder;
use Magento\TestFramework\Helper\Bootstrap;
use Magento\TestFramework\TestCase\WebapiAbstract;
use Magento\Webapi\Model\Rest\Config as HttpConstants;
/**
* Tax Rule Repository API test
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class TaxRuleRepositoryInterfaceTest extends WebapiAbstract
{
const SERVICE_NAME = "taxTaxRuleRepositoryV1";
const SERVICE_VERSION = "V1";
const RESOURCE_PATH = "/V1/taxRules";
/** @var \Magento\Tax\Model\Calculation\Rate[] */
private $fixtureTaxRates;
/** @var \Magento\Tax\Model\ClassModel[] */
private $fixtureTaxClasses;
/** @var \Magento\Tax\Model\Calculation\Rule[] */
private $fixtureTaxRules;
/** @var FilterBuilder */
private $filterBuilder;
/** @var SearchCriteriaBuilder */
private $searchCriteriaBuilder;
/** @var \Magento\Tax\Api\Data\TaxClassInterface | \Magento\Tax\Model\ClassModel */
private $taxClass;
/** @var \Magento\Tax\Api\Data\TaxRateInterface | \Magento\Tax\Model\Calculation\Rate */
private $taxRate;
/** @var SortOrderBuilder */
private $sortOrderBuilder;
/**
* Execute per test initialization.
*/
protected function setUp(): void
{
$this->searchCriteriaBuilder = Bootstrap::getObjectManager()->create(
\Magento\Framework\Api\SearchCriteriaBuilder::class
);
$this->filterBuilder = Bootstrap::getObjectManager()->create(
\Magento\Framework\Api\FilterBuilder::class
);
$objectManager = Bootstrap::getObjectManager();
$this->searchCriteriaBuilder = $objectManager->create(
\Magento\Framework\Api\SearchCriteriaBuilder::class
);
$this->filterBuilder = $objectManager->create(
\Magento\Framework\Api\FilterBuilder::class
);
$this->sortOrderBuilder = $objectManager->create(
SortOrderBuilder::class
);
$this->taxClass = $objectManager->create(
\Magento\Tax\Api\Data\TaxClassInterface::class
);
$this->taxRate = $objectManager->create(
\Magento\Tax\Api\Data\TaxRateInterface::class
);
/** Initialize tax classes, tax rates and tax rules defined in fixture Magento/Tax/_files/tax_classes.php */
$this->getFixtureTaxRates();
$this->getFixtureTaxClasses();
$this->getFixtureTaxRules();
}
protected function tearDown(): void
{
$taxRules = $this->getFixtureTaxRules();
if (count($taxRules)) {
$taxRates = $this->getFixtureTaxRates();
$taxClasses = $this->getFixtureTaxClasses();
foreach ($taxRules as $taxRule) {
$taxRule->delete();
}
foreach ($taxRates as $taxRate) {
$taxRate->delete();
}
foreach ($taxClasses as $taxClass) {
$taxClass->delete();
}
}
}
/**
* @magentoApiDataFixture Magento/Tax/_files/tax_classes.php
*/
public function testDeleteTaxRule()
{
$fixtureRule = $this->getFixtureTaxRules()[0];
$taxRuleId = $fixtureRule->getId();
$serviceInfo = [
'rest' => [
'resourcePath' => self::RESOURCE_PATH . "/$taxRuleId",
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_DELETE,
],
'soap' => [
'service' => self::SERVICE_NAME,
'serviceVersion' => self::SERVICE_VERSION,
'operation' => self::SERVICE_NAME . 'DeleteById',
],
];
$requestData = ['ruleId' => $taxRuleId];
$result = $this->_webApiCall($serviceInfo, $requestData);
$this->assertTrue($result);
/** Ensure that tax rule was actually removed from DB */
/** @var \Magento\Tax\Model\Calculation\Rule $taxRule */
$taxRate = Bootstrap::getObjectManager()->create(\Magento\Tax\Model\Calculation\Rate::class);
$this->assertNull($taxRate->load($taxRuleId)->getId(), 'Tax rule was not deleted from DB.');
}
public function testCreateTaxRule()
{
$serviceInfo = [
'rest' => [
'resourcePath' => self::RESOURCE_PATH,
'httpMethod' => HttpConstants::HTTP_METHOD_POST,
],
'soap' => [
'service' => self::SERVICE_NAME,
'serviceVersion' => self::SERVICE_VERSION,
'operation' => self::SERVICE_NAME . 'Save',
],
];
$requestData = [
'rule' => [
'code' => 'Test Rule ' . microtime(),
'position' => 10,
'priority' => 5,
'customer_tax_class_ids' => [3],
'product_tax_class_ids' => [2],
'tax_rate_ids' => [1, 2],
'calculate_subtotal' => 1,
],
];
$taxRuleData = $this->_webApiCall($serviceInfo, $requestData);
$this->assertArrayHasKey('id', $taxRuleData, "Tax rule ID is expected");
$this->assertGreaterThan(0, $taxRuleData['id']);
$taxRuleId = $taxRuleData['id'];
unset($taxRuleData['id']);
$this->assertEquals($requestData['rule'], $taxRuleData, "Tax rule is created with invalid data.");
/** Ensure that tax rule was actually created in DB */
/** @var \Magento\Tax\Model\Calculation\Rule $taxRule */
$taxRule = Bootstrap::getObjectManager()->create(\Magento\Tax\Model\Calculation\Rule::class);
$this->assertEquals($taxRuleId, $taxRule->load($taxRuleId)->getId(), 'Tax rule was not created in DB.');
$taxRule->delete();
}
public function testCreateTaxRuleInvalidTaxClassIds()
{
$serviceInfo = [
'rest' => [
'resourcePath' => self::RESOURCE_PATH,
'httpMethod' => HttpConstants::HTTP_METHOD_POST,
],
'soap' => [
'service' => self::SERVICE_NAME,
'serviceVersion' => self::SERVICE_VERSION,
'operation' => self::SERVICE_NAME . 'Save',
],
];
$requestData = [
'rule' => [
'code' => 'Test Rule ' . microtime(),
'position' => 10,
'priority' => 5,
'customer_tax_class_ids' => [2],
'product_tax_class_ids' => [3],
'tax_rate_ids' => [1, 2],
'calculate_subtotal' => 1,
],
];
try {
$this->_webApiCall($serviceInfo, $requestData);
$this->fail('Did not throw expected InputException');
} catch (\SoapFault $e) {
$this->assertStringContainsString(
'No such entity with customer_tax_class_ids = %fieldValue',
$e->getMessage()
);
} catch (\Exception $e) {
$this->assertStringContainsString(
'No such entity with customer_tax_class_ids = %fieldValue',
$e->getMessage()
);
}
}
public function testCreateTaxRuleExistingCode()
{
$expectedMessage = '%1 already exists.';
$requestData = [
'rule' => [
'code' => 'Test Rule ' . microtime(),
'position' => 10,
'priority' => 5,
'customer_tax_class_ids' => [3],
'product_tax_class_ids' => [2],
'tax_rate_ids' => [1, 2],
'calculate_subtotal' => 0,
],
];
$serviceInfo = [
'rest' => [
'resourcePath' => self::RESOURCE_PATH,
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
],
'soap' => [
'service' => self::SERVICE_NAME,
'serviceVersion' => self::SERVICE_VERSION,
'operation' => self::SERVICE_NAME . 'Save',
],
];
$newTaxRuleData = $this->_webApiCall($serviceInfo, $requestData);
try {
$this->_webApiCall($serviceInfo, $requestData);
$this->fail('Expected exception was not raised');
} catch (\SoapFault $e) {
$this->assertStringContainsString(
$expectedMessage,
$e->getMessage(),
'SoapFault does not contain expected message.'
);
} catch (\Exception $e) {
$errorObj = $this->processRestExceptionResult($e);
$this->assertEquals($expectedMessage, $errorObj['message']);
$this->assertEquals(['Code'], $errorObj['parameters']);
}
// Clean up the new tax rule so it won't affect other tests
/** @var \Magento\Tax\Model\Calculation\Rule $taxRule */
$taxRule = Bootstrap::getObjectManager()->create(\Magento\Tax\Model\Calculation\Rule::class);
$taxRule->load($newTaxRuleData['id']);
$taxRule->delete();
}
/**
* @magentoApiDataFixture Magento/Tax/_files/tax_classes.php
*/
public function testGetTaxRule()
{
$fixtureRule = $this->getFixtureTaxRules()[0];
$taxRuleId = $fixtureRule->getId();
$serviceInfo = [
'rest' => [
'resourcePath' => self::RESOURCE_PATH . "/$taxRuleId",
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
],
'soap' => [
'service' => self::SERVICE_NAME,
'serviceVersion' => self::SERVICE_VERSION,
'operation' => self::SERVICE_NAME . 'Get',
],
];
$expectedRuleData = [
'id' => $taxRuleId,
'code' => 'Test Rule Duplicate',
'priority' => '0',
'position' => '0',
'customer_tax_class_ids' => array_values(array_unique($fixtureRule->getCustomerTaxClasses())),
'product_tax_class_ids' => array_values(array_unique($fixtureRule->getProductTaxClasses())),
'tax_rate_ids' => array_values(array_unique($fixtureRule->getRates())),
'calculate_subtotal' => false,
];
$requestData = ['ruleId' => $taxRuleId];
$result = $this->_webApiCall($serviceInfo, $requestData);
$this->assertEquals($expectedRuleData, $result);
}
/**
* @magentoApiDataFixture Magento/Tax/_files/tax_classes.php
*/
public function testSearchTaxRulesSimple()
{
// Find rules whose code is 'Test Rule'
$filter = $this->filterBuilder->setField('code')
->setValue('Test Rule')
->create();
$this->searchCriteriaBuilder->addFilters([$filter]);
$fixtureRule = $this->getFixtureTaxRules()[1];
$searchData = $this->searchCriteriaBuilder->create()->__toArray();
$requestData = ['searchCriteria' => $searchData];
$serviceInfo = [
'rest' => [
'resourcePath' => self::RESOURCE_PATH . '/search' . '?' . http_build_query($requestData),
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
],
'soap' => [
'service' => self::SERVICE_NAME,
'serviceVersion' => self::SERVICE_VERSION,
'operation' => self::SERVICE_NAME . 'GetList',
],
];
/** @var \Magento\Framework\Api\SearchResults $searchResults */
$searchResults = $this->_webApiCall($serviceInfo, $requestData);
$this->assertEquals(1, $searchResults['total_count']);
$expectedRuleData = [
[
'id' => $fixtureRule->getId(),
'code' => 'Test Rule',
'priority' => 0,
'position' => 0,
'calculate_subtotal' => 0,
'customer_tax_class_ids' => array_values(array_unique($fixtureRule->getCustomerTaxClasses())),
'product_tax_class_ids' => array_values(array_unique($fixtureRule->getProductTaxClasses())),
'tax_rate_ids' => array_values(array_unique($fixtureRule->getRates())),
],
];
$this->assertEquals($expectedRuleData, $searchResults['items']);
}
/**
* @magentoApiDataFixture Magento/Tax/_files/tax_classes.php
*/
public function testSearchTaxRulesCodeWithJoins()
{
$customerTaxClass = clone $this->taxClass->load('CustomerTaxClass2', 'class_name');
$productTaxClass = clone $this->taxClass->load('Taxable Goods', 'class_name');
$taxRate = $this->taxRate->load('*', 'code');
$filter2 = $this->filterBuilder
->setField('customer_tax_class_ids')
->setValue($customerTaxClass->getClassId())
->create();
$filter3 = $this->filterBuilder
->setField('product_tax_class_ids')
->setValue($productTaxClass->getClassId())
->create();
$filter4 = $this->filterBuilder
->setField('tax_calculation_rate_id')
->setValue($taxRate->getId())
->create();
$sortOrder = $this->sortOrderBuilder
->setField('code')
->setDirection('DESC')
->create();
$this->searchCriteriaBuilder->addFilters([$filter2, $filter3]);
$this->searchCriteriaBuilder->addFilters([$filter4]);
$this->searchCriteriaBuilder->addSortOrder($sortOrder);
$fixtureRule = $this->getFixtureTaxRules()[1];
$searchData = $this->searchCriteriaBuilder->create()->__toArray();
$requestData = ['searchCriteria' => $searchData];
$serviceInfo = [
'rest' => [
'resourcePath' => self::RESOURCE_PATH . '/search' . '?' . http_build_query($requestData),
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
],
'soap' => [
'service' => self::SERVICE_NAME,
'serviceVersion' => self::SERVICE_VERSION,
'operation' => self::SERVICE_NAME . 'GetList',
],
];
/** @var \Magento\Framework\Api\SearchResults $searchResults */
$searchResults = $this->_webApiCall($serviceInfo, $requestData);
$this->assertEquals(2, $searchResults['total_count']);
$expectedRuleData = [
[
'id' => $this->getFixtureTaxRules()[0]->getId(),
'code' => 'Test Rule Duplicate',
'priority' => 0,
'position' => 0,
'calculate_subtotal' => 0,
'customer_tax_class_ids' => array_values(array_unique($fixtureRule->getCustomerTaxClasses())),
'product_tax_class_ids' => array_values(array_unique($fixtureRule->getProductTaxClasses())),
'tax_rate_ids' => array_values(array_unique($fixtureRule->getRates()))
],
[
'id' => $fixtureRule->getId(),
'code' => 'Test Rule',
'priority' => 0,
'position' => 0,
'calculate_subtotal' => 0,
'customer_tax_class_ids' => array_values(array_unique($fixtureRule->getCustomerTaxClasses())),
'product_tax_class_ids' => array_values(array_unique($fixtureRule->getProductTaxClasses())),
'tax_rate_ids' => array_values(array_unique($fixtureRule->getRates())),
],
];
$this->assertEquals($expectedRuleData, $searchResults['items']);
}
public function testGetTaxRuleNotExist()
{
$taxRuleId = 37865;
$serviceInfo = [
'rest' => [
'resourcePath' => self::RESOURCE_PATH . "/$taxRuleId",
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
],
'soap' => [
'service' => self::SERVICE_NAME,
'serviceVersion' => self::SERVICE_VERSION,
'operation' => self::SERVICE_NAME . 'Get',
],
];
$requestData = ['ruleId' => $taxRuleId];
try {
$this->_webApiCall($serviceInfo, $requestData);
$this->fail('Expected exception was not raised');
} catch (\Exception $e) {
$expectedMessage = 'No such entity with %fieldName = %fieldValue';
$this->assertStringContainsString(
$expectedMessage,
$e->getMessage(),
"Exception does not contain expected message."
);
}
}
/**
* @magentoApiDataFixture Magento/Tax/_files/tax_classes.php
*/
public function testUpdateTaxRule()
{
$fixtureRule = $this->getFixtureTaxRules()[0];
$requestData = [
'rule' => [
'id' => $fixtureRule->getId(),
'code' => 'Test Rule ' . microtime(),
'position' => 10,
'priority' => 5,
'customer_tax_class_ids' => [3],
'product_tax_class_ids' => [2],
'tax_rate_ids' => [1, 2],
'calculate_subtotal' => 1,
],
];
$serviceInfo = [
'rest' => [
'resourcePath' => self::RESOURCE_PATH,
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT,
],
'soap' => [
'service' => self::SERVICE_NAME,
'serviceVersion' => self::SERVICE_VERSION,
'operation' => self::SERVICE_NAME . 'Save',
],
];
$this->_webApiCall($serviceInfo, $requestData);
$expectedRuleData = $requestData['rule'];
/** Ensure that tax rule was actually updated in DB */
/** @var \Magento\Tax\Model\Calculation $taxCalculation */
$taxCalculation = Bootstrap::getObjectManager()->create(\Magento\Tax\Model\Calculation::class);
/** @var \Magento\Tax\Model\Calculation\Rule $taxRule */
$taxRule = Bootstrap::getObjectManager()->create(
\Magento\Tax\Model\Calculation\Rule::class,
['calculation' => $taxCalculation]
);
$taxRuleModel = $taxRule->load($fixtureRule->getId());
$this->assertEquals($expectedRuleData['id'], $taxRuleModel->getId(), 'Tax rule was not updated in DB.');
$this->assertEquals(
$expectedRuleData['code'],
$taxRuleModel->getCode(),
'Tax rule code was updated incorrectly.'
);
$this->assertEquals(
$expectedRuleData['position'],
$taxRuleModel->getPosition(),
'Tax rule sort order was updated incorrectly.'
);
$this->assertEquals(
$expectedRuleData['priority'],
$taxRuleModel->getPriority(),
'Tax rule priority was updated incorrectly.'
);
$this->assertEquals(
$expectedRuleData['customer_tax_class_ids'],
array_values(array_unique($taxRuleModel->getCustomerTaxClasses())),
'Customer Tax classes were updated incorrectly'
);
$this->assertEquals(
$expectedRuleData['product_tax_class_ids'],
array_values(array_unique($taxRuleModel->getProductTaxClasses())),
'Product Tax classes were updated incorrectly.'
);
$this->assertEquals(
$expectedRuleData['tax_rate_ids'],
array_values(array_unique($taxRuleModel->getRates())),
'Tax rates were updated incorrectly.'
);
}
public function testUpdateTaxRuleNotExisting()
{
$requestData = [
'rule' => [
'id' => 12345,
'code' => 'Test Rule ' . microtime(),
'position' => 10,
'priority' => 5,
'customer_tax_class_ids' => [3],
'product_tax_class_ids' => [2],
'tax_rate_ids' => [1, 2],
],
];
$serviceInfo = [
'rest' => [
'resourcePath' => self::RESOURCE_PATH,
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT,
],
'soap' => [
'service' => self::SERVICE_NAME,
'serviceVersion' => self::SERVICE_VERSION,
'operation' => self::SERVICE_NAME . 'Save',
],
];
try {
$this->_webApiCall($serviceInfo, $requestData);
$this->fail('Expected exception was not raised');
} catch (\Exception $e) {
$expectedMessage = 'No such entity with %fieldName = %fieldValue';
$this->assertStringContainsString(
$expectedMessage,
$e->getMessage(),
"Exception does not contain expected message."
);
}
}
/**
* @magentoApiDataFixture Magento/Tax/_files/tax_classes.php
*/
public function testSearchTaxRule()
{
$fixtureRule = $this->getFixtureTaxRules()[0];
$filter = $this->filterBuilder->setField('code')
->setValue($fixtureRule->getCode())
->create();
$this->searchCriteriaBuilder->addFilters([$filter]);
$searchData = $this->searchCriteriaBuilder->create()->__toArray();
$requestData = ['searchCriteria' => $searchData];
$serviceInfo = [
'rest' => [
'resourcePath' => self::RESOURCE_PATH . '/search' . '?' . http_build_query($requestData),
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
],
'soap' => [
'service' => self::SERVICE_NAME,
'serviceVersion' => self::SERVICE_VERSION,
'operation' => self::SERVICE_NAME . 'GetList',
],
];
$searchResults = $this->_webApiCall($serviceInfo, $requestData);
$this->assertEquals(1, $searchResults['total_count']);
$this->assertEquals($fixtureRule->getId(), $searchResults['items'][0]["id"]);
$this->assertEquals($fixtureRule->getCode(), $searchResults['items'][0]['code']);
}
/**
* Get tax rates created in Magento\Tax\_files\tax_classes.php
*
* @return \Magento\Tax\Model\Calculation\Rate[]
*/
private function getFixtureTaxRates()
{
if ($this->fixtureTaxRates === null) {
$this->fixtureTaxRates = [];
if ($this->getFixtureTaxRules()) {
$taxRateIds = (array)$this->getFixtureTaxRules()[0]->getRates();
foreach ($taxRateIds as $taxRateId) {
/** @var \Magento\Tax\Model\Calculation\Rate $taxRate */
$taxRate = Bootstrap::getObjectManager()->create(\Magento\Tax\Model\Calculation\Rate::class);
$this->fixtureTaxRates[] = $taxRate->load($taxRateId);
}
}
}
return $this->fixtureTaxRates;
}
/**
* Get tax classes created in Magento\Tax\_files\tax_classes.php
*
* @return \Magento\Tax\Model\ClassModel[]
*/
private function getFixtureTaxClasses()
{
if ($this->fixtureTaxClasses === null) {
$this->fixtureTaxClasses = [];
if ($this->getFixtureTaxRules()) {
$taxClassIds = array_merge(
(array)$this->getFixtureTaxRules()[0]->getCustomerTaxClasses(),
(array)$this->getFixtureTaxRules()[0]->getProductTaxClasses()
);
foreach ($taxClassIds as $taxClassId) {
/** @var \Magento\Tax\Model\ClassModel $taxClass */
$taxClass = Bootstrap::getObjectManager()->create(\Magento\Tax\Model\ClassModel::class);
$this->fixtureTaxClasses[] = $taxClass->load($taxClassId);
}
}
}
return $this->fixtureTaxClasses;
}
/**
* Get tax rule created in Magento\Tax\_files\tax_classes.php
*
* @return \Magento\Tax\Model\Calculation\Rule[]
*/
private function getFixtureTaxRules()
{
if ($this->fixtureTaxRules === null) {
$this->fixtureTaxRules = [];
$taxRuleCodes = ['Test Rule Duplicate', 'Test Rule'];
foreach ($taxRuleCodes as $taxRuleCode) {
/** @var \Magento\Tax\Model\Calculation\Rule $taxRule */
$taxRule = Bootstrap::getObjectManager()->create(\Magento\Tax\Model\Calculation\Rule::class);
$taxRule->load($taxRuleCode, 'code');
if ($taxRule->getId()) {
$this->fixtureTaxRules[] = $taxRule;
}
}
}
return $this->fixtureTaxRules;
}
}