PageRenderTime 24ms CodeModel.GetById 12ms RepoModel.GetById 1ms app.codeStats 0ms

/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductCustomOptionRepositoryTest.php

https://gitlab.com/yousafsyed/easternglamor
PHP | 373 lines | 285 code | 33 blank | 55 comment | 13 complexity | 6a563a9fc28f9ef3ba62c34764880313 MD5 | raw file
  1. <?php
  2. /**
  3. *
  4. * Copyright © 2016 Magento. All rights reserved.
  5. * See COPYING.txt for license details.
  6. */
  7. // @codingStandardsIgnoreFile
  8. namespace Magento\Catalog\Api;
  9. use Magento\TestFramework\Helper\Bootstrap;
  10. use Magento\TestFramework\TestCase\WebapiAbstract;
  11. class ProductCustomOptionRepositoryTest extends WebapiAbstract
  12. {
  13. /**
  14. * @var \Magento\Framework\ObjectManagerInterface
  15. */
  16. protected $objectManager;
  17. const SERVICE_NAME = 'catalogProductCustomOptionRepositoryV1';
  18. /**
  19. * @var \Magento\Catalog\Model\ProductFactory
  20. */
  21. protected $productFactory;
  22. protected function setUp()
  23. {
  24. $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
  25. $this->productFactory = $this->objectManager->get('Magento\Catalog\Model\ProductFactory');
  26. }
  27. /**
  28. * @magentoApiDataFixture Magento/Catalog/_files/product_with_options.php
  29. * @magentoAppIsolation enabled
  30. */
  31. public function testRemove()
  32. {
  33. $sku = 'simple';
  34. /** @var \Magento\Catalog\Model\Product $product */
  35. $product = $this->objectManager->create('Magento\Catalog\Model\Product');
  36. $product->load(1);
  37. $customOptions = $product->getOptions();
  38. $optionId = array_pop($customOptions)->getId();
  39. $serviceInfo = [
  40. 'rest' => [
  41. 'resourcePath' => "/V1/products/$sku/options/$optionId",
  42. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_DELETE,
  43. ],
  44. 'soap' => [
  45. 'service' => self::SERVICE_NAME,
  46. 'serviceVersion' => 'V1',
  47. 'operation' => self::SERVICE_NAME . 'DeleteByIdentifier',
  48. ],
  49. ];
  50. $this->assertTrue($this->_webApiCall($serviceInfo, ['sku' => $sku, 'optionId' => $optionId]));
  51. /** @var \Magento\Catalog\Model\Product $product */
  52. $product = $this->objectManager->create('Magento\Catalog\Model\Product');
  53. $product->load(1);
  54. $this->assertNull($product->getOptionById($optionId));
  55. $this->assertEquals(9, count($product->getOptions()));
  56. }
  57. /**
  58. * @magentoApiDataFixture Magento/Catalog/_files/product_with_options.php
  59. * @magentoAppIsolation enabled
  60. */
  61. public function testGet()
  62. {
  63. $productSku = 'simple';
  64. /** @var \Magento\Catalog\Api\ProductCustomOptionRepositoryInterface $service */
  65. $service = Bootstrap::getObjectManager()
  66. ->get('Magento\Catalog\Api\ProductCustomOptionRepositoryInterface');
  67. $options = $service->getList('simple');
  68. $option = current($options);
  69. $optionId = $option->getOptionId();
  70. $serviceInfo = [
  71. 'rest' => [
  72. 'resourcePath' => '/V1/products/' . $productSku . "/options/" . $optionId,
  73. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
  74. ],
  75. 'soap' => [
  76. 'service' => self::SERVICE_NAME,
  77. 'serviceVersion' => 'V1',
  78. 'operation' => self::SERVICE_NAME . 'Get',
  79. ],
  80. ];
  81. $option = $this->_webApiCall($serviceInfo, ['sku' => $productSku, 'optionId' => $optionId]);
  82. unset($option['product_sku']);
  83. unset($option['option_id']);
  84. $excepted = include '_files/product_options.php';
  85. $this->assertEquals($excepted[0], $option);
  86. }
  87. /**
  88. * @magentoApiDataFixture Magento/Catalog/_files/product_with_options.php
  89. * @magentoAppIsolation enabled
  90. * @SuppressWarnings(PHPMD.UnusedLocalVariable)
  91. */
  92. public function testGetList()
  93. {
  94. $this->_markTestAsRestOnly('Fix inconsistencies in WSDL and Data interfaces');
  95. $productSku = 'simple';
  96. $serviceInfo = [
  97. 'rest' => [
  98. 'resourcePath' => '/V1/products/' . $productSku . "/options",
  99. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
  100. ],
  101. 'soap' => [
  102. 'service' => self::SERVICE_NAME,
  103. 'serviceVersion' => 'V1',
  104. 'operation' => self::SERVICE_NAME . 'GetList',
  105. ],
  106. ];
  107. $options = $this->_webApiCall($serviceInfo, ['sku' => $productSku]);
  108. /** Unset dynamic data */
  109. foreach ($options as $key => $value) {
  110. unset($options[$key]['product_sku']);
  111. unset($options[$key]['option_id']);
  112. if (!empty($options[$key]['values'])) {
  113. foreach ($options[$key]['values'] as $newKey => $valueData) {
  114. unset($options[$key]['values'][$newKey]['option_type_id']);
  115. }
  116. }
  117. }
  118. $excepted = include '_files/product_options.php';
  119. $this->assertEquals(count($excepted), count($options));
  120. //in order to make assertion result readable we need to check each element separately
  121. foreach ($excepted as $index => $value) {
  122. $this->assertEquals($value, $options[$index]);
  123. }
  124. }
  125. /**
  126. * @magentoApiDataFixture Magento/Catalog/_files/product_without_options.php
  127. * @magentoAppIsolation enabled
  128. * @dataProvider optionDataProvider
  129. * @SuppressWarnings(PHPMD.UnusedLocalVariable)
  130. */
  131. public function testSave($optionData)
  132. {
  133. $productSku = 'simple';
  134. $optionDataPost = $optionData;
  135. $optionDataPost['product_sku'] = $productSku;
  136. $serviceInfo = [
  137. 'rest' => [
  138. 'resourcePath' => '/V1/products/options',
  139. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
  140. ],
  141. 'soap' => [
  142. 'service' => self::SERVICE_NAME,
  143. 'serviceVersion' => 'V1',
  144. 'operation' => self::SERVICE_NAME . 'Save',
  145. ],
  146. ];
  147. $result = $this->_webApiCall($serviceInfo, ['option' => $optionDataPost]);
  148. unset($result['product_sku']);
  149. unset($result['option_id']);
  150. if (!empty($result['values'])) {
  151. foreach ($result['values'] as $key => $value) {
  152. unset($result['values'][$key]['option_type_id']);
  153. }
  154. }
  155. $this->assertEquals($optionData, $result);
  156. }
  157. public function optionDataProvider()
  158. {
  159. $fixtureOptions = [];
  160. $fixture = include '_files/product_options.php';
  161. foreach ($fixture as $item) {
  162. $fixtureOptions[$item['type']] = [
  163. 'optionData' => $item,
  164. ];
  165. };
  166. return $fixtureOptions;
  167. }
  168. /**
  169. * @magentoApiDataFixture Magento/Catalog/_files/product_without_options.php
  170. * @magentoAppIsolation enabled
  171. * @dataProvider optionNegativeDataProvider
  172. */
  173. public function testAddNegative($optionData)
  174. {
  175. $productSku = 'simple';
  176. $optionDataPost = $optionData;
  177. $optionDataPost['product_sku'] = $productSku;
  178. $serviceInfo = [
  179. 'rest' => [
  180. 'resourcePath' => "/V1/products/options",
  181. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
  182. ],
  183. 'soap' => [
  184. 'service' => self::SERVICE_NAME,
  185. 'serviceVersion' => 'V1',
  186. 'operation' => self::SERVICE_NAME . 'Save',
  187. ],
  188. ];
  189. if (TESTS_WEB_API_ADAPTER == self::ADAPTER_SOAP) {
  190. $this->setExpectedException('SoapFault', 'Could not save product option');
  191. } else {
  192. $this->setExpectedException('Exception', '', 400);
  193. }
  194. $this->_webApiCall($serviceInfo, ['option' => $optionDataPost]);
  195. }
  196. public function optionNegativeDataProvider()
  197. {
  198. $fixtureOptions = [];
  199. $fixture = include '_files/product_options_negative.php';
  200. foreach ($fixture as $key => $item) {
  201. $fixtureOptions[$key] = [
  202. 'optionData' => $item,
  203. ];
  204. };
  205. return $fixtureOptions;
  206. }
  207. /**
  208. * @magentoApiDataFixture Magento/Catalog/_files/product_with_options.php
  209. * @magentoAppIsolation enabled
  210. */
  211. public function testUpdate()
  212. {
  213. $productSku = 'simple';
  214. /** @var \Magento\Catalog\Model\ProductRepository $optionReadService */
  215. $productRepository = $this->objectManager->create(
  216. 'Magento\Catalog\Model\ProductRepository'
  217. );
  218. $options = $productRepository->get($productSku, true)->getOptions();
  219. $option = array_shift($options);
  220. $optionId = $option->getOptionId();
  221. $optionDataPost = [
  222. 'product_sku' => $productSku,
  223. 'title' => $option->getTitle() . "_updated",
  224. 'type' => $option->getType(),
  225. 'sort_order' => $option->getSortOrder(),
  226. 'is_require' => $option->getIsRequire(),
  227. 'price' => $option->getPrice(),
  228. 'price_type' => $option->getPriceType(),
  229. 'sku' => $option->getSku(),
  230. 'max_characters' => 500,
  231. ];
  232. $serviceInfo = [
  233. 'rest' => [
  234. 'resourcePath' => '/V1/products/options/' . $optionId,
  235. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT,
  236. ],
  237. 'soap' => [
  238. 'service' => self::SERVICE_NAME,
  239. 'serviceVersion' => 'V1',
  240. 'operation' => self::SERVICE_NAME . 'Save',
  241. ],
  242. ];
  243. if (TESTS_WEB_API_ADAPTER == self::ADAPTER_SOAP) {
  244. $optionDataPost['option_id'] = $optionId;
  245. $updatedOption = $this->_webApiCall(
  246. $serviceInfo,
  247. ['id' => $optionId, 'option' => $optionDataPost]
  248. );
  249. } else {
  250. $updatedOption = $this->_webApiCall($serviceInfo, ['option' => $optionDataPost]);
  251. }
  252. unset($updatedOption['values']);
  253. $optionDataPost['option_id'] = $option->getOptionId();
  254. $this->assertEquals($optionDataPost, $updatedOption);
  255. }
  256. /**
  257. * @param string $optionType
  258. *
  259. * @magentoApiDataFixture Magento/Catalog/_files/product_with_options.php
  260. * @magentoAppIsolation enabled
  261. * @dataProvider validOptionDataProvider
  262. * @SuppressWarnings(PHPMD.UnusedLocalVariable)
  263. */
  264. public function testUpdateOptionAddingNewValue($optionType)
  265. {
  266. $productId = 1;
  267. $fixtureOption = null;
  268. $valueData = [
  269. 'price' => 100500,
  270. 'price_type' => 'fixed',
  271. 'sku' => 'new option sku ' . $optionType,
  272. 'title' => 'New Option Title',
  273. 'sort_order' => 100,
  274. ];
  275. $product = $this->productFactory->create();
  276. $product->load($productId);
  277. /**@var $option \Magento\Catalog\Model\Product\Option */
  278. foreach ($product->getOptions() as $option) {
  279. if ($option->getType() == $optionType) {
  280. $fixtureOption = $option;
  281. break;
  282. }
  283. }
  284. $values = [];
  285. foreach ($option->getValues() as $key => $value) {
  286. $values[] =
  287. [
  288. 'price' => $value->getPrice(),
  289. 'price_type' => $value->getPriceType(),
  290. 'sku' => $value->getSku(),
  291. 'title' => $value->getTitle(),
  292. 'sort_order' => $value->getSortOrder(),
  293. ];
  294. }
  295. $values[] = $valueData;
  296. $data = [
  297. 'product_sku' => $option->getProductSku(),
  298. 'title' => $option->getTitle(),
  299. 'type' => $option->getType(),
  300. 'is_require' => $option->getIsRequire(),
  301. 'sort_order' => $option->getSortOrder(),
  302. 'values' => $values,
  303. ];
  304. $serviceInfo = [
  305. 'rest' => [
  306. 'resourcePath' => '/V1/products/options/' . $fixtureOption->getId(),
  307. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT,
  308. ],
  309. 'soap' => [
  310. 'service' => self::SERVICE_NAME,
  311. 'serviceVersion' => 'V1',
  312. 'operation' => self::SERVICE_NAME . 'Save',
  313. ],
  314. ];
  315. if (TESTS_WEB_API_ADAPTER == self::ADAPTER_SOAP) {
  316. $data['option_id'] = $fixtureOption->getId();
  317. $valueObject = $this->_webApiCall(
  318. $serviceInfo,
  319. [ 'option_id' => $fixtureOption->getId(), 'option' => $data]
  320. );
  321. } else {
  322. $valueObject = $this->_webApiCall($serviceInfo, ['option' => $data]);
  323. }
  324. $values = end($valueObject['values']);
  325. $this->assertEquals($valueData['price'], $values['price']);
  326. $this->assertEquals($valueData['price_type'], $values['price_type']);
  327. $this->assertEquals($valueData['sku'], $values['sku']);
  328. $this->assertEquals('New Option Title', $values['title']);
  329. $this->assertEquals(100, $values['sort_order']);
  330. }
  331. public function validOptionDataProvider()
  332. {
  333. return [
  334. 'drop_down' => ['drop_down'],
  335. 'checkbox' => ['checkbox'],
  336. 'radio' => ['radio'],
  337. 'multiple' => ['multiple']
  338. ];
  339. }
  340. }