123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278 |
- <?php
- /**
- *
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\ConfigurableProduct\Api;
- use Magento\Eav\Model\AttributeRepository;
- class LinkManagementTest extends \Magento\TestFramework\TestCase\WebapiAbstract
- {
- const SERVICE_NAME = 'configurableProductLinkManagementV1';
- const SERVICE_VERSION = 'V1';
- const RESOURCE_PATH = '/V1/configurable-products';
- /**
- * @var \Magento\Framework\ObjectManagerInterface
- */
- protected $objectManager;
- /**
- * @var AttributeRepository
- */
- protected $attributeRepository;
- /**
- * Execute per test initialization
- */
- public function setUp()
- {
- $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
- $this->attributeRepository = $this->objectManager->get(\Magento\Eav\Model\AttributeRepository::class);
- }
- /**
- * @magentoApiDataFixture Magento/ConfigurableProduct/_files/product_configurable.php
- */
- public function testGetChildren()
- {
- $productSku = 'configurable';
- /** @var array $result */
- $result = $this->getChildren($productSku);
- $this->assertCount(2, $result);
- foreach ($result as $product) {
- $this->assertArrayHasKey('custom_attributes', $product);
- $this->assertArrayHasKey('price', $product);
- $this->assertArrayHasKey('updated_at', $product);
- $this->assertArrayHasKey('name', $product);
- $this->assertContains('Configurable Option', $product['name']);
- $this->assertArrayHasKey('sku', $product);
- $this->assertContains('simple_', $product['sku']);
- $this->assertArrayHasKey('status', $product);
- $this->assertEquals('1', $product['status']);
- }
- }
- /**
- * @magentoApiDataFixture Magento/ConfigurableProduct/_files/product_configurable.php
- * @magentoApiDataFixture Magento/ConfigurableProduct/_files/product_simple_77.php
- * @magentoApiDataFixture Magento/ConfigurableProduct/_files/delete_association.php
- */
- public function testAddChild()
- {
- $productSku = 'configurable';
- $childSku = 'simple_77';
- $res = $this->addChild($productSku, $childSku);
- $this->assertTrue($res);
- }
- /**
- * Test the full flow of creating a configurable product and adding a child via REST
- *
- * @magentoApiDataFixture Magento/ConfigurableProduct/_files/configurable_attribute.php
- */
- public function testAddChildFullRestCreation()
- {
- $productSku = 'configurable-product-sku';
- $childSku = 'simple-product-sku';
- $this->createConfigurableProduct($productSku);
- $attribute = $this->attributeRepository->get('catalog_product', 'test_configurable');
- $attributeValue = $attribute->getOptions()[1]->getValue();
- $this->addOptionToConfigurableProduct($productSku, $attribute->getAttributeId(), $attributeValue);
- $this->createSimpleProduct($childSku, $attributeValue);
- $res = $this->addChild($productSku, $childSku);
- $this->assertTrue($res);
- // confirm that the simple product was added
- $children = $this->getChildren($productSku);
- $added = false;
- foreach ($children as $child) {
- if ($child['sku'] == $childSku) {
- $added = true;
- break;
- }
- }
- $this->assertTrue($added);
- // clean up products
- $serviceInfo = [
- 'rest' => [
- 'resourcePath' => '/V1/products/' . $productSku,
- 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_DELETE
- ],
- 'soap' => [
- 'service' => 'catalogProductRepositoryV1',
- 'serviceVersion' => self::SERVICE_VERSION,
- 'operation' => 'catalogProductRepositoryV1DeleteById',
- ],
- ];
- $this->_webApiCall($serviceInfo, ['sku' => $productSku]);
- $serviceInfo = [
- 'rest' => [
- 'resourcePath' => '/V1/products/' . $childSku,
- 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_DELETE
- ],
- 'soap' => [
- 'service' => 'catalogProductRepositoryV1',
- 'serviceVersion' => self::SERVICE_VERSION,
- 'operation' => 'catalogProductRepositoryV1DeleteById',
- ],
- ];
- $this->_webApiCall($serviceInfo, ['sku' => $childSku]);
- }
- private function addChild($productSku, $childSku)
- {
- $serviceInfo = [
- 'rest' => [
- 'resourcePath' => self::RESOURCE_PATH . '/' . $productSku . '/child',
- 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST
- ],
- 'soap' => [
- 'service' => self::SERVICE_NAME,
- 'serviceVersion' => self::SERVICE_VERSION,
- 'operation' => self::SERVICE_NAME . 'AddChild'
- ]
- ];
- return $this->_webApiCall($serviceInfo, ['sku' => $productSku, 'childSku' => $childSku]);
- }
- protected function createConfigurableProduct($productSku)
- {
- $requestData = [
- 'product' => [
- 'sku' => $productSku,
- 'name' => 'configurable-product-' . $productSku,
- 'type_id' => 'configurable',
- 'price' => 50,
- 'attribute_set_id' => 4
- ]
- ];
- $serviceInfo = [
- 'rest' => [
- 'resourcePath' => '/V1/products',
- 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST
- ],
- 'soap' => [
- 'service' => 'catalogProductRepositoryV1',
- 'serviceVersion' => self::SERVICE_VERSION,
- 'operation' => 'catalogProductRepositoryV1Save',
- ],
- ];
- return $this->_webApiCall($serviceInfo, $requestData);
- }
- protected function addOptionToConfigurableProduct($productSku, $attributeId, $attributeValue)
- {
- $requestData = [
- 'sku' => $productSku,
- 'option' => [
- 'attribute_id' => $attributeId,
- 'label' => 'test_configurable',
- 'position' => 0,
- 'is_use_default' => true,
- 'values' => [
- ['value_index' => $attributeValue],
- ]
- ]
- ];
- $serviceInfo = [
- 'rest' => [
- 'resourcePath' => '/V1/configurable-products/'. $productSku .'/options',
- 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
- ],
- 'soap' => [
- 'service' => 'configurableProductOptionRepositoryV1',
- 'serviceVersion' => self::SERVICE_VERSION,
- 'operation' => 'configurableProductOptionRepositoryV1Save',
- ],
- ];
- return $this->_webApiCall($serviceInfo, $requestData);
- }
- protected function createSimpleProduct($sku, $attributeValue)
- {
- $requestData = [
- 'product' => [
- 'sku' => $sku,
- 'name' => 'simple-product-' . $sku,
- 'type_id' => 'simple',
- 'attribute_set_id' => 4,
- 'price' => 3.62,
- 'status' => 1,
- 'visibility' => 4,
- 'custom_attributes' => [
- ['attribute_code' => 'test_configurable', 'value' => $attributeValue],
- ]
- ]
- ];
- $serviceInfo = [
- 'rest' => [
- 'resourcePath' => '/V1/products',
- 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
- ],
- 'soap' => [
- 'service' => 'catalogProductRepositoryV1',
- 'serviceVersion' => self::SERVICE_VERSION,
- 'operation' => 'catalogProductRepositoryV1Save',
- ],
- ];
- return $this->_webApiCall($serviceInfo, $requestData);
- }
- /**
- * @magentoApiDataFixture Magento/ConfigurableProduct/_files/product_configurable.php
- */
- public function testRemoveChild()
- {
- $productSku = 'configurable';
- $childSku = 'simple_10';
- $this->assertTrue($this->removeChild($productSku, $childSku));
- }
- protected function removeChild($productSku, $childSku)
- {
- $resourcePath = self::RESOURCE_PATH . '/%s/children/%s';
- $serviceInfo = [
- 'rest' => [
- 'resourcePath' => sprintf($resourcePath, $productSku, $childSku),
- 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_DELETE
- ],
- 'soap' => [
- 'service' => self::SERVICE_NAME,
- 'serviceVersion' => self::SERVICE_VERSION,
- 'operation' => self::SERVICE_NAME . 'RemoveChild'
- ]
- ];
- $requestData = ['sku' => $productSku, 'childSku' => $childSku];
- return $this->_webApiCall($serviceInfo, $requestData);
- }
- /**
- * @param string $productSku
- * @return string[]
- */
- protected function getChildren($productSku)
- {
- $serviceInfo = [
- 'rest' => [
- 'resourcePath' => self::RESOURCE_PATH . '/' . $productSku . '/children',
- 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET
- ],
- 'soap' => [
- 'service' => self::SERVICE_NAME,
- 'serviceVersion' => self::SERVICE_VERSION,
- 'operation' => self::SERVICE_NAME . 'GetChildren'
- ]
- ];
- return $this->_webApiCall($serviceInfo, ['sku' => $productSku]);
- }
- }
|