RuleRepositoryTest.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. <?php
  2. /**
  3. *
  4. * Copyright © Magento, Inc. All rights reserved.
  5. * See COPYING.txt for license details.
  6. */
  7. namespace Magento\SalesRule\Api;
  8. use Magento\TestFramework\Helper\Bootstrap;
  9. use Magento\TestFramework\TestCase\WebapiAbstract;
  10. class RuleRepositoryTest extends WebapiAbstract
  11. {
  12. const SERVICE_NAME = 'salesRuleRuleRepositoryV1';
  13. const RESOURCE_PATH = '/V1/salesRules';
  14. const SERVICE_VERSION = "V1";
  15. /**
  16. * @var \Magento\Framework\ObjectManagerInterface
  17. */
  18. private $objectManager;
  19. protected function setUp()
  20. {
  21. $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
  22. }
  23. protected function getSalesRuleData()
  24. {
  25. $data = [
  26. 'name' => '40% Off on Large Orders',
  27. 'store_labels' => [
  28. [
  29. 'store_id' => 0,
  30. 'store_label' => 'TestRule_Label',
  31. ],
  32. [
  33. 'store_id' => 1,
  34. 'store_label' => 'TestRule_Label_default',
  35. ],
  36. ],
  37. 'description' => 'Test sales rule',
  38. 'website_ids' => [1],
  39. 'customer_group_ids' => [0, 1, 3],
  40. 'uses_per_customer' => 2,
  41. 'is_active' => true,
  42. 'condition' => [
  43. 'condition_type' => \Magento\SalesRule\Model\Rule\Condition\Combine::class,
  44. 'conditions' => [
  45. [
  46. 'condition_type' => \Magento\SalesRule\Model\Rule\Condition\Address::class,
  47. 'operator' => '>',
  48. 'attribute_name' => 'base_subtotal',
  49. 'value' => 800
  50. ]
  51. ],
  52. 'aggregator_type' => 'all',
  53. 'operator' => null,
  54. 'value' => null,
  55. ],
  56. 'action_condition' => [
  57. 'condition_type' => \Magento\SalesRule\Model\Rule\Condition\Product\Combine::class,
  58. "conditions" => [
  59. [
  60. 'condition_type' => \Magento\SalesRule\Model\Rule\Condition\Product::class,
  61. 'operator' => '==',
  62. 'attribute_name' => 'attribute_set_id',
  63. 'value' => '4',
  64. ]
  65. ],
  66. 'aggregator_type' => 'all',
  67. 'operator' => null,
  68. 'value' => null,
  69. ],
  70. 'stop_rules_processing' => true,
  71. 'is_advanced' => true,
  72. 'sort_order' => 2,
  73. 'simple_action' => 'cart_fixed',
  74. 'discount_amount' => 40,
  75. 'discount_qty' => 2,
  76. 'discount_step' => 0,
  77. 'apply_to_shipping' => false,
  78. 'times_used' => 1,
  79. 'is_rss' => true,
  80. 'coupon_type' => \Magento\SalesRule\Api\Data\RuleInterface::COUPON_TYPE_SPECIFIC_COUPON,
  81. 'use_auto_generation' => false,
  82. 'uses_per_coupon' => 0,
  83. 'simple_free_shipping' => 0,
  84. ];
  85. return $data;
  86. }
  87. public function testCrud()
  88. {
  89. //test create
  90. $inputData = $this->getSalesRuleData();
  91. $result = $this->createRule($inputData);
  92. $ruleId = $result['rule_id'];
  93. $this->assertArrayHasKey('rule_id', $result);
  94. $this->assertEquals($ruleId, $result['rule_id']);
  95. unset($result['rule_id']);
  96. unset($result['extension_attributes']);
  97. $this->assertEquals($inputData, $result);
  98. //test getList
  99. $result = $this->verifyGetList($ruleId);
  100. unset($result['rule_id']);
  101. unset($result['extension_attributes']);
  102. $this->assertEquals($inputData, $result);
  103. //test update
  104. $inputData['times_used'] = 2;
  105. $inputData['customer_group_ids'] = [0, 1, 3];
  106. $inputData['discount_amount'] = 30;
  107. $result = $this->updateRule($ruleId, $inputData);
  108. unset($result['rule_id']);
  109. unset($result['extension_attributes']);
  110. $this->assertEquals($inputData, $result);
  111. //test get
  112. $result = $this->getRule($ruleId);
  113. unset($result['rule_id']);
  114. unset($result['extension_attributes']);
  115. $this->assertEquals($inputData, $result);
  116. //test delete
  117. $this->assertEquals(true, $this->deleteRule($ruleId));
  118. }
  119. public function verifyGetList($ruleId)
  120. {
  121. $searchCriteria = [
  122. 'searchCriteria' => [
  123. 'filter_groups' => [
  124. [
  125. 'filters' => [
  126. [
  127. 'field' => 'rule_id',
  128. 'value' => $ruleId,
  129. 'condition_type' => 'eq',
  130. ],
  131. ],
  132. ],
  133. ],
  134. 'current_page' => 1,
  135. 'page_size' => 2,
  136. ],
  137. ];
  138. $serviceInfo = [
  139. 'rest' => [
  140. 'resourcePath' => self::RESOURCE_PATH . '/search' . '?' . http_build_query($searchCriteria),
  141. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
  142. ],
  143. 'soap' => [
  144. 'service' => self::SERVICE_NAME,
  145. 'serviceVersion' => self::SERVICE_VERSION,
  146. 'operation' => self::SERVICE_NAME . 'GetList',
  147. ],
  148. ];
  149. $response = $this->_webApiCall($serviceInfo, $searchCriteria);
  150. $this->assertArrayHasKey('search_criteria', $response);
  151. $this->assertArrayHasKey('total_count', $response);
  152. $this->assertArrayHasKey('items', $response);
  153. $this->assertEquals($searchCriteria['searchCriteria'], $response['search_criteria']);
  154. $this->assertTrue($response['total_count'] > 0);
  155. $this->assertTrue(count($response['items']) > 0);
  156. $this->assertNotNull($response['items'][0]['rule_id']);
  157. $this->assertEquals($ruleId, $response['items'][0]['rule_id']);
  158. return $response['items'][0];
  159. }
  160. /**
  161. * @magentoApiDataFixture Magento/SalesRule/_files/rules_advanced.php
  162. */
  163. public function testGetListWithMultipleFiltersAndSorting()
  164. {
  165. /** @var $searchCriteriaBuilder \Magento\Framework\Api\SearchCriteriaBuilder */
  166. $searchCriteriaBuilder = $this->objectManager->create(
  167. \Magento\Framework\Api\SearchCriteriaBuilder::class
  168. );
  169. /** @var $filterBuilder \Magento\Framework\Api\FilterBuilder */
  170. $filterBuilder = $this->objectManager->create(
  171. \Magento\Framework\Api\FilterBuilder::class
  172. );
  173. /** @var \Magento\Framework\Api\SortOrderBuilder $sortOrderBuilder */
  174. $sortOrderBuilder = $this->objectManager->create(
  175. \Magento\Framework\Api\SortOrderBuilder::class
  176. );
  177. $filter1 = $filterBuilder->setField('is_rss')
  178. ->setValue(1)
  179. ->setConditionType('eq')
  180. ->create();
  181. $filter2 = $filterBuilder->setField('name')
  182. ->setValue('#4')
  183. ->setConditionType('eq')
  184. ->create();
  185. $filter3 = $filterBuilder->setField('uses_per_coupon')
  186. ->setValue(1)
  187. ->setConditionType('gt')
  188. ->create();
  189. $sortOrder = $sortOrderBuilder->setField('name')
  190. ->setDirection('ASC')
  191. ->create();
  192. $searchCriteriaBuilder->addFilters([$filter1, $filter2]);
  193. $searchCriteriaBuilder->addFilters([$filter3]);
  194. $searchCriteriaBuilder->addSortOrder($sortOrder);
  195. $searchData = $searchCriteriaBuilder->create()->__toArray();
  196. $requestData = ['searchCriteria' => $searchData];
  197. $serviceInfo = [
  198. 'rest' => [
  199. 'resourcePath' => self::RESOURCE_PATH . '/search?' . http_build_query($requestData),
  200. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
  201. ],
  202. 'soap' => [
  203. 'service' => self::SERVICE_NAME,
  204. 'serviceVersion' => self::SERVICE_VERSION,
  205. 'operation' => self::SERVICE_NAME . 'GetList',
  206. ],
  207. ];
  208. $result = $this->_webApiCall($serviceInfo, $requestData);
  209. $this->assertArrayHasKey('items', $result);
  210. $this->assertArrayHasKey('search_criteria', $result);
  211. $this->assertCount(2, $result['items']);
  212. $this->assertEquals('#1', $result['items'][0]['name']);
  213. $this->assertEquals('#2', $result['items'][1]['name']);
  214. $this->assertEquals($searchData, $result['search_criteria']);
  215. }
  216. /**
  217. * Create Sales rule
  218. *
  219. * @param $rule
  220. * @return array
  221. */
  222. protected function createRule($rule)
  223. {
  224. $serviceInfo = [
  225. 'rest' => [
  226. 'resourcePath' => self::RESOURCE_PATH,
  227. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST
  228. ],
  229. 'soap' => [
  230. 'service' => self::SERVICE_NAME,
  231. 'serviceVersion' => self::SERVICE_VERSION,
  232. 'operation' => self::SERVICE_NAME . 'Save',
  233. ],
  234. ];
  235. $requestData = ['rule' => $rule];
  236. return $this->_webApiCall($serviceInfo, $requestData);
  237. }
  238. /**
  239. * @param int $id
  240. * @return bool
  241. * @throws \Exception
  242. */
  243. protected function deleteRule($id)
  244. {
  245. $serviceInfo = [
  246. 'rest' => [
  247. 'resourcePath' => self::RESOURCE_PATH . '/' . $id,
  248. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_DELETE,
  249. ],
  250. 'soap' => [
  251. 'service' => self::SERVICE_NAME,
  252. 'serviceVersion' => self::SERVICE_VERSION,
  253. 'operation' => self::SERVICE_NAME . 'DeleteById',
  254. ],
  255. ];
  256. return $this->_webApiCall($serviceInfo, ['rule_id' => $id]);
  257. }
  258. protected function updateRule($id, $data)
  259. {
  260. $serviceInfo = [
  261. 'rest' => [
  262. 'resourcePath' => self::RESOURCE_PATH . '/' . $id,
  263. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT,
  264. ],
  265. 'soap' => [
  266. 'service' => self::SERVICE_NAME,
  267. 'serviceVersion' => self::SERVICE_VERSION,
  268. 'operation' => self::SERVICE_NAME . 'Save',
  269. ],
  270. ];
  271. $data['rule_id'] = $id;
  272. return $this->_webApiCall($serviceInfo, ['rule_id' => $id, 'rule' => $data]);
  273. }
  274. protected function getRule($id)
  275. {
  276. $serviceInfo = [
  277. 'rest' => [
  278. 'resourcePath' => self::RESOURCE_PATH . '/' . $id,
  279. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
  280. ],
  281. 'soap' => [
  282. 'service' => self::SERVICE_NAME,
  283. 'serviceVersion' => self::SERVICE_VERSION,
  284. 'operation' => self::SERVICE_NAME . 'GetById',
  285. ],
  286. ];
  287. return $this->_webApiCall($serviceInfo, ['rule_id' => $id]);
  288. }
  289. }