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

751 lines
27 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\SortOrder;
use Magento\Framework\Api\SortOrderBuilder;
use Magento\Tax\Model\Calculation\Rate;
use Magento\TestFramework\Helper\Bootstrap;
use Magento\TestFramework\TestCase\WebapiAbstract;
/**
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class TaxRateRepositoryTest extends WebapiAbstract
{
const SERVICE_NAME = "taxTaxRateRepositoryV1";
const SERVICE_VERSION = "V1";
const RESOURCE_PATH = "/V1/taxRates";
/** @var \Magento\Tax\Model\Calculation\Rate[] */
private $fixtureTaxRates;
/** @var \Magento\Tax\Model\ClassModel[] */
private $fixtureTaxClasses;
/** @var \Magento\Tax\Model\Calculation\Rule[] */
private $fixtureTaxRules;
/**
* @var \Magento\Tax\Api\TaxRateRepositoryInterface
*/
private $taxRateService;
/** @var FilterBuilder */
private $filterBuilder;
/** @var SearchCriteriaBuilder */
private $searchCriteriaBuilder;
/** @var SortOrderBuilder */
private $sortOrderBuilder;
/**
* Other rates created during tests, to be deleted in tearDown()
*
* @var \Magento\Tax\Model\Calculation\Rate[]
*/
private $otherRates = [];
/**
* Execute per test initialization.
*/
protected function setUp(): void
{
$objectManager = Bootstrap::getObjectManager();
$this->taxRateService = $objectManager->get(\Magento\Tax\Api\TaxRateRepositoryInterface::class);
$this->searchCriteriaBuilder = $objectManager->create(
\Magento\Framework\Api\SearchCriteriaBuilder::class
);
$this->filterBuilder = $objectManager->create(
\Magento\Framework\Api\FilterBuilder::class
);
$this->sortOrderBuilder = $objectManager->create(
\Magento\Framework\Api\SortOrderBuilder::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();
}
}
if (count($this->otherRates)) {
foreach ($this->otherRates as $taxRate) {
$taxRate->delete();
}
}
}
public function testCreateTaxRateExistingCode()
{
$expectedMessage = '%1 already exists.';
$data = [
'tax_rate' => [
'tax_country_id' => 'US',
'tax_region_id' => 12,
'tax_postcode' => '*',
'code' => 'US-CA-*-Rate 1',
'rate' => '8.2501',
],
];
$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',
],
];
try {
$this->_webApiCall($serviceInfo, $data);
$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']);
}
}
public function testCreateTaxRateWithoutValue()
{
$data = [
'tax_rate' => [
'tax_country_id' => 'US',
'tax_region_id' => 12,
'tax_postcode' => '*',
'code' => 'US-CA-*-Rate 1',
],
];
$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',
],
];
try {
$this->_webApiCall($serviceInfo, $data);
$this->fail('Expected exception was not raised');
} catch (\SoapFault $e) {
$this->assertStringContainsString(
'SOAP-ERROR: Encoding: object has no \'rate\' property',
$e->getMessage(),
'SoapFault does not contain expected message.'
);
} catch (\Exception $e) {
$errorObj = $this->processRestExceptionResult($e);
$this->assertEquals('"%fieldName" is required. Enter and try again.', $errorObj['message']);
$this->assertEquals(['fieldName' => 'percentage_rate'], $errorObj['parameters']);
}
}
public function testCreateTaxRate()
{
$data = [
'tax_rate' => [
'tax_country_id' => 'US',
'tax_region_id' => 12,
'tax_postcode' => '*',
'code' => 'Test Tax Rate ' . microtime(),
'rate' => '8.2501',
],
];
$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',
],
];
$result = $this->_webApiCall($serviceInfo, $data);
$this->assertArrayHasKey('id', $result);
$taxRateId = $result['id'];
/** Ensure that tax rate was actually created in DB */
/** @var \Magento\Tax\Model\Calculation\Rate $taxRate */
$taxRate = Bootstrap::getObjectManager()->create(\Magento\Tax\Model\Calculation\Rate::class);
$this->assertEquals($taxRateId, $taxRate->load($taxRateId)->getId(), 'Tax rate was not created in DB.');
$taxRate->delete();
}
public function testCreateTaxRateWithZipRange()
{
$data = [
'tax_rate' => [
'tax_country_id' => 'US',
'tax_region_id' => 12,
'code' => 'Test Tax Rate ' . microtime(),
'rate' => '8.2501',
'zip_is_range' => 1,
'zip_from' => 17,
'zip_to' => 25,
],
];
$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',
],
];
$result = $this->_webApiCall($serviceInfo, $data);
$this->assertArrayHasKey('id', $result);
$taxRateId = $result['id'];
/** Ensure that tax rate was actually created in DB */
/** @var \Magento\Tax\Model\Calculation\Rate $taxRate */
$taxRate = Bootstrap::getObjectManager()->create(\Magento\Tax\Model\Calculation\Rate::class);
$this->assertEquals($taxRateId, $taxRate->load($taxRateId)->getId(), 'Tax rate was not created in DB.');
$this->assertEquals('17-25', $taxRate->getTaxPostcode(), 'Zip range is not saved in DB.');
$taxRate->delete();
}
public function testCreateTaxRateWithZeroValue()
{
$data = [
'tax_rate' => [
'tax_country_id' => 'US',
'tax_region_id' => 12,
'tax_postcode' => '*',
'code' => 'Test Tax Rate ' . microtime(),
'rate' => '0.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',
],
];
$result = $this->_webApiCall($serviceInfo, $data);
$this->assertArrayHasKey('id', $result);
$taxRateId = $result['id'];
/** Ensure that tax rate was actually created in DB */
/** @var \Magento\Tax\Model\Calculation\Rate $taxRate */
$taxRate = Bootstrap::getObjectManager()->create(\Magento\Tax\Model\Calculation\Rate::class);
$taxModel = $taxRate->load($taxRateId);
$this->assertEquals($taxRateId, $taxModel->getId(), 'Tax rate was not created in DB.');
$this->assertEquals(0, $taxModel->getRate(), 'Tax rate value is wrong.');
$taxRate->delete();
}
/**
* @magentoApiDataFixture Magento/Tax/_files/tax_classes.php
*/
public function testUpdateTaxRate()
{
$fixtureRate = $this->getFixtureTaxRates()[0];
$data = [
'tax_rate' => [
'id' => $fixtureRate->getId(),
'tax_region_id' => 43,
'tax_country_id' => 'US',
'tax_postcode' => '07400',
'code' => 'Test Tax Rate ' . microtime(),
'rate' => 3.456,
],
];
$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, $data);
$expectedRateData = $data['tax_rate'];
/** Ensure that tax rate was actually updated in DB */
/** @var \Magento\Tax\Model\Calculation\Rate $taxRate */
$taxRate = Bootstrap::getObjectManager()->create(\Magento\Tax\Model\Calculation\Rate::class);
$taxRateModel = $taxRate->load($fixtureRate->getId());
$this->assertEquals($expectedRateData['id'], $taxRateModel->getId(), 'Tax rate was not updated in DB.');
$this->assertEquals(
$expectedRateData['tax_region_id'],
$taxRateModel->getTaxRegionId(),
'Tax rate was not updated in DB.'
);
$this->assertEquals(
$expectedRateData['tax_country_id'],
$taxRateModel->getTaxCountryId(),
'Tax rate was not updated in DB.'
);
$this->assertEquals(
$expectedRateData['tax_postcode'],
$taxRateModel->getTaxPostcode(),
'Tax rate was not updated in DB.'
);
$this->assertEquals($expectedRateData['code'], $taxRateModel->getCode(), 'Tax rate was not updated in DB.');
$this->assertEquals(
$expectedRateData['rate'],
$taxRateModel->getRate(),
'Tax rate was not updated in DB.'
);
}
public function testUpdateTaxRateNotExisting()
{
$data = [
'tax_rate' => [
'id' => 555,
'tax_region_id' => 43,
'tax_country_id' => 'US',
'tax_postcode' => '07400',
'code' => 'Test Tax Rate ' . microtime(),
'rate' => 3.456,
],
];
$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, $data);
$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."
);
}
}
public function testGetTaxRate()
{
$taxRateId = 2;
$serviceInfo = [
'rest' => [
'resourcePath' => self::RESOURCE_PATH . "/$taxRateId",
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
],
'soap' => [
'service' => self::SERVICE_NAME,
'serviceVersion' => self::SERVICE_VERSION,
'operation' => self::SERVICE_NAME . 'Get',
],
];
$result = $this->_webApiCall($serviceInfo, ['rateId' => $taxRateId]);
$expectedRateData = [
'id' => 2,
'tax_country_id' => 'US',
'tax_region_id' => 43,
'tax_postcode' => '*',
'code' => 'US-NY-*-Rate 1',
'rate' => 8.375,
'titles' => [],
'region_name' => 'NY',
];
$this->assertEquals($expectedRateData, $result);
}
public function testGetTaxRateNotExist()
{
$taxRateId = 37865;
$serviceInfo = [
'rest' => [
'resourcePath' => self::RESOURCE_PATH . "/$taxRateId",
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
],
'soap' => [
'service' => self::SERVICE_NAME,
'serviceVersion' => self::SERVICE_VERSION,
'operation' => self::SERVICE_NAME . 'Get',
],
];
try {
$this->_webApiCall($serviceInfo, ['rateId' => $taxRateId]);
$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 testDeleteTaxRate()
{
/** Tax rules must be deleted since tax rate cannot be deleted if there are any tax rules associated with it */
$taxRules = $this->getFixtureTaxRules();
foreach ($taxRules as $taxRule) {
$taxRule->delete();
}
$fixtureRate = $this->getFixtureTaxRates()[0];
$taxRateId = $fixtureRate->getId();
$serviceInfo = [
'rest' => [
'resourcePath' => self::RESOURCE_PATH . "/$taxRateId",
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_DELETE,
],
'soap' => [
'service' => self::SERVICE_NAME,
'serviceVersion' => self::SERVICE_VERSION,
'operation' => self::SERVICE_NAME . 'DeleteById',
],
];
$result = $this->_webApiCall($serviceInfo, ['rateId' => $taxRateId]);
$this->assertTrue($result);
/** Ensure that tax rate was actually removed from DB */
/** @var \Magento\Tax\Model\Calculation\Rate $taxRate */
$taxRate = Bootstrap::getObjectManager()->create(\Magento\Tax\Model\Calculation\Rate::class);
$this->assertNull($taxRate->load($taxRateId)->getId(), 'Tax rate was not deleted from DB.');
}
/**
* Insure that tax rate cannot be deleted if it is used for a tax rule.
*
* @magentoApiDataFixture Magento/Tax/_files/tax_classes.php
*/
public function testCannotDeleteTaxRate()
{
$fixtureRate = $this->getFixtureTaxRates()[0];
$taxRateId = $fixtureRate->getId();
$serviceInfo = [
'rest' => [
'resourcePath' => self::RESOURCE_PATH . "/$taxRateId",
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_DELETE,
],
'soap' => [
'service' => self::SERVICE_NAME,
'serviceVersion' => self::SERVICE_VERSION,
'operation' => self::SERVICE_NAME . 'DeleteById',
],
];
try {
$this->_webApiCall($serviceInfo, ['rateId' => $taxRateId]);
$this->fail('Expected exception was not raised');
} catch (\Exception $e) {
$expectedMessage = "The tax rate can't be removed because it exists in a tax rule.";
$this->assertStringContainsString(
$expectedMessage,
$e->getMessage(),
"Exception does not contain expected message."
);
}
}
public function testSearchTaxRates()
{
$rates = $this->setupTaxRatesForSearch();
// Find rates whose code is 'codeUs12'
$filter = $this->filterBuilder->setField(Rate::KEY_CODE)
->setValue('codeUs12')
->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',
],
];
/** @var \Magento\Framework\Api\SearchResults $searchResults */
$searchResults = $this->_webApiCall($serviceInfo, $requestData);
$this->assertEquals(1, $searchResults['total_count']);
$expectedRuleData = [
[
'id' => (int)$rates['codeUs12']->getId(),
'tax_country_id' => $rates['codeUs12']->getTaxCountryId(),
'tax_region_id' => (int)$rates['codeUs12']->getTaxRegionId(),
'region_name' => 'CA',
'tax_postcode' => $rates['codeUs12']->getTaxPostcode(),
'code' => $rates['codeUs12']->getCode(),
'rate' => ((float) $rates['codeUs12']->getRate()),
'titles' => [],
],
];
$this->assertEquals($expectedRuleData, $searchResults['items']);
}
public function testSearchTaxRatesCz()
{
// TODO: This test fails in SOAP, a generic bug searching in SOAP
$this->_markTestAsRestOnly();
$rates = $this->setupTaxRatesForSearch();
$filterBR = $this->filterBuilder->setField(Rate::KEY_COUNTRY_ID)
->setValue('BR')
->create();
$filterUS = $this->filterBuilder->setField(Rate::KEY_COUNTRY_ID)
->setValue('US')
->create();
// Find rates which country id 'CZ'
$filterCZ = $this->filterBuilder->setField(Rate::KEY_COUNTRY_ID)
->setValue('CZ')
->create();
$sortOrder = $this->sortOrderBuilder
->setField(Rate::KEY_POSTCODE)
->setDirection(SortOrder::SORT_DESC)
->create();
$filterRate = $this->filterBuilder->setField(Rate::KEY_PERCENTAGE_RATE)
->setValue('2.2000')
->create();
$this->searchCriteriaBuilder->addFilters([$filterBR, $filterUS, $filterCZ]);
// Order them by descending postcode (not the default order)
$this->searchCriteriaBuilder->addFilters([$filterCZ, $filterRate])
->addSortOrder($sortOrder);
$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' => (int)$rates['codeCz2']->getId(),
'tax_country_id' => $rates['codeCz2']->getTaxCountryId(),
'tax_postcode' => $rates['codeCz2']->getTaxPostcode(),
'code' => $rates['codeCz2']->getCode(),
'rate' => ((float) $rates['codeCz2']->getRate()),
'tax_region_id' => 0,
'titles' => [],
],
[
'id' => (int)$rates['codeCz1']->getId(),
'tax_country_id' => $rates['codeCz1']->getTaxCountryId(),
'tax_postcode' => $rates['codeCz1']->getTaxPostcode(),
'code' => $rates['codeCz1']->getCode(),
'rate' => ((float) $rates['codeCz1']->getRate()),
'tax_region_id' => 0,
'titles' => [],
],
];
$this->assertEquals($expectedRuleData, $searchResults['items']);
}
/**
* 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;
}
/**
* Creates rates for search tests.
*
* @return \Magento\Tax\Model\Calculation\Rate[]
*/
private function setupTaxRatesForSearch()
{
$objectManager = Bootstrap::getObjectManager();
$taxRateUs12 = [
'tax_country_id' => 'US',
'tax_region_id' => 12,
'tax_postcode' => '*',
'code' => 'codeUs12',
'rate' => 22,
'region_name' => 'CA',
];
$rates['codeUs12'] = $objectManager->create(\Magento\Tax\Model\Calculation\Rate::class)
->setData($taxRateUs12)
->save();
$taxRateUs14 = [
'tax_country_id' => 'US',
'tax_region_id' => 14,
'tax_postcode' => '*',
'code' => 'codeUs14',
'rate' => 22,
];
$rates['codeUs14'] = $objectManager->create(\Magento\Tax\Model\Calculation\Rate::class)
->setData($taxRateUs14)
->save();
$taxRateBr13 = [
'tax_country_id' => 'BR',
'tax_region_id' => 13,
'tax_postcode' => '*',
'code' => 'codeBr13',
'rate' => 7.5,
];
$rates['codeBr13'] = $objectManager->create(\Magento\Tax\Model\Calculation\Rate::class)
->setData($taxRateBr13)
->save();
$taxRateCz1 = [
'tax_country_id' => 'CZ',
'tax_postcode' => '110 00',
'code' => 'codeCz1',
'rate' => 1.1,
];
$rates['codeCz1'] = $objectManager->create(\Magento\Tax\Model\Calculation\Rate::class)
->setData($taxRateCz1)
->save();
$taxRateCz2 = [
'tax_country_id' => 'CZ',
'tax_postcode' => '250 00',
'code' => 'codeCz2',
'rate' => 2.2,
];
$rates['codeCz2'] = $objectManager->create(\Magento\Tax\Model\Calculation\Rate::class)
->setData($taxRateCz2)
->save();
// Set class variable so rates will be deleted on tearDown()
$this->otherRates = $rates;
return $rates;
}
}