Skip to content

Commit b42ea86

Browse files
author
Robert He
committed
MAGETWO-32410: Grouped Product Integration API
- fixes from code review
1 parent ff4acfb commit b42ea86

File tree

4 files changed

+226
-29
lines changed

4 files changed

+226
-29
lines changed

app/code/Magento/Catalog/Model/Product.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1374,7 +1374,12 @@ public function getProductLinks()
13741374
->setPosition($item['position']);
13751375
if (isset($item['custom_attributes'])) {
13761376
foreach ($item['custom_attributes'] as $option) {
1377-
$productLink->getExtensionAttributes()->setQty($option['value']);
1377+
if ($option['attribute_code'] == 'qty') {
1378+
$extendedAttributes = $productLink->getExtensionAttributes();
1379+
if ($extendedAttributes !== null) {
1380+
$productLink->getExtensionAttributes()->setQty($option['value']);
1381+
}
1382+
}
13781383
}
13791384
}
13801385
$output[] = $productLink;

app/code/Magento/Catalog/Test/Unit/Model/ProductLink/ManagementTest.php

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ class ManagementTest extends \PHPUnit_Framework_TestCase
3333
*/
3434
protected $linkTypeProviderMock;
3535

36+
/**
37+
* @var \Magento\Framework\ObjectManager
38+
*/
39+
protected $objectManager;
40+
3641
protected function setUp()
3742
{
3843
$this->productRepositoryMock = $this->getMock('\Magento\Catalog\Model\ProductRepository', [], [], '', false);
@@ -105,7 +110,7 @@ public function testGetLinkedItemsByTypeWithWrongType()
105110
->willReturn($linkTypes);
106111

107112
$this->productMock->expects($this->never())->method('getProductLinks')->willReturn($links);
108-
$this->assertEquals($links, $this->model->getLinkedItemsByType($productSku, $linkType));
113+
$this->model->getLinkedItemsByType($productSku, $linkType);
109114
}
110115

111116
public function testSetProductLinks()
@@ -118,8 +123,8 @@ public function testSetProductLinks()
118123
$inputRelatedLink = $this->objectManager->getObject('Magento\Catalog\Model\ProductLink\Link');
119124
$inputRelatedLink->setProductSku($productSku);
120125
$inputRelatedLink->setLinkType($linkType);
121-
$inputRelatedLink->setData("sku", "bad sku");
122-
$inputRelatedLink->setData("type_id", "bad type");
126+
$inputRelatedLink->setData("sku", "Simple Product 1");
127+
$inputRelatedLink->setData("type_id", "related");
123128
$inputRelatedLink->setPosition(0);
124129
$links = [$inputRelatedLink];
125130

@@ -129,6 +134,7 @@ public function testSetProductLinks()
129134
->willReturn($linkTypes);
130135

131136
$this->productMock->expects($this->once())->method('getProductLinks')->willReturn([]);
137+
$this->productMock->expects($this->once())->method('setProductLinks')->with($links);
132138
$this->assertTrue($this->model->setProductLinks($productSku, $linkType, $links));
133139
}
134140

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

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -140,31 +140,9 @@ public function testProductLinks()
140140

141141
$this->saveProduct($productData);
142142

143-
// Create a group product
144-
$productLinkData = ["product_sku" => "group_product_500", "link_type" => "associated",
145-
"linked_product_sku" => "product_simple_500", "linked_product_type" => "simple",
146-
"position" => 0, "extension_attributes" => ["qty" => 1]];
147-
$productWithGroupData = [
148-
ProductInterface::SKU => "group_product_500",
149-
ProductInterface::NAME => "Group Product 500",
150-
ProductInterface::VISIBILITY => 4,
151-
ProductInterface::TYPE_ID => 'grouped',
152-
ProductInterface::PRICE => 300,
153-
ProductInterface::STATUS => 1,
154-
ProductInterface::ATTRIBUTE_SET_ID => 4,
155-
"product_links" => [$productLinkData]
156-
];
157-
158-
$this->saveProduct($productWithGroupData);
159-
$response = $this->getProduct("group_product_500");
160-
$this->assertArrayHasKey('product_links', $response);
161-
$links = $response['product_links'];
162-
$this->assertEquals(1, count($links));
163-
$this->assertEquals($productLinkData, $links[0]);
164-
165143
$productLinkData = ["product_sku" => "product_simple_with_related_500", "link_type" => "related",
166144
"linked_product_sku" => "product_simple_500", "linked_product_type" => "simple",
167-
"position" => 0, "extension_attributes" => ["qty" => null]];
145+
"position" => 0, "extension_attributes" => []];
168146
$productWithRelatedData = [
169147
ProductInterface::SKU => "product_simple_with_related_500",
170148
ProductInterface::NAME => "Product Simple with Related 500",
@@ -188,7 +166,7 @@ public function testProductLinks()
188166
// update link information
189167
$productLinkData = ["product_sku" => "product_simple_with_related_500", "link_type" => "upsell",
190168
"linked_product_sku" => "product_simple_500", "linked_product_type" => "simple",
191-
"position" => 0, "extension_attributes" => ["qty" => null]];
169+
"position" => 0, "extension_attributes" => []];
192170
$productWithUpsellData = [
193171
ProductInterface::SKU => "product_simple_with_related_500",
194172
ProductInterface::NAME => "Product Simple with Related 500",
@@ -228,7 +206,6 @@ public function testProductLinks()
228206

229207
$this->deleteProduct("product_simple_500");
230208
$this->deleteProduct("product_simple_with_related_500");
231-
$this->deleteProduct("group_product_500");
232209
}
233210

234211
protected function getOptionsData()
Lines changed: 209 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,209 @@
1+
<?php
2+
/**
3+
* Copyright © 2015 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\GroupedProduct\Api;
7+
8+
use Magento\Catalog\Api\Data\ProductInterface;
9+
use Magento\TestFramework\TestCase\WebapiAbstract;
10+
11+
class ProductRepositoryInterfaceTest extends WebapiAbstract
12+
{
13+
const SERVICE_NAME = 'catalogProductRepositoryV1';
14+
const SERVICE_VERSION = 'V1';
15+
const RESOURCE_PATH = '/V1/products';
16+
17+
/**
18+
* Get Product
19+
*
20+
* @param $sku
21+
* @return ProductInterface
22+
*/
23+
protected function getProduct($sku)
24+
{
25+
$serviceInfo = [
26+
'rest' => [
27+
'resourcePath' => self::RESOURCE_PATH . '/' . $sku,
28+
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
29+
],
30+
'soap' => [
31+
'service' => self::SERVICE_NAME,
32+
'serviceVersion' => self::SERVICE_VERSION,
33+
'operation' => self::SERVICE_NAME . 'Get',
34+
],
35+
];
36+
37+
$response = $this->_webApiCall($serviceInfo, ['sku' => $sku]);
38+
return $response;
39+
}
40+
41+
/**
42+
* Update Product
43+
*
44+
* @param $product
45+
* @return mixed
46+
*/
47+
protected function updateProduct($product)
48+
{
49+
$sku = $product[ProductInterface::SKU];
50+
if (TESTS_WEB_API_ADAPTER == self::ADAPTER_REST) {
51+
$product[ProductInterface::SKU] = null;
52+
}
53+
54+
$serviceInfo = [
55+
'rest' => [
56+
'resourcePath' => self::RESOURCE_PATH . '/' . $sku,
57+
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT,
58+
],
59+
'soap' => [
60+
'service' => self::SERVICE_NAME,
61+
'serviceVersion' => self::SERVICE_VERSION,
62+
'operation' => self::SERVICE_NAME . 'Save',
63+
],
64+
];
65+
$requestData = ['product' => $product];
66+
$response = $this->_webApiCall($serviceInfo, $requestData);
67+
return $response;
68+
}
69+
70+
/**
71+
* Save Product
72+
*
73+
* @param $product
74+
* @return mixed
75+
*/
76+
protected function saveProduct($product)
77+
{
78+
$serviceInfo = [
79+
'rest' => [
80+
'resourcePath' => self::RESOURCE_PATH,
81+
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
82+
],
83+
'soap' => [
84+
'service' => self::SERVICE_NAME,
85+
'serviceVersion' => self::SERVICE_VERSION,
86+
'operation' => self::SERVICE_NAME . 'Save',
87+
],
88+
];
89+
$requestData = ['product' => $product];
90+
return $this->_webApiCall($serviceInfo, $requestData);
91+
}
92+
93+
/**
94+
* Delete Product
95+
*
96+
* @param string $sku
97+
* @return boolean
98+
*/
99+
protected function deleteProduct($sku)
100+
{
101+
$serviceInfo = [
102+
'rest' => [
103+
'resourcePath' => self::RESOURCE_PATH . '/' . $sku,
104+
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_DELETE,
105+
],
106+
'soap' => [
107+
'service' => self::SERVICE_NAME,
108+
'serviceVersion' => self::SERVICE_VERSION,
109+
'operation' => self::SERVICE_NAME . 'DeleteById',
110+
],
111+
];
112+
113+
return (TESTS_WEB_API_ADAPTER == self::ADAPTER_SOAP) ?
114+
$this->_webApiCall($serviceInfo, ['sku' => $sku]) : $this->_webApiCall($serviceInfo);
115+
}
116+
117+
public function testProductLinks()
118+
{
119+
// Create simple product
120+
$productData = [
121+
ProductInterface::SKU => "product_simple_500",
122+
ProductInterface::NAME => "Product Simple 500",
123+
ProductInterface::VISIBILITY => 4,
124+
ProductInterface::TYPE_ID => 'simple',
125+
ProductInterface::PRICE => 100,
126+
ProductInterface::STATUS => 1,
127+
ProductInterface::TYPE_ID => 'simple',
128+
ProductInterface::ATTRIBUTE_SET_ID => 4,
129+
];
130+
131+
$this->saveProduct($productData);
132+
133+
// Create a group product
134+
$productLinkData = ["product_sku" => "group_product_500", "link_type" => "associated",
135+
"linked_product_sku" => "product_simple_500", "linked_product_type" => "simple",
136+
"position" => 0, "extension_attributes" => ["qty" => 1]];
137+
$productWithGroupData = [
138+
ProductInterface::SKU => "group_product_500",
139+
ProductInterface::NAME => "Group Product 500",
140+
ProductInterface::VISIBILITY => 4,
141+
ProductInterface::TYPE_ID => 'grouped',
142+
ProductInterface::PRICE => 300,
143+
ProductInterface::STATUS => 1,
144+
ProductInterface::ATTRIBUTE_SET_ID => 4,
145+
"product_links" => [$productLinkData]
146+
];
147+
148+
$this->saveProduct($productWithGroupData);
149+
$response = $this->getProduct("group_product_500");
150+
$this->assertArrayHasKey('product_links', $response);
151+
$links = $response['product_links'];
152+
$this->assertEquals(1, count($links));
153+
$this->assertEquals($productLinkData, $links[0]);
154+
155+
// update link information for Group Product
156+
$productLinkData1 = ["product_sku" => "group_product_500", "link_type" => "associated",
157+
"linked_product_sku" => "product_simple_500", "linked_product_type" => "simple",
158+
"position" => 0, "extension_attributes" => ["qty" => 4]];
159+
$productLinkData2 = ["product_sku" => "group_product_500", "link_type" => "upsell",
160+
"linked_product_sku" => "product_simple_500", "linked_product_type" => "simple",
161+
"position" => 0, "extension_attributes" => []];
162+
$productWithGroupData = [
163+
ProductInterface::SKU => "group_product_500",
164+
ProductInterface::NAME => "Group Product 500",
165+
ProductInterface::VISIBILITY => 4,
166+
ProductInterface::TYPE_ID => 'grouped',
167+
ProductInterface::PRICE => 300,
168+
ProductInterface::STATUS => 1,
169+
ProductInterface::ATTRIBUTE_SET_ID => 4,
170+
"product_links" => [$productLinkData1, $productLinkData2]
171+
];
172+
173+
$this->saveProduct($productWithGroupData);
174+
$response = $this->getProduct("group_product_500");
175+
176+
$this->assertArrayHasKey('product_links', $response);
177+
$links = $response['product_links'];
178+
$this->assertEquals(2, count($links));
179+
$this->assertEquals($productLinkData1, $links[1]);
180+
$this->assertEquals($productLinkData2, $links[0]);
181+
182+
// Remove link
183+
$productWithNoLinkData = [
184+
ProductInterface::SKU => "group_product_500",
185+
ProductInterface::NAME => "Group Product 500",
186+
ProductInterface::VISIBILITY => 4,
187+
ProductInterface::TYPE_ID => 'grouped',
188+
ProductInterface::PRICE => 300,
189+
ProductInterface::STATUS => 1,
190+
ProductInterface::ATTRIBUTE_SET_ID => 4,
191+
"product_links" => []
192+
];
193+
194+
$this->saveProduct($productWithNoLinkData);
195+
$response = $this->getProduct("group_product_500");
196+
$this->assertArrayHasKey('product_links', $response);
197+
$links = $response['product_links'];
198+
$this->assertEquals([], $links);
199+
200+
$this->deleteProduct("product_simple_500");
201+
$this->deleteProduct("group_product_500");
202+
}
203+
204+
205+
206+
207+
208+
209+
}

0 commit comments

Comments
 (0)