Skip to content

Commit d2bef48

Browse files
committed
MC-29929: cmsBlocks that has scope limited to specific Store View can be seen on other Store Views
- fixtures and test
1 parent 04c698f commit d2bef48

File tree

5 files changed

+272
-0
lines changed

5 files changed

+272
-0
lines changed

dev/tests/api-functional/testsuite/Magento/GraphQl/Cms/CmsBlockTest.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,4 +206,38 @@ public function testGetEnabledAndDisabledCmsBlockInOneRequest()
206206
$responseData['errors'][0]['message']
207207
);
208208
}
209+
/**
210+
* Verify the CMS Block per storeview
211+
*
212+
* @magentoApiDataFixture Magento/Store/_files/multiple_websites_with_store_groups_stores.php
213+
* @magentoApiDataFixture Magento/Cms/_files/blocks_for_different_stores.php
214+
*/
215+
public function testGetCmsBlockPerSpecificStore(): void
216+
{
217+
$blockIdentitifier1 = 'test-block';
218+
$blockIdentitifier2 = 'test-block-2';
219+
$storeCode = 'third_store_view';
220+
$this->getCmsBlockQuery($blockIdentitifier2, $storeCode);
221+
222+
}
223+
private function getCmsBlockQuery($blockIdentitifier, $storeCode)
224+
{
225+
$query =
226+
<<<QUERY
227+
{
228+
cmsBlocks(identifiers: "$blockIdentitifier") {
229+
items {
230+
identifier
231+
title
232+
content
233+
}
234+
}
235+
storeConfig{code}
236+
}
237+
QUERY;
238+
$headerMap['Store'] = $storeCode;
239+
$response = $this->graphQlQuery($query, [], '', $headerMap);
240+
self::assertArrayHasKey('cmsBlocks', $response);
241+
self::assertArrayHasKey('items', $response['cmsBlocks']);
242+
}
209243
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
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\Cms\Api\BlockRepositoryInterface;
9+
use Magento\Cms\Api\Data\BlockInterface;
10+
use Magento\Cms\Api\Data\BlockInterfaceFactory;
11+
use Magento\Store\Model\StoreManagerInterface;
12+
use Magento\TestFramework\Helper\Bootstrap;
13+
14+
//require __DIR__ . '/../../../Magento/Store/_files/multiple_websites_with_store_groups_stores.php';
15+
/** @var BlockRepositoryInterface $blockRepository */
16+
$blockRepository = Bootstrap::getObjectManager()->get(BlockRepositoryInterface::class);
17+
/** @var BlockInterfaceFactory $blockFactory */
18+
$blockFactory = Bootstrap::getObjectManager()->get(BlockInterfaceFactory::class);
19+
/** @var StoreManagerInterface $stores */
20+
$stores = Bootstrap::getObjectManager()->get(StoreManagerInterface::class)->getStores();
21+
$i = 0;
22+
array_shift($stores);
23+
foreach ($stores as $store) {
24+
$store->getId();
25+
}
26+
27+
/** @var BlockInterface $block */
28+
$block = $blockFactory->create([
29+
'data' => [
30+
BlockInterface::IDENTIFIER => 'test-block',
31+
BlockInterface::TITLE => 'Second store block',
32+
BlockInterface::CONTENT => '
33+
<h1>Test Block 1 for Second Store</h1>
34+
<a href="{{store url=""}}">store url</a>
35+
<p>Config value: "{{config path="trans_email/ident_general/name"}}".</p>
36+
<p>Custom path: "{{config path="trans_email/ident_general/email"}}".</p>
37+
',
38+
BlockInterface::IS_ACTIVE => 1,
39+
'store_id' => [$stores[0]->getId()],
40+
]
41+
]);
42+
$blockRepository->save($block);
43+
44+
/** @var BlockInterface $block */
45+
$block = $blockFactory->create([
46+
'data' => [
47+
BlockInterface::IDENTIFIER => 'test-block-2',
48+
BlockInterface::TITLE => 'Second store block 2',
49+
BlockInterface::CONTENT => '
50+
<h1>Test Block 2 for Second Store</h1>
51+
<a href="{{store url=""}}">store url</a>
52+
<p>Config value: "{{config path="trans_email/ident_general/name"}}".</p>
53+
<p>Custom path: "{{config path="trans_email/ident_general/email"}}".</p>
54+
',
55+
BlockInterface::IS_ACTIVE => 1,
56+
'store_id' => [$stores[0]->getId()],
57+
]
58+
]);
59+
$blockRepository->save($block);
60+
61+
/** @var BlockInterface $block */
62+
$block = $blockFactory->create([
63+
'data' => [
64+
BlockInterface::IDENTIFIER => 'test-block',
65+
BlockInterface::TITLE => 'Third store block',
66+
BlockInterface::CONTENT => '
67+
<h1>Test Block for Third Store</h1>
68+
<a href="{{store url=""}}">store url</a>
69+
<p>Config value: "{{config path="trans_email/ident_general/name"}}".</p>
70+
<p>Custom path: "{{config path="trans_email/ident_general/email"}}".</p>
71+
',
72+
BlockInterface::IS_ACTIVE => 1,
73+
'store_id' => [$stores[1]->getId()],
74+
]
75+
]);
76+
$blockRepository->save($block);
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
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\Cms\Api\BlockRepositoryInterface;
9+
use Magento\Cms\Api\Data\BlockInterface;
10+
use Magento\Framework\Api\SearchCriteriaBuilder;
11+
use Magento\TestFramework\Helper\Bootstrap;
12+
13+
$objectManager = Bootstrap::getObjectManager();
14+
15+
/** @var BlockRepositoryInterface $blockRepository */
16+
$blockRepository = $objectManager->get(BlockRepositoryInterface::class);
17+
18+
/** @var SearchCriteriaBuilder $searchCriteriaBuilder */
19+
$searchCriteriaBuilder = $objectManager->get(SearchCriteriaBuilder::class);
20+
$searchCriteria = $searchCriteriaBuilder->addFilter(BlockInterface::IDENTIFIER, '%test-block%' ,'like')
21+
->create();
22+
$result = $blockRepository->getList($searchCriteria);
23+
24+
foreach ($result->getItems() as $item) {
25+
$blockRepository->delete($item);
26+
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
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\TestFramework\Helper\Bootstrap;
9+
use Magento\Store\Model\Website;
10+
use Magento\Store\Model\Store;
11+
use Magento\Framework\App\Config\ReinitableConfigInterface;
12+
use Magento\Store\Model\Group;
13+
14+
$objectManager = Bootstrap::getObjectManager();
15+
//Creating second website with a store.
16+
/** @var $website \Magento\Store\Model\Website */
17+
$website = $objectManager->create(Website::class);
18+
$website->load('second', 'code');
19+
20+
if (!$website->getId()) {
21+
$website->setData([
22+
'code' => 'second',
23+
'name' => 'Second Test Website',
24+
'is_default' => '0',
25+
]);
26+
$website->save();
27+
}
28+
29+
/**
30+
* @var Group $storeGroup
31+
*/
32+
$storeGroup = $objectManager->create(Group::class);
33+
$storeGroup->setCode('second_store')
34+
->setName('Second store group')
35+
->setWebsite($website);
36+
$storeGroup->save();
37+
38+
$website->setDefaultGroupId($storeGroup->getId());
39+
$website->save();
40+
41+
$websiteId = $website->getId();
42+
$store = $objectManager->create(Store::class);
43+
$store->load('second_store_view', 'code');
44+
45+
if (!$store->getId()) {
46+
$groupId = $website->getDefaultGroupId();
47+
$store->setData([
48+
'code' => 'second_store_view',
49+
'website_id' => $websiteId,
50+
'group_id' => $groupId,
51+
'name' => 'Second Store View',
52+
'sort_order' => 10,
53+
'is_active' => 1,
54+
]);
55+
$store->save();
56+
}
57+
58+
//Creating third website with a store and a storeview
59+
/** @var $website \Magento\Store\Model\Website */
60+
$website2 = $objectManager->create(Website::class);
61+
$website2->load('third', 'code');
62+
63+
if (!$website2->getId()) {
64+
$website2->setData([
65+
'code' => 'third',
66+
'name' => 'Third test Website',
67+
'is_default' => '0',
68+
]);
69+
$website2->save();
70+
}
71+
72+
/**
73+
* @var Group $storeGroup
74+
*/
75+
$storeGroup2 = $objectManager->create(Group::class);
76+
$storeGroup2->setCode('third_store')
77+
->setName('Third store group')
78+
->setWebsite($website2);
79+
$storeGroup2->save($storeGroup2);
80+
81+
$website2->setDefaultGroupId($storeGroup2->getId());
82+
$website2->save($website2);
83+
84+
$websiteId2 = $website2->getId();
85+
$store2 = $objectManager->create(Store::class);
86+
$store2->load('third_store_view', 'code');
87+
88+
if (!$store2->getId()) {
89+
$groupId = $website2->getDefaultGroupId();
90+
$store2->setData([
91+
'code' => 'third_store_view',
92+
'website_id' => $websiteId2,
93+
'group_id' => $groupId,
94+
'name' => 'Third Store view',
95+
'sort_order' => 10,
96+
'is_active' => 1,
97+
]);
98+
$store2->save();
99+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
/** @var \Magento\Framework\Registry $registry */
8+
$registry = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(\Magento\Framework\Registry::class);
9+
10+
$registry->unregister('isSecureArea');
11+
$registry->register('isSecureArea', true);
12+
/** Delete the second website **/
13+
$website = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(\Magento\Store\Model\Website::class);
14+
/** @var $website \Magento\Store\Model\Website */
15+
$websiteId = $website->load('second', 'code')->getId();
16+
if ($websiteId) {
17+
$website->delete();
18+
}
19+
$website2 = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(\Magento\Store\Model\Website::class);
20+
/** @var $website \Magento\Store\Model\Website */
21+
$websiteId2 = $website2->load('third', 'code')->getId();
22+
if ($websiteId2) {
23+
$website2->delete();
24+
}
25+
26+
$store = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(\Magento\Store\Model\Store::class);
27+
if ($store->load('second_store_view', 'code')->getId()) {
28+
$store->delete();
29+
}
30+
31+
$store2 = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(\Magento\Store\Model\Store::class);
32+
if ($store2->load('third_store_view', 'code')->getId()) {
33+
$store2->delete();
34+
}
35+
36+
$registry->unregister('isSecureArea');
37+
$registry->register('isSecureArea', false);

0 commit comments

Comments
 (0)