751 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			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;
 | 
						|
    }
 | 
						|
}
 |