TaxRuleRepositoryInterfaceTest.php 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Tax\Api;
  7. use Magento\Framework\Api\FilterBuilder;
  8. use Magento\Framework\Api\SearchCriteriaBuilder;
  9. use Magento\Framework\Api\SortOrderBuilder;
  10. use Magento\TestFramework\Helper\Bootstrap;
  11. use Magento\TestFramework\TestCase\WebapiAbstract;
  12. use Magento\Webapi\Model\Rest\Config as HttpConstants;
  13. /**
  14. * Class TaxRuleRepositoryInterfaceTest
  15. * @package Magento\Tax\Api
  16. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  17. */
  18. class TaxRuleRepositoryInterfaceTest extends WebapiAbstract
  19. {
  20. const SERVICE_NAME = "taxTaxRuleRepositoryV1";
  21. const SERVICE_VERSION = "V1";
  22. const RESOURCE_PATH = "/V1/taxRules";
  23. /** @var \Magento\Tax\Model\Calculation\Rate[] */
  24. private $fixtureTaxRates;
  25. /** @var \Magento\Tax\Model\ClassModel[] */
  26. private $fixtureTaxClasses;
  27. /** @var \Magento\Tax\Model\Calculation\Rule[] */
  28. private $fixtureTaxRules;
  29. /** @var FilterBuilder */
  30. private $filterBuilder;
  31. /** @var SearchCriteriaBuilder */
  32. private $searchCriteriaBuilder;
  33. /** @var \Magento\Tax\Api\Data\TaxClassInterface | \Magento\Tax\Model\ClassModel */
  34. private $taxClass;
  35. /** @var \Magento\Tax\Api\Data\TaxRateInterface | \Magento\Tax\Model\Calculation\Rate */
  36. private $taxRate;
  37. /** @var SortOrderBuilder */
  38. private $sortOrderBuilder;
  39. /**
  40. * Execute per test initialization.
  41. */
  42. public function setUp()
  43. {
  44. $this->searchCriteriaBuilder = Bootstrap::getObjectManager()->create(
  45. \Magento\Framework\Api\SearchCriteriaBuilder::class
  46. );
  47. $this->filterBuilder = Bootstrap::getObjectManager()->create(
  48. \Magento\Framework\Api\FilterBuilder::class
  49. );
  50. $objectManager = Bootstrap::getObjectManager();
  51. $this->searchCriteriaBuilder = $objectManager->create(
  52. \Magento\Framework\Api\SearchCriteriaBuilder::class
  53. );
  54. $this->filterBuilder = $objectManager->create(
  55. \Magento\Framework\Api\FilterBuilder::class
  56. );
  57. $this->sortOrderBuilder = $objectManager->create(
  58. SortOrderBuilder::class
  59. );
  60. $this->taxClass = $objectManager->create(
  61. \Magento\Tax\Api\Data\TaxClassInterface::class
  62. );
  63. $this->taxRate = $objectManager->create(
  64. \Magento\Tax\Api\Data\TaxRateInterface::class
  65. );
  66. /** Initialize tax classes, tax rates and tax rules defined in fixture Magento/Tax/_files/tax_classes.php */
  67. $this->getFixtureTaxRates();
  68. $this->getFixtureTaxClasses();
  69. $this->getFixtureTaxRules();
  70. }
  71. public function tearDown()
  72. {
  73. $taxRules = $this->getFixtureTaxRules();
  74. if (count($taxRules)) {
  75. $taxRates = $this->getFixtureTaxRates();
  76. $taxClasses = $this->getFixtureTaxClasses();
  77. foreach ($taxRules as $taxRule) {
  78. $taxRule->delete();
  79. }
  80. foreach ($taxRates as $taxRate) {
  81. $taxRate->delete();
  82. }
  83. foreach ($taxClasses as $taxClass) {
  84. $taxClass->delete();
  85. }
  86. }
  87. }
  88. /**
  89. * @magentoApiDataFixture Magento/Tax/_files/tax_classes.php
  90. */
  91. public function testDeleteTaxRule()
  92. {
  93. $fixtureRule = $this->getFixtureTaxRules()[0];
  94. $taxRuleId = $fixtureRule->getId();
  95. $serviceInfo = [
  96. 'rest' => [
  97. 'resourcePath' => self::RESOURCE_PATH . "/$taxRuleId",
  98. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_DELETE,
  99. ],
  100. 'soap' => [
  101. 'service' => self::SERVICE_NAME,
  102. 'serviceVersion' => self::SERVICE_VERSION,
  103. 'operation' => self::SERVICE_NAME . 'DeleteById',
  104. ],
  105. ];
  106. $requestData = ['ruleId' => $taxRuleId];
  107. $result = $this->_webApiCall($serviceInfo, $requestData);
  108. $this->assertTrue($result);
  109. /** Ensure that tax rule was actually removed from DB */
  110. /** @var \Magento\Tax\Model\Calculation\Rule $taxRule */
  111. $taxRate = Bootstrap::getObjectManager()->create(\Magento\Tax\Model\Calculation\Rate::class);
  112. $this->assertNull($taxRate->load($taxRuleId)->getId(), 'Tax rule was not deleted from DB.');
  113. }
  114. public function testCreateTaxRule()
  115. {
  116. $serviceInfo = [
  117. 'rest' => [
  118. 'resourcePath' => self::RESOURCE_PATH,
  119. 'httpMethod' => HttpConstants::HTTP_METHOD_POST,
  120. ],
  121. 'soap' => [
  122. 'service' => self::SERVICE_NAME,
  123. 'serviceVersion' => self::SERVICE_VERSION,
  124. 'operation' => self::SERVICE_NAME . 'Save',
  125. ],
  126. ];
  127. $requestData = [
  128. 'rule' => [
  129. 'code' => 'Test Rule ' . microtime(),
  130. 'position' => 10,
  131. 'priority' => 5,
  132. 'customer_tax_class_ids' => [3],
  133. 'product_tax_class_ids' => [2],
  134. 'tax_rate_ids' => [1, 2],
  135. 'calculate_subtotal' => 1,
  136. ],
  137. ];
  138. $taxRuleData = $this->_webApiCall($serviceInfo, $requestData);
  139. $this->assertArrayHasKey('id', $taxRuleData, "Tax rule ID is expected");
  140. $this->assertGreaterThan(0, $taxRuleData['id']);
  141. $taxRuleId = $taxRuleData['id'];
  142. unset($taxRuleData['id']);
  143. $this->assertEquals($requestData['rule'], $taxRuleData, "Tax rule is created with invalid data.");
  144. /** Ensure that tax rule was actually created in DB */
  145. /** @var \Magento\Tax\Model\Calculation\Rule $taxRule */
  146. $taxRule = Bootstrap::getObjectManager()->create(\Magento\Tax\Model\Calculation\Rule::class);
  147. $this->assertEquals($taxRuleId, $taxRule->load($taxRuleId)->getId(), 'Tax rule was not created in DB.');
  148. $taxRule->delete();
  149. }
  150. public function testCreateTaxRuleInvalidTaxClassIds()
  151. {
  152. $serviceInfo = [
  153. 'rest' => [
  154. 'resourcePath' => self::RESOURCE_PATH,
  155. 'httpMethod' => HttpConstants::HTTP_METHOD_POST,
  156. ],
  157. 'soap' => [
  158. 'service' => self::SERVICE_NAME,
  159. 'serviceVersion' => self::SERVICE_VERSION,
  160. 'operation' => self::SERVICE_NAME . 'Save',
  161. ],
  162. ];
  163. $requestData = [
  164. 'rule' => [
  165. 'code' => 'Test Rule ' . microtime(),
  166. 'position' => 10,
  167. 'priority' => 5,
  168. 'customer_tax_class_ids' => [2],
  169. 'product_tax_class_ids' => [3],
  170. 'tax_rate_ids' => [1, 2],
  171. 'calculate_subtotal' => 1,
  172. ],
  173. ];
  174. try {
  175. $this->_webApiCall($serviceInfo, $requestData);
  176. $this->fail('Did not throw expected InputException');
  177. } catch (\SoapFault $e) {
  178. $this->assertContains('No such entity with customer_tax_class_ids = %fieldValue', $e->getMessage());
  179. } catch (\Exception $e) {
  180. $this->assertContains('No such entity with customer_tax_class_ids = %fieldValue', $e->getMessage());
  181. }
  182. }
  183. public function testCreateTaxRuleExistingCode()
  184. {
  185. $expectedMessage = '%1 already exists.';
  186. $requestData = [
  187. 'rule' => [
  188. 'code' => 'Test Rule ' . microtime(),
  189. 'position' => 10,
  190. 'priority' => 5,
  191. 'customer_tax_class_ids' => [3],
  192. 'product_tax_class_ids' => [2],
  193. 'tax_rate_ids' => [1, 2],
  194. 'calculate_subtotal' => 0,
  195. ],
  196. ];
  197. $serviceInfo = [
  198. 'rest' => [
  199. 'resourcePath' => self::RESOURCE_PATH,
  200. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
  201. ],
  202. 'soap' => [
  203. 'service' => self::SERVICE_NAME,
  204. 'serviceVersion' => self::SERVICE_VERSION,
  205. 'operation' => self::SERVICE_NAME . 'Save',
  206. ],
  207. ];
  208. $newTaxRuleData = $this->_webApiCall($serviceInfo, $requestData);
  209. try {
  210. $this->_webApiCall($serviceInfo, $requestData);
  211. $this->fail('Expected exception was not raised');
  212. } catch (\SoapFault $e) {
  213. $this->assertContains(
  214. $expectedMessage,
  215. $e->getMessage(),
  216. 'SoapFault does not contain expected message.'
  217. );
  218. } catch (\Exception $e) {
  219. $errorObj = $this->processRestExceptionResult($e);
  220. $this->assertEquals($expectedMessage, $errorObj['message']);
  221. $this->assertEquals(['Code'], $errorObj['parameters']);
  222. }
  223. // Clean up the new tax rule so it won't affect other tests
  224. /** @var \Magento\Tax\Model\Calculation\Rule $taxRule */
  225. $taxRule = Bootstrap::getObjectManager()->create(\Magento\Tax\Model\Calculation\Rule::class);
  226. $taxRule->load($newTaxRuleData['id']);
  227. $taxRule->delete();
  228. }
  229. /**
  230. * @magentoApiDataFixture Magento/Tax/_files/tax_classes.php
  231. */
  232. public function testGetTaxRule()
  233. {
  234. $fixtureRule = $this->getFixtureTaxRules()[0];
  235. $taxRuleId = $fixtureRule->getId();
  236. $serviceInfo = [
  237. 'rest' => [
  238. 'resourcePath' => self::RESOURCE_PATH . "/$taxRuleId",
  239. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
  240. ],
  241. 'soap' => [
  242. 'service' => self::SERVICE_NAME,
  243. 'serviceVersion' => self::SERVICE_VERSION,
  244. 'operation' => self::SERVICE_NAME . 'Get',
  245. ],
  246. ];
  247. $expectedRuleData = [
  248. 'id' => $taxRuleId,
  249. 'code' => 'Test Rule Duplicate',
  250. 'priority' => '0',
  251. 'position' => '0',
  252. 'customer_tax_class_ids' => array_values(array_unique($fixtureRule->getCustomerTaxClasses())),
  253. 'product_tax_class_ids' => array_values(array_unique($fixtureRule->getProductTaxClasses())),
  254. 'tax_rate_ids' => array_values(array_unique($fixtureRule->getRates())),
  255. 'calculate_subtotal' => false,
  256. ];
  257. $requestData = ['ruleId' => $taxRuleId];
  258. $result = $this->_webApiCall($serviceInfo, $requestData);
  259. $this->assertEquals($expectedRuleData, $result);
  260. }
  261. /**
  262. * @magentoApiDataFixture Magento/Tax/_files/tax_classes.php
  263. */
  264. public function testSearchTaxRulesSimple()
  265. {
  266. // Find rules whose code is 'Test Rule'
  267. $filter = $this->filterBuilder->setField('code')
  268. ->setValue('Test Rule')
  269. ->create();
  270. $this->searchCriteriaBuilder->addFilters([$filter]);
  271. $fixtureRule = $this->getFixtureTaxRules()[1];
  272. $searchData = $this->searchCriteriaBuilder->create()->__toArray();
  273. $requestData = ['searchCriteria' => $searchData];
  274. $serviceInfo = [
  275. 'rest' => [
  276. 'resourcePath' => self::RESOURCE_PATH . '/search' . '?' . http_build_query($requestData),
  277. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
  278. ],
  279. 'soap' => [
  280. 'service' => self::SERVICE_NAME,
  281. 'serviceVersion' => self::SERVICE_VERSION,
  282. 'operation' => self::SERVICE_NAME . 'GetList',
  283. ],
  284. ];
  285. /** @var \Magento\Framework\Api\SearchResults $searchResults */
  286. $searchResults = $this->_webApiCall($serviceInfo, $requestData);
  287. $this->assertEquals(1, $searchResults['total_count']);
  288. $expectedRuleData = [
  289. [
  290. 'id' => $fixtureRule->getId(),
  291. 'code' => 'Test Rule',
  292. 'priority' => 0,
  293. 'position' => 0,
  294. 'calculate_subtotal' => 0,
  295. 'customer_tax_class_ids' => array_values(array_unique($fixtureRule->getCustomerTaxClasses())),
  296. 'product_tax_class_ids' => array_values(array_unique($fixtureRule->getProductTaxClasses())),
  297. 'tax_rate_ids' => array_values(array_unique($fixtureRule->getRates())),
  298. ],
  299. ];
  300. $this->assertEquals($expectedRuleData, $searchResults['items']);
  301. }
  302. /**
  303. * @magentoApiDataFixture Magento/Tax/_files/tax_classes.php
  304. */
  305. public function testSearchTaxRulesCodeWithJoins()
  306. {
  307. $customerTaxClass = clone $this->taxClass->load('CustomerTaxClass2', 'class_name');
  308. $productTaxClass = clone $this->taxClass->load('Taxable Goods', 'class_name');
  309. $taxRate = $this->taxRate->load('*', 'code');
  310. $filter2 = $this->filterBuilder
  311. ->setField('customer_tax_class_ids')
  312. ->setValue($customerTaxClass->getClassId())
  313. ->create();
  314. $filter3 = $this->filterBuilder
  315. ->setField('product_tax_class_ids')
  316. ->setValue($productTaxClass->getClassId())
  317. ->create();
  318. $filter4 = $this->filterBuilder
  319. ->setField('tax_calculation_rate_id')
  320. ->setValue($taxRate->getId())
  321. ->create();
  322. $sortOrder = $this->sortOrderBuilder
  323. ->setField('code')
  324. ->setDirection('DESC')
  325. ->create();
  326. $this->searchCriteriaBuilder->addFilters([$filter2, $filter3]);
  327. $this->searchCriteriaBuilder->addFilters([$filter4]);
  328. $this->searchCriteriaBuilder->addSortOrder($sortOrder);
  329. $fixtureRule = $this->getFixtureTaxRules()[1];
  330. $searchData = $this->searchCriteriaBuilder->create()->__toArray();
  331. $requestData = ['searchCriteria' => $searchData];
  332. $serviceInfo = [
  333. 'rest' => [
  334. 'resourcePath' => self::RESOURCE_PATH . '/search' . '?' . http_build_query($requestData),
  335. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
  336. ],
  337. 'soap' => [
  338. 'service' => self::SERVICE_NAME,
  339. 'serviceVersion' => self::SERVICE_VERSION,
  340. 'operation' => self::SERVICE_NAME . 'GetList',
  341. ],
  342. ];
  343. /** @var \Magento\Framework\Api\SearchResults $searchResults */
  344. $searchResults = $this->_webApiCall($serviceInfo, $requestData);
  345. $this->assertEquals(2, $searchResults['total_count']);
  346. $expectedRuleData = [
  347. [
  348. 'id' => $this->getFixtureTaxRules()[0]->getId(),
  349. 'code' => 'Test Rule Duplicate',
  350. 'priority' => 0,
  351. 'position' => 0,
  352. 'calculate_subtotal' => 0,
  353. 'customer_tax_class_ids' => array_values(array_unique($fixtureRule->getCustomerTaxClasses())),
  354. 'product_tax_class_ids' => array_values(array_unique($fixtureRule->getProductTaxClasses())),
  355. 'tax_rate_ids' => array_values(array_unique($fixtureRule->getRates()))
  356. ],
  357. [
  358. 'id' => $fixtureRule->getId(),
  359. 'code' => 'Test Rule',
  360. 'priority' => 0,
  361. 'position' => 0,
  362. 'calculate_subtotal' => 0,
  363. 'customer_tax_class_ids' => array_values(array_unique($fixtureRule->getCustomerTaxClasses())),
  364. 'product_tax_class_ids' => array_values(array_unique($fixtureRule->getProductTaxClasses())),
  365. 'tax_rate_ids' => array_values(array_unique($fixtureRule->getRates())),
  366. ],
  367. ];
  368. $this->assertEquals($expectedRuleData, $searchResults['items']);
  369. }
  370. public function testGetTaxRuleNotExist()
  371. {
  372. $taxRuleId = 37865;
  373. $serviceInfo = [
  374. 'rest' => [
  375. 'resourcePath' => self::RESOURCE_PATH . "/$taxRuleId",
  376. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
  377. ],
  378. 'soap' => [
  379. 'service' => self::SERVICE_NAME,
  380. 'serviceVersion' => self::SERVICE_VERSION,
  381. 'operation' => self::SERVICE_NAME . 'Get',
  382. ],
  383. ];
  384. $requestData = ['ruleId' => $taxRuleId];
  385. try {
  386. $this->_webApiCall($serviceInfo, $requestData);
  387. $this->fail('Expected exception was not raised');
  388. } catch (\Exception $e) {
  389. $expectedMessage = 'No such entity with %fieldName = %fieldValue';
  390. $this->assertContains(
  391. $expectedMessage,
  392. $e->getMessage(),
  393. "Exception does not contain expected message."
  394. );
  395. }
  396. }
  397. /**
  398. * @magentoApiDataFixture Magento/Tax/_files/tax_classes.php
  399. */
  400. public function testUpdateTaxRule()
  401. {
  402. $fixtureRule = $this->getFixtureTaxRules()[0];
  403. $requestData = [
  404. 'rule' => [
  405. 'id' => $fixtureRule->getId(),
  406. 'code' => 'Test Rule ' . microtime(),
  407. 'position' => 10,
  408. 'priority' => 5,
  409. 'customer_tax_class_ids' => [3],
  410. 'product_tax_class_ids' => [2],
  411. 'tax_rate_ids' => [1, 2],
  412. 'calculate_subtotal' => 1,
  413. ],
  414. ];
  415. $serviceInfo = [
  416. 'rest' => [
  417. 'resourcePath' => self::RESOURCE_PATH,
  418. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT,
  419. ],
  420. 'soap' => [
  421. 'service' => self::SERVICE_NAME,
  422. 'serviceVersion' => self::SERVICE_VERSION,
  423. 'operation' => self::SERVICE_NAME . 'Save',
  424. ],
  425. ];
  426. $this->_webApiCall($serviceInfo, $requestData);
  427. $expectedRuleData = $requestData['rule'];
  428. /** Ensure that tax rule was actually updated in DB */
  429. /** @var \Magento\Tax\Model\Calculation $taxCalculation */
  430. $taxCalculation = Bootstrap::getObjectManager()->create(\Magento\Tax\Model\Calculation::class);
  431. /** @var \Magento\Tax\Model\Calculation\Rule $taxRule */
  432. $taxRule = Bootstrap::getObjectManager()->create(
  433. \Magento\Tax\Model\Calculation\Rule::class,
  434. ['calculation' => $taxCalculation]
  435. );
  436. $taxRuleModel = $taxRule->load($fixtureRule->getId());
  437. $this->assertEquals($expectedRuleData['id'], $taxRuleModel->getId(), 'Tax rule was not updated in DB.');
  438. $this->assertEquals(
  439. $expectedRuleData['code'],
  440. $taxRuleModel->getCode(),
  441. 'Tax rule code was updated incorrectly.'
  442. );
  443. $this->assertEquals(
  444. $expectedRuleData['position'],
  445. $taxRuleModel->getPosition(),
  446. 'Tax rule sort order was updated incorrectly.'
  447. );
  448. $this->assertEquals(
  449. $expectedRuleData['priority'],
  450. $taxRuleModel->getPriority(),
  451. 'Tax rule priority was updated incorrectly.'
  452. );
  453. $this->assertEquals(
  454. $expectedRuleData['customer_tax_class_ids'],
  455. array_values(array_unique($taxRuleModel->getCustomerTaxClasses())),
  456. 'Customer Tax classes were updated incorrectly'
  457. );
  458. $this->assertEquals(
  459. $expectedRuleData['product_tax_class_ids'],
  460. array_values(array_unique($taxRuleModel->getProductTaxClasses())),
  461. 'Product Tax classes were updated incorrectly.'
  462. );
  463. $this->assertEquals(
  464. $expectedRuleData['tax_rate_ids'],
  465. array_values(array_unique($taxRuleModel->getRates())),
  466. 'Tax rates were updated incorrectly.'
  467. );
  468. }
  469. public function testUpdateTaxRuleNotExisting()
  470. {
  471. $requestData = [
  472. 'rule' => [
  473. 'id' => 12345,
  474. 'code' => 'Test Rule ' . microtime(),
  475. 'position' => 10,
  476. 'priority' => 5,
  477. 'customer_tax_class_ids' => [3],
  478. 'product_tax_class_ids' => [2],
  479. 'tax_rate_ids' => [1, 2],
  480. ],
  481. ];
  482. $serviceInfo = [
  483. 'rest' => [
  484. 'resourcePath' => self::RESOURCE_PATH,
  485. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT,
  486. ],
  487. 'soap' => [
  488. 'service' => self::SERVICE_NAME,
  489. 'serviceVersion' => self::SERVICE_VERSION,
  490. 'operation' => self::SERVICE_NAME . 'Save',
  491. ],
  492. ];
  493. try {
  494. $this->_webApiCall($serviceInfo, $requestData);
  495. $this->fail('Expected exception was not raised');
  496. } catch (\Exception $e) {
  497. $expectedMessage = 'No such entity with %fieldName = %fieldValue';
  498. $this->assertContains(
  499. $expectedMessage,
  500. $e->getMessage(),
  501. "Exception does not contain expected message."
  502. );
  503. }
  504. }
  505. /**
  506. * @magentoApiDataFixture Magento/Tax/_files/tax_classes.php
  507. */
  508. public function testSearchTaxRule()
  509. {
  510. $fixtureRule = $this->getFixtureTaxRules()[0];
  511. $filter = $this->filterBuilder->setField('code')
  512. ->setValue($fixtureRule->getCode())
  513. ->create();
  514. $this->searchCriteriaBuilder->addFilters([$filter]);
  515. $searchData = $this->searchCriteriaBuilder->create()->__toArray();
  516. $requestData = ['searchCriteria' => $searchData];
  517. $serviceInfo = [
  518. 'rest' => [
  519. 'resourcePath' => self::RESOURCE_PATH . '/search' . '?' . http_build_query($requestData),
  520. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
  521. ],
  522. 'soap' => [
  523. 'service' => self::SERVICE_NAME,
  524. 'serviceVersion' => self::SERVICE_VERSION,
  525. 'operation' => self::SERVICE_NAME . 'GetList',
  526. ],
  527. ];
  528. $searchResults = $this->_webApiCall($serviceInfo, $requestData);
  529. $this->assertEquals(1, $searchResults['total_count']);
  530. $this->assertEquals($fixtureRule->getId(), $searchResults['items'][0]["id"]);
  531. $this->assertEquals($fixtureRule->getCode(), $searchResults['items'][0]['code']);
  532. }
  533. /**
  534. * Get tax rates created in Magento\Tax\_files\tax_classes.php
  535. *
  536. * @return \Magento\Tax\Model\Calculation\Rate[]
  537. */
  538. private function getFixtureTaxRates()
  539. {
  540. if ($this->fixtureTaxRates === null) {
  541. $this->fixtureTaxRates = [];
  542. if ($this->getFixtureTaxRules()) {
  543. $taxRateIds = (array)$this->getFixtureTaxRules()[0]->getRates();
  544. foreach ($taxRateIds as $taxRateId) {
  545. /** @var \Magento\Tax\Model\Calculation\Rate $taxRate */
  546. $taxRate = Bootstrap::getObjectManager()->create(\Magento\Tax\Model\Calculation\Rate::class);
  547. $this->fixtureTaxRates[] = $taxRate->load($taxRateId);
  548. }
  549. }
  550. }
  551. return $this->fixtureTaxRates;
  552. }
  553. /**
  554. * Get tax classes created in Magento\Tax\_files\tax_classes.php
  555. *
  556. * @return \Magento\Tax\Model\ClassModel[]
  557. */
  558. private function getFixtureTaxClasses()
  559. {
  560. if ($this->fixtureTaxClasses === null) {
  561. $this->fixtureTaxClasses = [];
  562. if ($this->getFixtureTaxRules()) {
  563. $taxClassIds = array_merge(
  564. (array)$this->getFixtureTaxRules()[0]->getCustomerTaxClasses(),
  565. (array)$this->getFixtureTaxRules()[0]->getProductTaxClasses()
  566. );
  567. foreach ($taxClassIds as $taxClassId) {
  568. /** @var \Magento\Tax\Model\ClassModel $taxClass */
  569. $taxClass = Bootstrap::getObjectManager()->create(\Magento\Tax\Model\ClassModel::class);
  570. $this->fixtureTaxClasses[] = $taxClass->load($taxClassId);
  571. }
  572. }
  573. }
  574. return $this->fixtureTaxClasses;
  575. }
  576. /**
  577. * Get tax rule created in Magento\Tax\_files\tax_classes.php
  578. *
  579. * @return \Magento\Tax\Model\Calculation\Rule[]
  580. */
  581. private function getFixtureTaxRules()
  582. {
  583. if ($this->fixtureTaxRules === null) {
  584. $this->fixtureTaxRules = [];
  585. $taxRuleCodes = ['Test Rule Duplicate', 'Test Rule'];
  586. foreach ($taxRuleCodes as $taxRuleCode) {
  587. /** @var \Magento\Tax\Model\Calculation\Rule $taxRule */
  588. $taxRule = Bootstrap::getObjectManager()->create(\Magento\Tax\Model\Calculation\Rule::class);
  589. $taxRule->load($taxRuleCode, 'code');
  590. if ($taxRule->getId()) {
  591. $this->fixtureTaxRules[] = $taxRule;
  592. }
  593. }
  594. }
  595. return $this->fixtureTaxRules;
  596. }
  597. }