28 private $fixtureTaxRates;
31 private $fixtureTaxClasses;
34 private $fixtureTaxRules;
37 private $filterBuilder;
40 private $searchCriteriaBuilder;
49 private $sortOrderBuilder;
57 \
Magento\Framework\Api\SearchCriteriaBuilder::class
60 \
Magento\Framework\Api\FilterBuilder::class
65 \
Magento\Framework\Api\SearchCriteriaBuilder::class
68 \
Magento\Framework\Api\FilterBuilder::class
71 SortOrderBuilder::class
74 \
Magento\Tax\Api\Data\TaxClassInterface::class
78 \
Magento\Tax\Api\Data\TaxRateInterface::class
82 $this->getFixtureTaxRates();
83 $this->getFixtureTaxClasses();
84 $this->getFixtureTaxRules();
91 $taxRates = $this->getFixtureTaxRates();
96 foreach ($taxRates as $taxRate) {
108 public function testDeleteTaxRule()
110 $fixtureRule = $this->getFixtureTaxRules()[0];
111 $taxRuleId = $fixtureRule->getId();
114 'resourcePath' => self::RESOURCE_PATH .
"/$taxRuleId",
120 'operation' => self::SERVICE_NAME .
'DeleteById',
129 $this->assertNull($taxRate->load($taxRuleId)->getId(),
'Tax rule was not deleted from DB.');
132 public function testCreateTaxRule()
137 'httpMethod' => HttpConstants::HTTP_METHOD_POST,
142 'operation' => self::SERVICE_NAME .
'Save',
147 'code' =>
'Test Rule ' . microtime(),
150 'customer_tax_class_ids' => [3],
151 'product_tax_class_ids' => [2],
152 'tax_rate_ids' => [1, 2],
153 'calculate_subtotal' => 1,
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.");
165 $this->assertEquals($taxRuleId,
$taxRule->load($taxRuleId)->getId(),
'Tax rule was not created in DB.');
174 'httpMethod' => HttpConstants::HTTP_METHOD_POST,
179 'operation' => self::SERVICE_NAME .
'Save',
184 'code' =>
'Test Rule ' . microtime(),
187 'customer_tax_class_ids' => [2],
188 'product_tax_class_ids' => [3],
189 'tax_rate_ids' => [1, 2],
190 'calculate_subtotal' => 1,
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());
204 public function testCreateTaxRuleExistingCode()
206 $expectedMessage =
'%1 already exists.';
209 'code' =>
'Test Rule ' . microtime(),
212 'customer_tax_class_ids' => [3],
213 'product_tax_class_ids' => [2],
214 'tax_rate_ids' => [1, 2],
215 'calculate_subtotal' => 0,
227 'operation' => self::SERVICE_NAME .
'Save',
233 $this->fail(
'Expected exception was not raised');
234 }
catch (\SoapFault $e) {
235 $this->assertContains(
238 'SoapFault does not contain expected message.' 240 }
catch (\Exception $e) {
242 $this->assertEquals($expectedMessage, $errorObj[
'message']);
243 $this->assertEquals([
'Code'], $errorObj[
'parameters']);
249 $taxRule->load($newTaxRuleData[
'id']);
258 $fixtureRule = $this->getFixtureTaxRules()[0];
259 $taxRuleId = $fixtureRule->getId();
263 'resourcePath' => self::RESOURCE_PATH .
"/$taxRuleId",
269 'operation' => self::SERVICE_NAME .
'Get',
273 $expectedRuleData = [
275 'code' =>
'Test Rule Duplicate',
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,
285 $this->assertEquals($expectedRuleData,
$result);
291 public function testSearchTaxRulesSimple()
294 $filter = $this->filterBuilder->setField(
'code')
295 ->setValue(
'Test Rule')
298 $this->searchCriteriaBuilder->addFilters([$filter]);
300 $fixtureRule = $this->getFixtureTaxRules()[1];
302 $searchData = $this->searchCriteriaBuilder->create()->__toArray();
306 'resourcePath' => self::RESOURCE_PATH .
'/search' .
'?' . http_build_query(
$requestData),
312 'operation' => self::SERVICE_NAME .
'GetList',
319 $this->assertEquals(1, $searchResults[
'total_count']);
321 $expectedRuleData = [
323 'id' => $fixtureRule->getId(),
324 'code' =>
'Test Rule',
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())),
333 $this->assertEquals($expectedRuleData, $searchResults[
'items']);
339 public function testSearchTaxRulesCodeWithJoins()
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');
345 $filter2 = $this->filterBuilder
346 ->setField(
'customer_tax_class_ids')
349 $filter3 = $this->filterBuilder
350 ->setField(
'product_tax_class_ids')
351 ->setValue($productTaxClass->getClassId())
353 $filter4 = $this->filterBuilder
354 ->setField(
'tax_calculation_rate_id')
355 ->setValue($taxRate->getId())
357 $sortOrder = $this->sortOrderBuilder
359 ->setDirection(
'DESC')
362 $this->searchCriteriaBuilder->addFilters([$filter2, $filter3]);
363 $this->searchCriteriaBuilder->addFilters([$filter4]);
364 $this->searchCriteriaBuilder->addSortOrder($sortOrder);
366 $fixtureRule = $this->getFixtureTaxRules()[1];
368 $searchData = $this->searchCriteriaBuilder->create()->__toArray();
372 'resourcePath' => self::RESOURCE_PATH .
'/search' .
'?' . http_build_query(
$requestData),
378 'operation' => self::SERVICE_NAME .
'GetList',
385 $this->assertEquals(2, $searchResults[
'total_count']);
387 $expectedRuleData = [
389 'id' => $this->getFixtureTaxRules()[0]->getId(),
390 'code' =>
'Test Rule Duplicate',
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()))
399 'id' => $fixtureRule->getId(),
400 'code' =>
'Test Rule',
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())),
409 $this->assertEquals($expectedRuleData, $searchResults[
'items']);
417 'resourcePath' => self::RESOURCE_PATH .
"/$taxRuleId",
423 'operation' => self::SERVICE_NAME .
'Get',
429 $this->fail(
'Expected exception was not raised');
430 }
catch (\Exception $e) {
431 $expectedMessage =
'No such entity with %fieldName = %fieldValue';
433 $this->assertContains(
436 "Exception does not contain expected message." 444 public function testUpdateTaxRule()
446 $fixtureRule = $this->getFixtureTaxRules()[0];
449 'id' => $fixtureRule->getId(),
450 'code' =>
'Test Rule ' . microtime(),
453 'customer_tax_class_ids' => [3],
454 'product_tax_class_ids' => [2],
455 'tax_rate_ids' => [1, 2],
456 'calculate_subtotal' => 1,
467 'operation' => self::SERVICE_NAME .
'Save',
477 \
Magento\Tax\Model\Calculation\Rule::class,
478 [
'calculation' => $taxCalculation]
480 $taxRuleModel =
$taxRule->load($fixtureRule->getId());
481 $this->assertEquals($expectedRuleData[
'id'], $taxRuleModel->getId(),
'Tax rule was not updated in DB.');
483 $expectedRuleData[
'code'],
484 $taxRuleModel->getCode(),
485 'Tax rule code was updated incorrectly.' 488 $expectedRuleData[
'position'],
489 $taxRuleModel->getPosition(),
490 'Tax rule sort order was updated incorrectly.' 493 $expectedRuleData[
'priority'],
494 $taxRuleModel->getPriority(),
495 'Tax rule priority was updated incorrectly.' 498 $expectedRuleData[
'customer_tax_class_ids'],
499 array_values(array_unique($taxRuleModel->getCustomerTaxClasses())),
500 'Customer Tax classes were updated incorrectly' 503 $expectedRuleData[
'product_tax_class_ids'],
504 array_values(array_unique($taxRuleModel->getProductTaxClasses())),
505 'Product Tax classes were updated incorrectly.' 508 $expectedRuleData[
'tax_rate_ids'],
509 array_values(array_unique($taxRuleModel->getRates())),
510 'Tax rates were updated incorrectly.' 519 'code' =>
'Test Rule ' . microtime(),
522 'customer_tax_class_ids' => [3],
523 'product_tax_class_ids' => [2],
524 'tax_rate_ids' => [1, 2],
536 'operation' => self::SERVICE_NAME .
'Save',
541 $this->fail(
'Expected exception was not raised');
542 }
catch (\Exception $e) {
543 $expectedMessage =
'No such entity with %fieldName = %fieldValue';
545 $this->assertContains(
548 "Exception does not contain expected message." 558 $fixtureRule = $this->getFixtureTaxRules()[0];
560 $filter = $this->filterBuilder->setField(
'code')
561 ->setValue($fixtureRule->getCode())
563 $this->searchCriteriaBuilder->addFilters([$filter]);
564 $searchData = $this->searchCriteriaBuilder->create()->__toArray();
568 'resourcePath' => self::RESOURCE_PATH .
'/search' .
'?' . http_build_query(
$requestData),
574 'operation' => self::SERVICE_NAME .
'GetList',
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']);
588 private function getFixtureTaxRates()
590 if ($this->fixtureTaxRates ===
null) {
591 $this->fixtureTaxRates = [];
592 if ($this->getFixtureTaxRules()) {
593 $taxRateIds = (array)$this->getFixtureTaxRules()[0]->getRates();
594 foreach ($taxRateIds as $taxRateId) {
597 $this->fixtureTaxRates[] = $taxRate->load($taxRateId);
601 return $this->fixtureTaxRates;
609 private function getFixtureTaxClasses()
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()
618 foreach ($taxClassIds as $taxClassId) {
621 $this->fixtureTaxClasses[] = $taxClass->load($taxClassId);
625 return $this->fixtureTaxClasses;
633 private function getFixtureTaxRules()
635 if ($this->fixtureTaxRules ===
null) {
636 $this->fixtureTaxRules = [];
637 $taxRuleCodes = [
'Test Rule Duplicate',
'Test Rule'];
638 foreach ($taxRuleCodes as $taxRuleCode) {
641 $taxRule->load($taxRuleCode,
'code');
643 $this->fixtureTaxRules[] =
$taxRule;
647 return $this->fixtureTaxRules;
_webApiCall( $serviceInfo, $arguments=[], $webApiAdapterCode=null, $storeCode=null, $integration=null)
processRestExceptionResult(\Exception $e)
testUpdateTaxRuleNotExisting()
testCreateTaxRuleInvalidTaxClassIds()
static getObjectManager()