Skip to content

Commit 6b0e946

Browse files
committed
Merge remote-tracking branch 'origin/MC-40061' into 2.4-develop-sidecar-pr9
2 parents 326b87d + 7a1e8a8 commit 6b0e946

File tree

5 files changed

+297
-0
lines changed

5 files changed

+297
-0
lines changed
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
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\Block\Adminhtml\Product\Edit\Tab\Alerts;
9+
10+
use Magento\Catalog\Api\ProductRepositoryInterface;
11+
use Magento\Framework\ObjectManagerInterface;
12+
use Magento\Framework\View\LayoutInterface;
13+
use Magento\Store\Model\StoreManagerInterface;
14+
use Magento\TestFramework\Helper\Bootstrap;
15+
use PHPUnit\Framework\TestCase;
16+
17+
/**
18+
* Check stock alert grid
19+
*
20+
* @see \Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Alerts\Stock
21+
*
22+
* @magentoAppArea adminhtml
23+
*/
24+
class StockTest extends TestCase
25+
{
26+
/** @var ObjectManagerInterface */
27+
private $objectManager;
28+
29+
/** @var Stock */
30+
private $block;
31+
32+
/** @var StoreManagerInterface */
33+
private $storeManager;
34+
35+
/** @var ProductRepositoryInterface */
36+
private $productRepository;
37+
38+
/**
39+
* @inheritdoc
40+
*/
41+
protected function setUp(): void
42+
{
43+
parent::setUp();
44+
45+
$this->objectManager = Bootstrap::getObjectManager();
46+
$this->block = $this->objectManager->get(LayoutInterface::class)->createBlock(Stock::class);
47+
$this->storeManager = $this->objectManager->get(StoreManagerInterface::class);
48+
$this->productRepository = $this->objectManager->get(ProductRepositoryInterface::class);
49+
}
50+
51+
/**
52+
* @dataProvider alertsDataProvider
53+
*
54+
* @magentoDbIsolation disabled
55+
* @magentoDataFixture Magento/ProductAlert/_files/product_alert.php
56+
* @magentoDataFixture Magento/ProductAlert/_files/stock_alert_on_second_website.php
57+
*
58+
* @param string $sku
59+
* @param string $expectedEmail
60+
* @param string|null $storeCode
61+
* @return void
62+
*/
63+
public function testGridCollectionWithStoreId(string $sku, string $expectedEmail, ?string $storeCode = null): void
64+
{
65+
$productId = (int)$this->productRepository->get($sku)->getId();
66+
$storeId = $storeCode ? (int)$this->storeManager->getStore($storeCode)->getId() : null;
67+
$this->block->getRequest()->setParams(['id' => $productId, 'store' => $storeId]);
68+
$collection = $this->block->getPreparedCollection();
69+
$this->assertCount(1, $collection);
70+
$this->assertEquals($expectedEmail, $collection->getFirstItem()->getEmail());
71+
}
72+
73+
/**
74+
* @return array
75+
*/
76+
public function alertsDataProvider(): array
77+
{
78+
return [
79+
'without_store_id_filter' => [
80+
'product_sku' => 'simple',
81+
'expected_customer_emails' => '[email protected]',
82+
],
83+
'with_store_id_filter' => [
84+
'product_sku' => 'simple_on_second_website',
85+
'expected_customer_emails' => '[email protected]',
86+
'store_code' => 'fixture_third_store',
87+
],
88+
];
89+
}
90+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
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\Form\Modifier;
9+
10+
use Magento\Framework\ObjectManagerInterface;
11+
use Magento\TestFramework\Helper\Bootstrap;
12+
use Magento\TestFramework\Helper\Xpath;
13+
use PHPUnit\Framework\TestCase;
14+
15+
/**
16+
* Alerts modifier test
17+
*
18+
* @see \Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\Alerts
19+
*
20+
* @magentoAppArea adminhtml
21+
*/
22+
class AlertsTest extends TestCase
23+
{
24+
/** @var ObjectManagerInterface */
25+
private $objectManager;
26+
27+
/** @var Alerts */
28+
private $stockAlertsModifier;
29+
30+
/**
31+
* @inheritdoc
32+
*/
33+
protected function setUp(): void
34+
{
35+
parent::setUp();
36+
37+
$this->objectManager = Bootstrap::getObjectManager();
38+
$this->stockAlertsModifier = $this->objectManager->get(Alerts::class);
39+
}
40+
41+
/**
42+
* @magentoConfigFixture current_store catalog/productalert/allow_stock 1
43+
*
44+
* @return void
45+
*/
46+
public function testModifyMeta(): void
47+
{
48+
$meta = $this->stockAlertsModifier->modifyMeta([]);
49+
$this->assertArrayHasKey('alerts', $meta);
50+
$content = $meta['alerts']['children'][Alerts::DATA_SCOPE_STOCK]['arguments']['data']['config']['content'];
51+
$this->assertEquals(
52+
1,
53+
Xpath::getElementsCountForXpath("//div[@data-grid-id='alertStock']", $content)
54+
);
55+
}
56+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
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+
use Magento\Customer\Api\CustomerRepositoryInterface;
9+
use Magento\Framework\Registry;
10+
use Magento\ProductAlert\Model\StockFactory;
11+
use Magento\TestFramework\Helper\Bootstrap;
12+
use Magento\TestFramework\Workaround\Override\Fixture\Resolver;
13+
14+
$objectManager = Bootstrap::getObjectManager();
15+
/** @var StockFactory $stockFactory */
16+
$stockFactory = $objectManager->get(StockFactory::class);
17+
/** @var CustomerRepositoryInterface $customerRepository */
18+
$customerRepository = $objectManager->get(CustomerRepositoryInterface::class);
19+
$customer = $customerRepository->get('[email protected]');
20+
/** @var Registry $registry */
21+
$registry = $objectManager->get(Registry::class);
22+
23+
$registry->unregister('isSecureArea');
24+
$registry->register('isSecureArea', true);
25+
26+
$stockAlert = $stockFactory->create();
27+
$stockAlert->deleteCustomer((int)$customer->getId());
28+
29+
$registry->unregister('isSecureArea');
30+
$registry->register('isSecureArea', false);
31+
32+
Resolver::getInstance()->requireDataFixture('Magento/Customer/_files/customer_rollback.php');
33+
Resolver::getInstance()->requireDataFixture('Magento/Catalog/_files/product_simple_rollback.php');
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
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+
use Magento\Catalog\Api\Data\ProductInterfaceFactory;
9+
use Magento\Catalog\Api\ProductRepositoryInterface;
10+
use Magento\Catalog\Model\Product\Attribute\Source\Status;
11+
use Magento\Catalog\Model\Product\Visibility;
12+
use Magento\CatalogInventory\Api\Data\StockStatusInterface;
13+
use Magento\Customer\Api\CustomerRepositoryInterface;
14+
use Magento\ProductAlert\Model\ResourceModel\Stock as StockResource;
15+
use Magento\ProductAlert\Model\StockFactory;
16+
use Magento\Store\Model\StoreManagerInterface;
17+
use Magento\TestFramework\Helper\Bootstrap;
18+
use Magento\TestFramework\Workaround\Override\Fixture\Resolver;
19+
20+
Resolver::getInstance()->requireDataFixture('Magento/Customer/_files/customer_for_second_website_with_address.php');
21+
22+
$objectManager = Bootstrap::getObjectManager();
23+
/** @var StoreManagerInterface $storeManager */
24+
$storeManager = $objectManager->get(StoreManagerInterface::class);
25+
$secondWebsite = $storeManager->getWebsite('test');
26+
/** @var ProductInterfaceFactory $productFactory */
27+
$productFactory = $objectManager->get(ProductInterfaceFactory::class);
28+
/** @var ProductRepositoryInterface $peoductRepository */
29+
$productRepository = $objectManager->get(ProductRepositoryInterface::class);
30+
/** @var StockFactory $stockFactory */
31+
$stockFactory = $objectManager->get(StockFactory::class);
32+
/** @var StockResource $stockResource */
33+
$stockResource = $objectManager->get(StockResource::class);
34+
/** @var CustomerRepositoryInterface $customerRepository */
35+
$customerRepository = $objectManager->get(CustomerRepositoryInterface::class);
36+
$customer = $customerRepository->get('[email protected]', (int)$secondWebsite->getId());
37+
38+
39+
$product = $productFactory->create();
40+
$product
41+
->setTypeId('simple')
42+
->setAttributeSetId(4)
43+
->setWebsiteIds([(int)$secondWebsite->getId()])
44+
->setName('Simple Product2')
45+
->setSku('simple_on_second_website')
46+
->setPrice(10)
47+
->setMetaTitle('meta title2')
48+
->setMetaKeyword('meta keyword2')
49+
->setMetaDescription('meta description2')
50+
->setVisibility(Visibility::VISIBILITY_BOTH)
51+
->setStatus(Status::STATUS_ENABLED)
52+
->setStockData(['is_in_stock' => StockStatusInterface::STATUS_OUT_OF_STOCK]);
53+
54+
$productRepository->save($product);
55+
56+
$stockAlert = $stockFactory->create();
57+
$stockAlert->setCustomerId(
58+
$customer->getId()
59+
)->setProductId(
60+
(int)$productRepository->get($product->getSku())->getId()
61+
)->setWebsiteId(
62+
(int)$secondWebsite->getId()
63+
)->setStoreId(
64+
(int)$storeManager->getStore('fixture_third_store')->getId()
65+
);
66+
$stockResource->save($stockAlert);
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
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+
use Magento\Catalog\Api\ProductRepositoryInterface;
9+
use Magento\Customer\Api\CustomerRepositoryInterface;
10+
use Magento\Framework\Exception\NoSuchEntityException;
11+
use Magento\Framework\Registry;
12+
use Magento\ProductAlert\Model\ResourceModel\Stock as StockResource;
13+
use Magento\ProductAlert\Model\StockFactory;
14+
use Magento\Store\Model\StoreManagerInterface;
15+
use Magento\TestFramework\Helper\Bootstrap;
16+
use Magento\TestFramework\Workaround\Override\Fixture\Resolver;
17+
18+
19+
$objectManager = Bootstrap::getObjectManager();
20+
/** @var ProductRepositoryInterface $peoductRepository */
21+
$productRepository = $objectManager->get(ProductRepositoryInterface::class);
22+
/** @var StockFactory $stockFactory */
23+
$stockFactory = $objectManager->get(StockFactory::class);
24+
/** @var StockResource $stockResource */
25+
$stockResource = $objectManager->get(StockResource::class);
26+
/** @var StoreManagerInterface $storeManager */
27+
$storeManager = $objectManager->get(StoreManagerInterface::class);
28+
$secondWebsite = $storeManager->getWebsite('test');
29+
/** @var CustomerRepositoryInterface $customerRepository */
30+
$customerRepository = $objectManager->get(CustomerRepositoryInterface::class);
31+
$customer = $customerRepository->get('[email protected]', (int)$secondWebsite->getId());
32+
/** @var Registry $registry */
33+
$registry = $objectManager->get(Registry::class);
34+
35+
$registry->unregister('isSecureArea');
36+
$registry->register('isSecureArea', true);
37+
38+
try {
39+
$productRepository->deleteById('simple_on_second_website');
40+
} catch (NoSuchEntityException $e) {
41+
//already removed
42+
}
43+
44+
45+
$stockAlert = $stockFactory->create();
46+
$stockAlert->deleteCustomer((int)$customer->getId(), (int)$secondWebsite->getId());
47+
48+
$registry->unregister('isSecureArea');
49+
$registry->register('isSecureArea', false);
50+
51+
Resolver::getInstance()
52+
->requireDataFixture('Magento/Customer/_files/customer_for_second_website_with_address_rollback.php');

0 commit comments

Comments
 (0)