Skip to content

Commit b929b98

Browse files
committed
Merge branch '2.4-develop' of https://github.com/magento-commerce/magento2ce into PR-L3-2023-01-31
2 parents a2a1bdb + 2fd8581 commit b929b98

File tree

44 files changed

+1710
-184
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+1710
-184
lines changed

app/code/Magento/Bundle/Model/ResourceModel/Selection.php

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
*/
66
namespace Magento\Bundle\Model\ResourceModel;
77

8-
use Magento\Framework\App\ObjectManager;
98
use Magento\Catalog\Api\Data\ProductInterface;
10-
use Magento\Framework\EntityManager\MetadataPool;
9+
use Magento\Framework\App\ObjectManager;
1110
use Magento\Framework\EntityManager\EntityManager;
11+
use Magento\Framework\EntityManager\MetadataPool;
1212
use Magento\Framework\Model\ResourceModel\Db\Context;
1313

1414
/**
@@ -141,7 +141,7 @@ public function getParentIdsByChild($childId)
141141
''
142142
)->join(
143143
['e' => $this->metadataPool->getMetadata(ProductInterface::class)->getEntityTable()],
144-
'e.' . $metadata->getLinkField() . ' = ' . $this->getMainTable() . '.parent_product_id',
144+
'e.' . $metadata->getLinkField() . ' = ' . $this->getMainTable() . '.parent_product_id',
145145
['e.entity_id as parent_product_id']
146146
)->where(
147147
$this->getMainTable() . '.product_id IN(?)',
@@ -174,10 +174,11 @@ public function saveSelectionPrice($item)
174174
$values = [
175175
'selection_id' => $item->getSelectionId(),
176176
'website_id' => $item->getWebsiteId(),
177-
'selection_price_type' => $item->getSelectionPriceType(),
178-
'selection_price_value' => $item->getSelectionPriceValue(),
177+
'selection_price_type' => $item->getSelectionPriceType() ?? 0,
178+
'selection_price_value' => $item->getSelectionPriceValue() ?? 0,
179179
'parent_product_id' => $item->getParentProductId(),
180180
];
181+
181182
$connection->insertOnDuplicate(
182183
$this->getTable('catalog_product_bundle_selection_price'),
183184
$values,
@@ -187,7 +188,8 @@ public function saveSelectionPrice($item)
187188
}
188189

189190
/**
190-
* {@inheritdoc}
191+
* @inheritdoc
192+
*
191193
* @since 100.2.0
192194
*/
193195
public function save(\Magento\Framework\Model\AbstractModel $object)
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
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\Bundle\Test\Unit\Model\ResourceModel;
9+
10+
use Codeception\PHPUnit\TestCase;
11+
use Magento\Bundle\Model\ResourceModel\Selection as ResourceSelection;
12+
use Magento\Bundle\Model\Selection;
13+
use Magento\Framework\App\ResourceConnection;
14+
use Magento\Framework\DB\Adapter\AdapterInterface;
15+
use Magento\Framework\EntityManager\MetadataPool;
16+
use Magento\Framework\Model\ResourceModel\Db\Context;
17+
18+
class SelectionTest extends TestCase
19+
{
20+
/**
21+
* @var Context|Context&\PHPUnit\Framework\MockObject\MockObject|\PHPUnit\Framework\MockObject\MockObject
22+
*/
23+
private Context $context;
24+
25+
/**
26+
* @var MetadataPool|MetadataPool&\PHPUnit\Framework\MockObject\MockObject|\PHPUnit\Framework\MockObject\MockObject
27+
*/
28+
private MetadataPool $metadataPool;
29+
30+
/**
31+
* @inheritdoc
32+
*/
33+
protected function setUp(): void
34+
{
35+
parent::setUp();
36+
37+
$this->context = $this->createMock(Context::class);
38+
$this->metadataPool = $this->createMock(MetadataPool::class);
39+
}
40+
41+
public function testSaveSelectionPrice()
42+
{
43+
$item = $this->getMockBuilder(Selection::class)
44+
->disableOriginalConstructor()
45+
->addMethods([
46+
'getSelectionId',
47+
'getWebsiteId',
48+
'getSelectionPriceType',
49+
'getSelectionPriceValue',
50+
'getParentProductId',
51+
'getDefaultPriceScope'])
52+
->getMock();
53+
$values = [
54+
'selection_id' => 1,
55+
'website_id' => 1,
56+
'selection_price_type' => null,
57+
'selection_price_value' => null,
58+
'parent_product_id' => 1,
59+
];
60+
$item->expects($this->once())->method('getDefaultPriceScope')->willReturn(false);
61+
$item->expects($this->once())->method('getSelectionId')->willReturn($values['selection_id']);
62+
$item->expects($this->once())->method('getWebsiteId')->willReturn($values['website_id']);
63+
$item->expects($this->once())->method('getSelectionPriceType')->willReturn($values['selection_price_type']);
64+
$item->expects($this->once())->method('getSelectionPriceValue')->willReturn($values['selection_price_value']);
65+
$item->expects($this->once())->method('getParentProductId')->willReturn($values['parent_product_id']);
66+
67+
$connection = $this->createMock(AdapterInterface::class);
68+
$connection->expects($this->once())
69+
->method('insertOnDuplicate')
70+
->with(
71+
'catalog_product_bundle_selection_price',
72+
$this->callback(function ($insertValues) {
73+
return $insertValues['selection_price_type'] === 0 && $insertValues['selection_price_value'] === 0;
74+
}),
75+
['selection_price_type', 'selection_price_value']
76+
);
77+
78+
$parentResources = $this->createMock(ResourceConnection::class);
79+
$parentResources->expects($this->once())->method('getConnection')->willReturn($connection);
80+
$parentResources->expects($this->once())->method('getTableName')
81+
->with('catalog_product_bundle_selection_price', 'test_connection_name')
82+
->willReturn('catalog_product_bundle_selection_price');
83+
$this->context->expects($this->once())->method('getResources')->willReturn($parentResources);
84+
85+
$selection = new ResourceSelection($this->context, $this->metadataPool, 'test_connection_name');
86+
$selection->saveSelectionPrice($item);
87+
}
88+
}
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
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\CatalogUrlRewrite\Test\Fixture;
9+
10+
use Magento\Catalog\Api\CategoryRepositoryInterface;
11+
use Magento\CatalogUrlRewrite\Model\CategoryUrlPathGenerator;
12+
use Magento\Framework\DataObject;
13+
use Magento\TestFramework\Fixture\Data\ProcessorInterface;
14+
use Magento\UrlRewrite\Model\ResourceModel\UrlRewrite as UrlRewriteResourceModel;
15+
use Magento\UrlRewrite\Model\UrlFinderInterface;
16+
use Magento\UrlRewrite\Model\UrlRewriteFactory;
17+
use Magento\UrlRewrite\Service\V1\Data\UrlRewrite as UrlRewriteDataModel;
18+
use Magento\UrlRewrite\Test\Fixture\UrlRewrite;
19+
20+
class CategoryUrlRewrite extends UrlRewrite
21+
{
22+
private const DEFAULT_DATA = [
23+
UrlRewriteDataModel::ENTITY_TYPE => 'category',
24+
UrlRewriteDataModel::REDIRECT_TYPE => 0,
25+
UrlRewriteDataModel::STORE_ID => 1
26+
];
27+
28+
/**
29+
* @var CategoryRepositoryInterface
30+
*/
31+
private CategoryRepositoryInterface $categoryRepository;
32+
33+
/**
34+
* @var CategoryUrlPathGenerator
35+
*/
36+
private CategoryUrlPathGenerator $categoryUrlPathGenerator;
37+
38+
/**
39+
* @var UrlFinderInterface
40+
*/
41+
private UrlFinderInterface $urlFinder;
42+
43+
/**
44+
* @inheritDoc
45+
*/
46+
public function __construct(
47+
UrlRewriteFactory $urlRewriteFactory,
48+
UrlRewriteResourceModel $urlRewriteResourceModel,
49+
ProcessorInterface $dataProcessor,
50+
CategoryRepositoryInterface $categoryRepository,
51+
CategoryUrlPathGenerator $categoryUrlPathGenerator,
52+
UrlFinderInterface $urlFinder
53+
) {
54+
parent::__construct($urlRewriteFactory, $urlRewriteResourceModel, $dataProcessor);
55+
$this->categoryRepository = $categoryRepository;
56+
$this->categoryUrlPathGenerator = $categoryUrlPathGenerator;
57+
$this->urlFinder = $urlFinder;
58+
}
59+
60+
/**
61+
* @inheritDoc
62+
*/
63+
public function apply(array $data = []): ?DataObject
64+
{
65+
return parent::apply($this->prepareData($data));
66+
}
67+
68+
/**
69+
* Prepare default data
70+
*
71+
* @param array $data
72+
* @return array
73+
* @throws \Magento\Framework\Exception\NoSuchEntityException
74+
*/
75+
private function prepareData(array $data): array
76+
{
77+
$data = array_merge(self::DEFAULT_DATA, $data);
78+
$category = $this->categoryRepository->get(
79+
$data[UrlRewriteDataModel::ENTITY_ID],
80+
$data[UrlRewriteDataModel::STORE_ID]
81+
);
82+
if (!isset($data[UrlRewriteDataModel::TARGET_PATH])) {
83+
$data[UrlRewriteDataModel::TARGET_PATH] = $this->categoryUrlPathGenerator->getCanonicalUrlPath($category);
84+
if ($data[UrlRewriteDataModel::REDIRECT_TYPE]) {
85+
$rewrite = $this->urlFinder->findOneByData(
86+
[
87+
UrlRewriteDataModel::ENTITY_ID => $data[UrlRewriteDataModel::ENTITY_ID],
88+
UrlRewriteDataModel::TARGET_PATH => $data[UrlRewriteDataModel::TARGET_PATH],
89+
UrlRewriteDataModel::ENTITY_TYPE => $data[UrlRewriteDataModel::ENTITY_TYPE],
90+
UrlRewriteDataModel::STORE_ID => $data[UrlRewriteDataModel::STORE_ID],
91+
]
92+
);
93+
if ($rewrite) {
94+
$data[UrlRewriteDataModel::TARGET_PATH] = $rewrite->getRequestPath();
95+
} else {
96+
$data[UrlRewriteDataModel::TARGET_PATH] = $this->categoryUrlPathGenerator->getUrlPath($category);
97+
}
98+
}
99+
}
100+
return $data;
101+
}
102+
}
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
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\CatalogUrlRewrite\Test\Fixture;
9+
10+
use Magento\Catalog\Api\ProductRepositoryInterface;
11+
use Magento\CatalogUrlRewrite\Model\ProductUrlPathGenerator;
12+
use Magento\Framework\DataObject;
13+
use Magento\TestFramework\Fixture\Data\ProcessorInterface;
14+
use Magento\UrlRewrite\Model\ResourceModel\UrlRewrite as UrlRewriteResourceModel;
15+
use Magento\UrlRewrite\Model\UrlFinderInterface;
16+
use Magento\UrlRewrite\Model\UrlRewriteFactory;
17+
use Magento\UrlRewrite\Service\V1\Data\UrlRewrite as UrlRewriteDataModel;
18+
use Magento\UrlRewrite\Test\Fixture\UrlRewrite;
19+
20+
class ProductUrlRewrite extends UrlRewrite
21+
{
22+
private const DEFAULT_DATA = [
23+
UrlRewriteDataModel::ENTITY_TYPE => 'category',
24+
UrlRewriteDataModel::REDIRECT_TYPE => 0,
25+
UrlRewriteDataModel::STORE_ID => 1
26+
];
27+
28+
/**
29+
* @var ProductRepositoryInterface
30+
*/
31+
private ProductRepositoryInterface $productRepository;
32+
33+
/**
34+
* @var ProductUrlPathGenerator
35+
*/
36+
private ProductUrlPathGenerator $productUrlPathGenerator;
37+
38+
/**
39+
* @var UrlFinderInterface
40+
*/
41+
private UrlFinderInterface $urlFinder;
42+
43+
/**
44+
* @inheritDoc
45+
*/
46+
public function __construct(
47+
UrlRewriteFactory $urlRewriteFactory,
48+
UrlRewriteResourceModel $urlRewriteResourceModel,
49+
ProcessorInterface $dataProcessor,
50+
ProductRepositoryInterface $productRepository,
51+
ProductUrlPathGenerator $productUrlPathGenerator,
52+
UrlFinderInterface $urlFinder
53+
) {
54+
parent::__construct($urlRewriteFactory, $urlRewriteResourceModel, $dataProcessor);
55+
$this->productRepository = $productRepository;
56+
$this->productUrlPathGenerator = $productUrlPathGenerator;
57+
$this->urlFinder = $urlFinder;
58+
}
59+
60+
/**
61+
* @inheritDoc
62+
*/
63+
public function apply(array $data = []): ?DataObject
64+
{
65+
return parent::apply($this->prepareData($data));
66+
}
67+
68+
/**
69+
* Prepare default data
70+
*
71+
* @param array $data
72+
* @return array
73+
* @throws \Magento\Framework\Exception\NoSuchEntityException
74+
*/
75+
private function prepareData(array $data): array
76+
{
77+
$data = array_merge(self::DEFAULT_DATA, $data);
78+
$product = $this->productRepository->getById(
79+
$data[UrlRewriteDataModel::ENTITY_ID],
80+
storeId: $data[UrlRewriteDataModel::STORE_ID]
81+
);
82+
if (!isset($data[UrlRewriteDataModel::TARGET_PATH])) {
83+
$data[UrlRewriteDataModel::TARGET_PATH] = $this->productUrlPathGenerator->getCanonicalUrlPath($product);
84+
if ($data[UrlRewriteDataModel::REDIRECT_TYPE]) {
85+
$rewrite = $this->urlFinder->findOneByData(
86+
[
87+
UrlRewriteDataModel::ENTITY_ID => $data[UrlRewriteDataModel::ENTITY_ID],
88+
UrlRewriteDataModel::TARGET_PATH => $data[UrlRewriteDataModel::TARGET_PATH],
89+
UrlRewriteDataModel::ENTITY_TYPE => $data[UrlRewriteDataModel::ENTITY_TYPE],
90+
UrlRewriteDataModel::STORE_ID => $data[UrlRewriteDataModel::STORE_ID],
91+
]
92+
);
93+
if ($rewrite) {
94+
$data[UrlRewriteDataModel::TARGET_PATH] = $rewrite->getRequestPath();
95+
} else {
96+
$data[UrlRewriteDataModel::TARGET_PATH] = $this->productUrlPathGenerator->getUrlPath($product);
97+
}
98+
}
99+
}
100+
return $data;
101+
}
102+
}

0 commit comments

Comments
 (0)