TaxClassRepositoryTest.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  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\Framework\Exception\NoSuchEntityException;
  11. use Magento\Tax\Api\Data\TaxClassInterfaceFactory;
  12. use Magento\Tax\Model\ClassModel;
  13. use Magento\Tax\Model\ClassModelRegistry;
  14. use Magento\TestFramework\Helper\Bootstrap;
  15. use Magento\TestFramework\TestCase\WebapiAbstract;
  16. /**
  17. * Tests for tax class service.
  18. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  19. */
  20. class TaxClassRepositoryTest extends WebapiAbstract
  21. {
  22. const SERVICE_NAME = 'taxTaxClassRepositoryV1';
  23. const SERVICE_VERSION = 'V1';
  24. const RESOURCE_PATH = '/V1/taxClasses';
  25. /** @var SearchCriteriaBuilder */
  26. private $searchCriteriaBuilder;
  27. /** @var FilterBuilder */
  28. private $filterBuilder;
  29. /** @var SortOrderBuilder */
  30. private $sortOrderBuilder;
  31. /** @var TaxClassInterfaceFactory */
  32. private $taxClassFactory;
  33. /** @var TaxClassRepositoryInterface */
  34. private $taxClassRepository;
  35. /** @var ClassModelRegistry */
  36. private $taxClassRegistry;
  37. const SAMPLE_TAX_CLASS_NAME = 'Wholesale Customer';
  38. /**
  39. * Execute per test initialization.
  40. */
  41. public function setUp()
  42. {
  43. $this->searchCriteriaBuilder = Bootstrap::getObjectManager()->create(
  44. \Magento\Framework\Api\SearchCriteriaBuilder::class
  45. );
  46. $this->filterBuilder = Bootstrap::getObjectManager()->create(
  47. \Magento\Framework\Api\FilterBuilder::class
  48. );
  49. $this->taxClassFactory = Bootstrap::getObjectManager()->create(
  50. \Magento\Tax\Api\Data\TaxClassInterfaceFactory::class
  51. );
  52. $this->taxClassRegistry = Bootstrap::getObjectManager()->create(
  53. \Magento\Tax\Model\ClassModelRegistry::class
  54. );
  55. $this->taxClassRepository = Bootstrap::getObjectManager()->create(
  56. \Magento\Tax\Model\TaxClass\Repository::class,
  57. ['classModelRegistry' => $this->taxClassRegistry]
  58. );
  59. $this->sortOrderBuilder = Bootstrap::getObjectManager()->create(
  60. \Magento\Framework\Api\SortOrderBuilder::class
  61. );
  62. }
  63. /**
  64. * Test create Data\TaxClassInterface
  65. */
  66. public function testCreateTaxClass()
  67. {
  68. $taxClassName = self::SAMPLE_TAX_CLASS_NAME . uniqid();
  69. /** @var \Magento\Tax\Api\Data\TaxClassInterface $taxClassDataObject */
  70. $taxClassDataObject = $this->taxClassFactory->create();
  71. $taxClassDataObject->setClassName($taxClassName)
  72. ->setClassType(TaxClassManagementInterface::TYPE_CUSTOMER);
  73. $serviceInfo = [
  74. 'rest' => [
  75. 'resourcePath' => self::RESOURCE_PATH,
  76. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
  77. ],
  78. 'soap' => [
  79. 'service' => self::SERVICE_NAME,
  80. 'serviceVersion' => self::SERVICE_VERSION,
  81. 'operation' => self::SERVICE_NAME . 'Save',
  82. ],
  83. ];
  84. $requestData = ['taxClass' => [
  85. 'class_id' => $taxClassDataObject->getClassId(),
  86. 'class_name' => $taxClassDataObject->getClassName(),
  87. 'class_type' => $taxClassDataObject->getClassType(),
  88. ],
  89. ];
  90. $taxClassId = $this->_webApiCall($serviceInfo, $requestData);
  91. $this->assertNotNull($taxClassId);
  92. //Verify by getting the Data\TaxClassInterface
  93. $taxClassData = $this->taxClassRepository->get($taxClassId);
  94. $this->assertEquals($taxClassData->getClassName(), $taxClassName);
  95. $this->assertEquals($taxClassData->getClassType(), TaxClassManagementInterface::TYPE_CUSTOMER);
  96. }
  97. /**
  98. * Test create Data\TaxClassInterface
  99. */
  100. public function testUpdateTaxClass()
  101. {
  102. //Create Tax Class
  103. $taxClassDataObject = $this->taxClassFactory->create();
  104. $taxClassDataObject->setClassName(self::SAMPLE_TAX_CLASS_NAME . uniqid())
  105. ->setClassType(TaxClassManagementInterface::TYPE_CUSTOMER);
  106. $taxClassId = $this->taxClassRepository->save($taxClassDataObject);
  107. $this->assertNotNull($taxClassId);
  108. //Update Tax Class
  109. $updatedTaxClassName = self::SAMPLE_TAX_CLASS_NAME . uniqid();
  110. $updatedTaxClassDataObject = $taxClassDataObject;
  111. $updatedTaxClassDataObject->setClassName($updatedTaxClassName);
  112. $serviceInfo = [
  113. 'rest' => [
  114. 'resourcePath' => self::RESOURCE_PATH . '/' . $taxClassId,
  115. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT,
  116. ],
  117. 'soap' => [
  118. 'service' => self::SERVICE_NAME,
  119. 'serviceVersion' => self::SERVICE_VERSION,
  120. 'operation' => self::SERVICE_NAME . 'Save',
  121. ],
  122. ];
  123. $taxClass = [
  124. 'class_id' => $updatedTaxClassDataObject->getClassId(),
  125. 'class_name' => $updatedTaxClassDataObject->getClassName(),
  126. 'class_type' => $updatedTaxClassDataObject->getClassType(),
  127. ];
  128. $requestData = ['taxClass' => $taxClass, 'ClassId' => $taxClassId];
  129. $this->assertEquals($taxClassId, $this->_webApiCall($serviceInfo, $requestData));
  130. //Verify by getting the Data\TaxClassInterface
  131. $this->taxClassRegistry->remove($taxClassId);
  132. $taxClassData = $this->taxClassRepository->get($taxClassId);
  133. $this->assertEquals($taxClassData->getClassName(), $updatedTaxClassName);
  134. }
  135. public function testGetTaxClass()
  136. {
  137. //Create Tax Class
  138. $taxClassName = self::SAMPLE_TAX_CLASS_NAME . uniqid();
  139. $taxClassDataObject = $this->taxClassFactory->create();
  140. $taxClassDataObject->setClassName($taxClassName)
  141. ->setClassType(TaxClassManagementInterface::TYPE_CUSTOMER);
  142. $taxClassId = $this->taxClassRepository->save($taxClassDataObject);
  143. $this->assertNotNull($taxClassId);
  144. //Verify by getting the Data\TaxClassInterface
  145. $serviceInfo = [
  146. 'rest' => [
  147. 'resourcePath' => self::RESOURCE_PATH . '/' . $taxClassId,
  148. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
  149. ],
  150. 'soap' => [
  151. 'service' => self::SERVICE_NAME,
  152. 'serviceVersion' => self::SERVICE_VERSION,
  153. 'operation' => self::SERVICE_NAME . 'Get',
  154. ],
  155. ];
  156. $requestData = ['taxClassId' => $taxClassId];
  157. $taxClassData = $this->_webApiCall($serviceInfo, $requestData);
  158. $this->assertEquals($taxClassData[ClassModel::KEY_NAME], $taxClassName);
  159. $this->assertEquals(
  160. $taxClassData[ClassModel::KEY_TYPE],
  161. TaxClassManagementInterface::TYPE_CUSTOMER
  162. );
  163. }
  164. /**
  165. * Test delete Tax class
  166. */
  167. public function testDeleteTaxClass()
  168. {
  169. $taxClassDataObject = $this->taxClassFactory->create();
  170. $taxClassDataObject->setClassName(self::SAMPLE_TAX_CLASS_NAME . uniqid())
  171. ->setClassType(TaxClassManagementInterface::TYPE_CUSTOMER);
  172. $taxClassId = $this->taxClassRepository->save($taxClassDataObject);
  173. $this->assertNotNull($taxClassId);
  174. //Verify by getting the Data\TaxClassInterface
  175. $serviceInfo = [
  176. 'rest' => [
  177. 'resourcePath' => self::RESOURCE_PATH . '/' . $taxClassId,
  178. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_DELETE,
  179. ],
  180. 'soap' => [
  181. 'service' => self::SERVICE_NAME,
  182. 'serviceVersion' => self::SERVICE_VERSION,
  183. 'operation' => self::SERVICE_NAME . 'DeleteById',
  184. ],
  185. ];
  186. $requestData = ['taxClassId' => $taxClassId];
  187. $result = $this->_webApiCall($serviceInfo, $requestData);
  188. $this->assertTrue($result);
  189. try {
  190. $this->taxClassRegistry->remove($taxClassId);
  191. $this->taxClassRepository->get($taxClassId);
  192. $this->fail("Tax class was not expected to be returned after being deleted.");
  193. } catch (NoSuchEntityException $e) {
  194. $this->assertEquals('No such entity with class_id = ' . $taxClassId, $e->getMessage());
  195. }
  196. }
  197. /**
  198. * Test with a single filter
  199. */
  200. public function testSearchTaxClass()
  201. {
  202. $taxClassName = 'Retail Customer';
  203. $taxClassNameField = ClassModel::KEY_NAME;
  204. $filter = $this->filterBuilder->setField($taxClassNameField)
  205. ->setValue($taxClassName)
  206. ->create();
  207. $this->searchCriteriaBuilder->addFilters([$filter]);
  208. $searchData = $this->searchCriteriaBuilder->create()->__toArray();
  209. $requestData = ['searchCriteria' => $searchData];
  210. $serviceInfo = [
  211. 'rest' => [
  212. 'resourcePath' => self::RESOURCE_PATH . '/search' . '?' . http_build_query($requestData),
  213. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
  214. ],
  215. 'soap' => [
  216. 'service' => self::SERVICE_NAME,
  217. 'serviceVersion' => self::SERVICE_VERSION,
  218. 'operation' => self::SERVICE_NAME . 'GetList',
  219. ],
  220. ];
  221. $searchResults = $this->_webApiCall($serviceInfo, $requestData);
  222. $this->assertEquals(1, $searchResults['total_count']);
  223. $this->assertEquals($taxClassName, $searchResults['items'][0][$taxClassNameField]);
  224. }
  225. /**
  226. * Test using multiple filters
  227. */
  228. public function testSearchTaxClassMultipleFilterGroups()
  229. {
  230. $productTaxClass = [
  231. ClassModel::KEY_NAME => 'Taxable Goods',
  232. ClassModel::KEY_TYPE => 'PRODUCT',
  233. ];
  234. $customerTaxClass = [ClassModel::KEY_NAME => 'Retail Customer',
  235. ClassModel::KEY_TYPE => 'CUSTOMER', ];
  236. $filter1 = $this->filterBuilder->setField(ClassModel::KEY_NAME)
  237. ->setValue($productTaxClass[ClassModel::KEY_NAME])
  238. ->create();
  239. $filter2 = $this->filterBuilder->setField(ClassModel::KEY_NAME)
  240. ->setValue($customerTaxClass[ClassModel::KEY_NAME])
  241. ->create();
  242. $filter3 = $this->filterBuilder->setField(ClassModel::KEY_TYPE)
  243. ->setValue($productTaxClass[ClassModel::KEY_TYPE])
  244. ->create();
  245. $filter4 = $this->filterBuilder->setField(ClassModel::KEY_TYPE)
  246. ->setValue($customerTaxClass[ClassModel::KEY_TYPE])
  247. ->create();
  248. $sortOrder = $this->sortOrderBuilder->setField("class_type")
  249. ->setDirection("ASC")->create();
  250. /**
  251. * (class_name == 'Retail Customer' || class_name == 'Taxable Goods)
  252. * && ( class_type == 'CUSTOMER' || class_type == 'PRODUCT')
  253. */
  254. $this->searchCriteriaBuilder->addFilters([$filter1, $filter2]);
  255. $this->searchCriteriaBuilder->addFilters([$filter3, $filter4]);
  256. $this->searchCriteriaBuilder->addSortOrder($sortOrder);
  257. $searchCriteria = $this->searchCriteriaBuilder->setCurrentPage(1)->setPageSize(10)->create();
  258. $searchData = $searchCriteria->__toArray();
  259. $requestData = ['searchCriteria' => $searchData];
  260. $serviceInfo = [
  261. 'rest' => [
  262. 'resourcePath' => self::RESOURCE_PATH . '/search' . '?' . http_build_query($requestData),
  263. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
  264. ],
  265. 'soap' => [
  266. 'service' => self::SERVICE_NAME,
  267. 'serviceVersion' => self::SERVICE_VERSION,
  268. 'operation' => self::SERVICE_NAME . 'GetList',
  269. ],
  270. ];
  271. $searchResults = $this->_webApiCall($serviceInfo, $requestData);
  272. $this->assertEquals(2, $searchResults['total_count']);
  273. $this->assertEquals(
  274. $customerTaxClass[ClassModel::KEY_NAME],
  275. $searchResults['items'][0][ClassModel::KEY_NAME]
  276. );
  277. $this->assertEquals(
  278. $productTaxClass[ClassModel::KEY_NAME],
  279. $searchResults['items'][1][ClassModel::KEY_NAME]
  280. );
  281. /** class_name == 'Retail Customer' && ( class_type == 'CUSTOMER' || class_type == 'PRODUCT') */
  282. $this->searchCriteriaBuilder->addFilters([$filter2]);
  283. $this->searchCriteriaBuilder->addFilters([$filter3, $filter4]);
  284. $searchCriteria = $this->searchCriteriaBuilder->create();
  285. $searchData = $searchCriteria->__toArray();
  286. $requestData = ['searchCriteria' => $searchData];
  287. $serviceInfo['rest']['resourcePath'] = self::RESOURCE_PATH . '/search' . '?' . http_build_query($requestData);
  288. $searchResults = $this->_webApiCall($serviceInfo, $requestData);
  289. $this->assertEquals(1, $searchResults['total_count']);
  290. $this->assertEquals(
  291. $customerTaxClass[ClassModel::KEY_NAME],
  292. $searchResults['items'][0][ClassModel::KEY_NAME]
  293. );
  294. }
  295. }