Skip to content

Commit 3cb72cb

Browse files
committed
MC-39552: Create product, add cross-sell product to it and save, after, add one more cross-sell product
1 parent ad0ba79 commit 3cb72cb

File tree

3 files changed

+180
-99
lines changed

3 files changed

+180
-99
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
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\Ui\DataProvider\Product\Related;
9+
10+
use Magento\Catalog\Api\ProductRepositoryInterface;
11+
use Magento\Framework\App\RequestInterface;
12+
use Magento\Framework\ObjectManagerInterface;
13+
use Magento\Framework\View\Element\UiComponentFactory;
14+
use Magento\Framework\View\Element\UiComponentInterface;
15+
use Magento\Store\Model\StoreManagerInterface;
16+
use PHPUnit\Framework\TestCase;
17+
use Magento\TestFramework\Helper\Bootstrap;
18+
19+
/**
20+
* Base logic for relations data providers checks
21+
*/
22+
abstract class AbstractRelationsDataProviderTest extends TestCase
23+
{
24+
/** @var ObjectManagerInterface */
25+
private $objectManager;
26+
27+
/** @var UiComponentFactory */
28+
private $componentFactory;
29+
30+
/** @var RequestInterface */
31+
private $request;
32+
33+
/** @var ProductRepositoryInterface */
34+
private $productRepository;
35+
36+
/** @var StoreManagerInterface */
37+
private $storeManager;
38+
39+
/**
40+
* @inheritdoc
41+
*/
42+
protected function setUp(): void
43+
{
44+
parent::setUp();
45+
46+
$this->objectManager = Bootstrap::getObjectManager();
47+
$this->request = $this->objectManager->get(RequestInterface::class);
48+
$this->componentFactory = $this->objectManager->get(UiComponentFactory::class);
49+
$this->productRepository = $this->objectManager->get(ProductRepositoryInterface::class);
50+
$this->storeManager = $this->objectManager->get(StoreManagerInterface::class);
51+
}
52+
53+
/**
54+
* Assert grid result data
55+
*
56+
* @param $expectedCount
57+
* @param array $expectedData
58+
* @param array $actualResult
59+
* @return void
60+
*/
61+
protected function assertResult($expectedCount, array $expectedData, array $actualResult): void
62+
{
63+
$this->assertCount($expectedCount, $actualResult);
64+
$item = reset($actualResult);
65+
foreach ($expectedData as $key => $data) {
66+
$this->assertEquals($item[$key], $data);
67+
}
68+
}
69+
70+
/**
71+
* Get component provided data
72+
*
73+
* @param string $namespace
74+
* @return array
75+
*/
76+
protected function getComponentProvidedData(string $namespace): array
77+
{
78+
$component = $this->componentFactory->create($namespace);
79+
$this->prepareChildComponents($component);
80+
81+
return $component->getContext()->getDataProvider()->getData();
82+
}
83+
84+
/**
85+
* Prepare request
86+
*
87+
* @param string $productSku
88+
* @param string $relatedProductSku
89+
* @param string $storeCode
90+
* @return void
91+
*/
92+
protected function prepareRequest(string $productSku, string $relatedProductSku, string $storeCode): void
93+
{
94+
$storeId = (int)$this->storeManager->getStore($storeCode)->getId();
95+
$productId = (int)$this->productRepository->get($productSku)->getId();
96+
$relatedProductId = (int)$this->productRepository->get($relatedProductSku)->getId();
97+
$params = [
98+
'current_product_id' => $productId,
99+
'current_store_id' => $storeId,
100+
'filters_modifier' => [
101+
'entity_id' => [
102+
'condition_type' => 'nin',
103+
'value' => [$relatedProductId],
104+
],
105+
],
106+
];
107+
108+
$this->request->setParams($params);
109+
}
110+
111+
/**
112+
* Call prepare method in the child components
113+
*
114+
* @param UiComponentInterface $component
115+
* @return void
116+
*/
117+
private function prepareChildComponents(UiComponentInterface $component): void
118+
{
119+
foreach ($component->getChildComponents() as $child) {
120+
$this->prepareChildComponents($child);
121+
}
122+
123+
$component->prepare();
124+
}
125+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
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\Ui\DataProvider\Product\Related;
9+
10+
/**
11+
* Checks cross-sell products data provider
12+
*
13+
* @see \Magento\Catalog\Ui\DataProvider\Product\Related\CrossSellDataProvider
14+
*
15+
* @magentoAppArea adminhtml
16+
* @magentoDbIsolation disabled
17+
*/
18+
class CrossSellDataProviderTest extends AbstractRelationsDataProviderTest
19+
{
20+
/**
21+
* @dataProvider productDataProvider
22+
*
23+
* @magentoDataFixture Magento/Catalog/_files/products_crosssell.php
24+
* @magentoDataFixture Magento/Catalog/_files/product_with_price_on_second_website.php
25+
*
26+
* @param string $storeCode
27+
* @param float $price
28+
* @return void
29+
*/
30+
public function testGetData(string $storeCode, float $price): void
31+
{
32+
$this->prepareRequest('simple_with_cross', 'simple', $storeCode);
33+
$result = $this->getComponentProvidedData('crosssell_product_listing')['items'];
34+
$this->assertResult(1, ['sku' => 'second-website-price-product', 'price' => $price], $result);
35+
}
36+
37+
/**
38+
* @return array
39+
*/
40+
public function productDataProvider(): array
41+
{
42+
return [
43+
'without_store_code' => [
44+
'store_code' => 'default',
45+
'product_price' => 20,
46+
],
47+
'with_store_code' => [
48+
'store_code' => 'fixture_second_store',
49+
'product_price' => 10,
50+
],
51+
];
52+
}
53+
}

dev/tests/integration/testsuite/Magento/Catalog/Ui/DataProvider/Product/Related/UpSellDataProviderTest.php

Lines changed: 2 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,6 @@
77

88
namespace Magento\Catalog\Ui\DataProvider\Product\Related;
99

10-
use Magento\Catalog\Api\ProductRepositoryInterface;
11-
use Magento\Framework\App\RequestInterface;
12-
use Magento\Framework\ObjectManagerInterface;
13-
use Magento\Framework\View\Element\UiComponentFactory;
14-
use Magento\Framework\View\Element\UiComponentInterface;
15-
use Magento\Store\Model\StoreManagerInterface;
16-
use PHPUnit\Framework\TestCase;
17-
use Magento\TestFramework\Helper\Bootstrap;
18-
1910
/**
2011
* Checks up-sell products data provider
2112
*
@@ -24,37 +15,8 @@
2415
* @magentoAppArea adminhtml
2516
* @magentoDbIsolation disabled
2617
*/
27-
class UpSellDataProviderTest extends TestCase
18+
class UpSellDataProviderTest extends AbstractRelationsDataProviderTest
2819
{
29-
/** @var ObjectManagerInterface */
30-
private $objectManager;
31-
32-
/** @var UiComponentFactory */
33-
private $componentFactory;
34-
35-
/** @var RequestInterface */
36-
private $request;
37-
38-
/** @var ProductRepositoryInterface */
39-
private $productRepository;
40-
41-
/** @var StoreManagerInterface */
42-
private $storeManager;
43-
44-
/**
45-
* @inheritdoc
46-
*/
47-
protected function setUp(): void
48-
{
49-
parent::setUp();
50-
51-
$this->objectManager = Bootstrap::getObjectManager();
52-
$this->request = $this->objectManager->get(RequestInterface::class);
53-
$this->componentFactory = $this->objectManager->get(UiComponentFactory::class);
54-
$this->productRepository = $this->objectManager->get(ProductRepositoryInterface::class);
55-
$this->storeManager = $this->objectManager->get(StoreManagerInterface::class);
56-
}
57-
5820
/**
5921
* @dataProvider productDataProvider
6022
*
@@ -69,10 +31,7 @@ public function testGetData(string $storeCode, float $price): void
6931
{
7032
$this->prepareRequest('simple_with_upsell', 'simple', $storeCode);
7133
$result = $this->getComponentProvidedData('upsell_product_listing')['items'];
72-
$this->assertCount(1, $result);
73-
$item = reset($result);
74-
$this->assertEquals($item['sku'], 'second-website-price-product');
75-
$this->assertEquals($price, (float)$item['price']);
34+
$this->assertResult(1, ['sku' => 'second-website-price-product', 'price' => $price], $result);
7635
}
7736

7837
/**
@@ -91,60 +50,4 @@ public function productDataProvider(): array
9150
],
9251
];
9352
}
94-
95-
/**
96-
* Get component provided data
97-
*
98-
* @param string $namespace
99-
* @return array
100-
*/
101-
private function getComponentProvidedData(string $namespace): array
102-
{
103-
$component = $this->componentFactory->create($namespace);
104-
$this->prepareChildComponents($component);
105-
106-
return $component->getContext()->getDataProvider()->getData();
107-
}
108-
109-
/**
110-
* Call prepare method in the child components
111-
*
112-
* @param UiComponentInterface $component
113-
* @return void
114-
*/
115-
private function prepareChildComponents(UiComponentInterface $component): void
116-
{
117-
foreach ($component->getChildComponents() as $child) {
118-
$this->prepareChildComponents($child);
119-
}
120-
121-
$component->prepare();
122-
}
123-
124-
/**
125-
* Prepare request
126-
*
127-
* @param string $productSku
128-
* @param string $relatedProductSku
129-
* @param string $storeCode
130-
* @return void
131-
*/
132-
private function prepareRequest(string $productSku, string $relatedProductSku, string $storeCode): void
133-
{
134-
$storeId = (int)$this->storeManager->getStore($storeCode)->getId();
135-
$productId = (int)$this->productRepository->get($productSku)->getId();
136-
$relatedProductId = (int)$this->productRepository->get($relatedProductSku)->getId();
137-
$params = [
138-
'current_product_id' => $productId,
139-
'current_store_id' => $storeId,
140-
'filters_modifier' => [
141-
'entity_id' => [
142-
'condition_type' => 'nin',
143-
'value' => [$relatedProductId],
144-
],
145-
],
146-
];
147-
148-
$this->request->setParams($params);
149-
}
15053
}

0 commit comments

Comments
 (0)