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