Skip to content

Commit d8b86de

Browse files
committed
MC-20675: Admin: Add/edit/delete related, up-sells, cross-sells products
1 parent 71c781d commit d8b86de

File tree

2 files changed

+409
-0
lines changed

2 files changed

+409
-0
lines changed
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Catalog\Controller\Adminhtml;
9+
10+
use Magento\Catalog\Api\ProductRepositoryInterface;
11+
use Magento\Catalog\Model\Product;
12+
use Magento\Catalog\Model\ProductRepository;
13+
use Magento\Framework\App\Request\Http as HttpRequest;
14+
use Magento\TestFramework\TestCase\AbstractBackendController;
15+
16+
/**
17+
* Saving product with linked products
18+
*
19+
* @magentoAppArea adminhtml
20+
*/
21+
class LinksTest extends AbstractBackendController
22+
{
23+
/** @var array */
24+
private $linkTypes = [
25+
'upsell',
26+
'crosssell',
27+
'related',
28+
];
29+
30+
/** @var ProductRepository $productRepository */
31+
private $productRepository;
32+
33+
/**
34+
* @inheritdoc
35+
*/
36+
protected function setUp()
37+
{
38+
parent::setUp();
39+
$this->productRepository = $this->_objectManager->create(ProductRepositoryInterface::class);
40+
}
41+
42+
/**
43+
* Test add simple related, up-sells, cross-sells product
44+
*
45+
* @dataProvider addRelatedUpSellCrossSellProductsProvider
46+
* @magentoDataFixture Magento/Catalog/_files/multiple_products.php
47+
* @magentoDbIsolation enabled
48+
* @param array $postData
49+
* @return void
50+
*/
51+
public function testAddRelatedUpSellCrossSellProducts(array $postData)
52+
{
53+
$this->getRequest()->setMethod(HttpRequest::METHOD_POST);
54+
$this->getRequest()->setPostValue($postData);
55+
$this->dispatch('backend/catalog/product/save');
56+
57+
/** @var Product $product */
58+
$product = $this->productRepository->get('simple');
59+
60+
$expectedLinks = $this->getExpectedLinks($postData['links']);
61+
$actualLinks = $this->getActualLinks($product);
62+
$this->assertEquals(
63+
$expectedLinks,
64+
$actualLinks,
65+
"Expected linked products do not match actual linked products!"
66+
);
67+
}
68+
69+
/**
70+
* Provide test data for testAddRelatedUpSellCrossSellProducts().
71+
*
72+
* @return array
73+
*/
74+
public function addRelatedUpSellCrossSellProductsProvider(): array
75+
{
76+
return [
77+
[
78+
'post_data' => [
79+
'product' => [
80+
'attribute_set_id' => '4',
81+
'status' => '1',
82+
'name' => 'Simple Product',
83+
'sku' => 'simple',
84+
'url_key' => 'simple-product',
85+
],
86+
'links' => [
87+
'upsell' => [
88+
['id' => '10'],
89+
],
90+
'crosssell' => [
91+
['id' => '11'],
92+
],
93+
'related' => [
94+
['id' => '12'],
95+
],
96+
]
97+
]
98+
]
99+
];
100+
}
101+
102+
/**
103+
* Set an array of expected related, up-sells, cross-sells product identifiers
104+
*
105+
* @param array $links
106+
* @return array
107+
*/
108+
private function getExpectedLinks(array $links): array
109+
{
110+
$expectedLinks = [];
111+
foreach ($this->linkTypes as $linkType) {
112+
$expectedLinks[$linkType] = [];
113+
foreach ($links[$linkType] as $productData) {
114+
$expectedLinks[$linkType][$productData['id']] = $productData;
115+
}
116+
}
117+
118+
return $expectedLinks;
119+
}
120+
121+
/**
122+
* Get an array of received related, up-sells, cross-sells products
123+
*
124+
* @param Product $product
125+
* @return array
126+
*/
127+
private function getActualLinks(Product $product): array
128+
{
129+
$actualLinks = [];
130+
foreach ($this->linkTypes as $linkType) {
131+
$products = [];
132+
$actualLinks[$linkType] = [];
133+
switch ($linkType) {
134+
case 'upsell':
135+
$products = $product->getUpSellProducts();
136+
break;
137+
case 'crosssell':
138+
$products = $product->getCrossSellProducts();
139+
break;
140+
case 'related':
141+
$products = $product->getRelatedProducts();
142+
break;
143+
}
144+
/** @var Product $product */
145+
foreach ($products as $productItem) {
146+
$actualLinks[$linkType][$productItem->getId()] = [
147+
'id' => $productItem->getId(),
148+
];
149+
}
150+
}
151+
152+
return $actualLinks;
153+
}
154+
}

0 commit comments

Comments
 (0)