Skip to content

Commit d8643e2

Browse files
committed
#28569: Multi-store: Missing store codes in relation to a group and website
- Created separate test for available stores Added website specific store output
1 parent 48f8add commit d8643e2

File tree

4 files changed

+208
-55
lines changed

4 files changed

+208
-55
lines changed

app/code/Magento/StoreGraphQl/Model/Resolver/AvailableStoresResolver.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,6 @@ public function resolve(
4141
array $value = null,
4242
array $args = null
4343
) {
44-
return $this->storeConfigDataProvider->getAvailableStores();
44+
return $this->storeConfigDataProvider->getAvailableStoreConfig($context->getExtensionAttributes()->getStore());
4545
}
4646
}

app/code/Magento/StoreGraphQl/Model/Resolver/Store/StoreConfigDataProvider.php

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
use Magento\Framework\App\Config\ScopeConfigInterface;
1111
use Magento\Store\Api\Data\StoreConfigInterface;
1212
use Magento\Store\Api\StoreConfigManagerInterface;
13+
use Magento\Store\Model\ResourceModel\Store\Collection;
14+
use Magento\Store\Model\ResourceModel\StoreWebsiteRelation;
1315
use Magento\Store\Model\ScopeInterface;
1416
use Magento\Store\Api\Data\StoreInterface;
1517

@@ -33,19 +35,35 @@ class StoreConfigDataProvider
3335
*/
3436
private $extendedConfigData;
3537

38+
/**
39+
* @var StoreWebsiteRelation
40+
*/
41+
private $storeWebsiteRelation;
42+
43+
/**
44+
* @var Collection
45+
*/
46+
private $storeCollection;
47+
3648
/**
3749
* @param StoreConfigManagerInterface $storeConfigManager
3850
* @param ScopeConfigInterface $scopeConfig
51+
* @param StoreWebsiteRelation $storeWebsiteRelation
52+
* @param Collection $storeCollection
3953
* @param array $extendedConfigData
4054
*/
4155
public function __construct(
4256
StoreConfigManagerInterface $storeConfigManager,
4357
ScopeConfigInterface $scopeConfig,
58+
StoreWebsiteRelation $storeWebsiteRelation,
59+
Collection $storeCollection,
4460
array $extendedConfigData = []
4561
) {
4662
$this->storeConfigManager = $storeConfigManager;
4763
$this->scopeConfig = $scopeConfig;
4864
$this->extendedConfigData = $extendedConfigData;
65+
$this->storeWebsiteRelation = $storeWebsiteRelation;
66+
$this->storeCollection = $storeCollection;
4967
}
5068

5169
/**
@@ -61,17 +79,23 @@ public function getStoreConfigData(StoreInterface $store): array
6179
}
6280

6381
/**
64-
* Get available stores
82+
* Get website available stores
6583
*
84+
* @param StoreInterface $store
6685
* @return array
6786
*/
68-
public function getAvailableStores(): array
87+
public function getAvailableStoreConfig(StoreInterface $store): array
6988
{
89+
$storeIds = $this->storeWebsiteRelation->getStoreByWebsiteId($store->getWebsiteId());
90+
$websiteStores = $this->storeCollection->addIdFilter($storeIds);
7091
$storesConfigData = [];
71-
$storeConfigs = $this->storeConfigManager->getStoreConfigs();
7292

73-
foreach ($storeConfigs as $storeConfig) {
74-
$storesConfigData[] = $this->prepareStoreConfigData($storeConfig);
93+
foreach ($websiteStores as $websiteStore) {
94+
if ($websiteStore->getIsActive()) {
95+
$storesConfigData[] = $this->prepareStoreConfigData(
96+
$this->storeConfigManager->getStoreConfig($websiteStore)
97+
);
98+
}
7599
}
76100

77101
return $storesConfigData;
Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
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\GraphQl\Store;
9+
10+
use Magento\Framework\App\Config\ScopeConfigInterface;
11+
use Magento\Framework\ObjectManagerInterface;
12+
use Magento\Store\Api\Data\StoreConfigInterface;
13+
use Magento\Store\Api\StoreConfigManagerInterface;
14+
use Magento\Store\Model\ScopeInterface;
15+
use Magento\TestFramework\Helper\Bootstrap;
16+
use Magento\TestFramework\TestCase\GraphQlAbstract;
17+
18+
/**
19+
* Test the GraphQL endpoint's StoreConfigs and AvailableStores queries
20+
*/
21+
class AvailableStoreConfigTest extends GraphQlAbstract
22+
{
23+
24+
/**
25+
* @var ObjectManagerInterface
26+
*/
27+
private $objectManager;
28+
29+
/**
30+
* @inheritDoc
31+
*/
32+
protected function setUp(): void
33+
{
34+
$this->objectManager = Bootstrap::getObjectManager();
35+
}
36+
37+
/**
38+
* @magentoApiDataFixture Magento/Store/_files/store.php
39+
* @magentoApiDataFixture Magento/Store/_files/inactive_store.php
40+
* @magentoConfigFixture default_store store/information/name Default Store
41+
* @magentoConfigFixture test_store store/information/name Test Store
42+
*/
43+
public function testDefaultWebsiteAvailableStoreConfigs(): void
44+
{
45+
/** @var StoreConfigManagerInterface $storeConfigManager */
46+
$storeConfigManager = $this->objectManager->get(StoreConfigManagerInterface::class);
47+
$storeConfigs = $storeConfigManager->getStoreConfigs();
48+
49+
$expectedAvailableStores = [];
50+
$expectedAvailableStoreCodes = [
51+
'default',
52+
'test'
53+
];
54+
55+
foreach ($storeConfigs as $storeConfig) {
56+
if (in_array($storeConfig->getCode(), $expectedAvailableStoreCodes)) {
57+
$expectedAvailableStores[] = $storeConfig;
58+
}
59+
}
60+
61+
$query
62+
= <<<QUERY
63+
{
64+
availableStores {
65+
id,
66+
code,
67+
website_id,
68+
locale,
69+
base_currency_code,
70+
default_display_currency_code,
71+
timezone,
72+
weight_unit,
73+
base_url,
74+
base_link_url,
75+
base_static_url,
76+
base_media_url,
77+
secure_base_url,
78+
secure_base_link_url,
79+
secure_base_static_url,
80+
secure_base_media_url,
81+
store_name
82+
}
83+
}
84+
QUERY;
85+
$response = $this->graphQlQuery($query);
86+
87+
$this->assertArrayHasKey('availableStores', $response);
88+
foreach ($expectedAvailableStores as $key => $storeConfig) {
89+
$this->validateStoreConfig($storeConfig, $response['availableStores'][$key]);
90+
}
91+
}
92+
93+
/**
94+
* @magentoApiDataFixture Magento/Store/_files/second_website_with_two_stores.php
95+
* @magentoConfigFixture fixture_second_store_store store/information/name Fixture Second Store
96+
* @magentoConfigFixture fixture_third_store_store store/information/name Fixture Third Store
97+
*/
98+
public function testNonDefaultWebsiteAvailableStoreConfigs(): void
99+
{
100+
/** @var StoreConfigManagerInterface $storeConfigManager */
101+
$storeConfigManager = $this->objectManager->get(StoreConfigManagerInterface::class);
102+
$storeConfigs = $storeConfigManager->getStoreConfigs(['fixture_second_store', 'fixture_third_store']);
103+
104+
$query
105+
= <<<QUERY
106+
{
107+
availableStores {
108+
id,
109+
code,
110+
website_id,
111+
locale,
112+
base_currency_code,
113+
default_display_currency_code,
114+
timezone,
115+
weight_unit,
116+
base_url,
117+
base_link_url,
118+
base_static_url,
119+
base_media_url,
120+
secure_base_url,
121+
secure_base_link_url,
122+
secure_base_static_url,
123+
secure_base_media_url,
124+
store_name
125+
}
126+
}
127+
QUERY;
128+
$headerMap = ['Store' => 'fixture_second_store'];
129+
$response = $this->graphQlQuery($query, [], '', $headerMap);
130+
131+
$this->assertArrayHasKey('availableStores', $response);
132+
foreach ($storeConfigs as $key => $storeConfig) {
133+
$this->validateStoreConfig($storeConfig, $response['availableStores'][$key]);
134+
}
135+
}
136+
137+
/**
138+
* Validate Store Config Data
139+
*
140+
* @param StoreConfigInterface $storeConfig
141+
* @param array $responseConfig
142+
*/
143+
private function validateStoreConfig($storeConfig, $responseConfig): void
144+
{
145+
/* @var $scopeConfig ScopeConfigInterface */
146+
$scopeConfig = $this->objectManager->get(ScopeConfigInterface::class);
147+
$this->assertEquals($storeConfig->getId(), $responseConfig['id']);
148+
$this->assertEquals($storeConfig->getCode(), $responseConfig['code']);
149+
$this->assertEquals($storeConfig->getLocale(), $responseConfig['locale']);
150+
$this->assertEquals($storeConfig->getBaseCurrencyCode(), $responseConfig['base_currency_code']);
151+
$this->assertEquals(
152+
$storeConfig->getDefaultDisplayCurrencyCode(),
153+
$responseConfig['default_display_currency_code']
154+
);
155+
$this->assertEquals($storeConfig->getTimezone(), $responseConfig['timezone']);
156+
$this->assertEquals($storeConfig->getWeightUnit(), $responseConfig['weight_unit']);
157+
$this->assertEquals($storeConfig->getBaseUrl(), $responseConfig['base_url']);
158+
$this->assertEquals($storeConfig->getBaseLinkUrl(), $responseConfig['base_link_url']);
159+
$this->assertEquals($storeConfig->getBaseStaticUrl(), $responseConfig['base_static_url']);
160+
$this->assertEquals($storeConfig->getBaseMediaUrl(), $responseConfig['base_media_url']);
161+
$this->assertEquals($storeConfig->getSecureBaseUrl(), $responseConfig['secure_base_url']);
162+
$this->assertEquals($storeConfig->getSecureBaseLinkUrl(), $responseConfig['secure_base_link_url']);
163+
$this->assertEquals($storeConfig->getSecureBaseStaticUrl(), $responseConfig['secure_base_static_url']);
164+
$this->assertEquals($storeConfig->getSecureBaseMediaUrl(), $responseConfig['secure_base_media_url']);
165+
$this->assertEquals($scopeConfig->getValue(
166+
'store/information/name',
167+
ScopeInterface::SCOPE_STORE,
168+
$storeConfig->getId()
169+
), $responseConfig['store_name']);
170+
}
171+
}

dev/tests/api-functional/testsuite/Magento/GraphQl/Store/StoreConfigResolverTest.php

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

88
namespace Magento\GraphQl\Store;
99

10-
use Exception;
1110
use Magento\Framework\App\Config\ScopeConfigInterface;
1211
use Magento\Framework\Exception\NoSuchEntityException;
1312
use Magento\Store\Api\Data\StoreConfigInterface;
@@ -25,9 +24,12 @@
2524
class StoreConfigResolverTest extends GraphQlAbstract
2625
{
2726

28-
/** @var ObjectManager */
27+
/** @var ObjectManager */
2928
private $objectManager;
3029

30+
/**
31+
* @inheritDoc
32+
*/
3133
protected function setUp(): void
3234
{
3335
$this->objectManager = Bootstrap::getObjectManager();
@@ -40,16 +42,16 @@ protected function setUp(): void
4042
*/
4143
public function testGetStoreConfig(): void
4244
{
43-
/** @var StoreConfigManagerInterface $defaultStoreConfigsManager */
44-
$defaultStoreConfigsManager = $this->objectManager->get(StoreConfigManagerInterface::class);
45+
/** @var StoreConfigManagerInterface $storeConfigManager */
46+
$storeConfigManager = $this->objectManager->get(StoreConfigManagerInterface::class);
4547
/** @var StoreResolverInterface $storeResolver */
4648
$storeResolver = $this->objectManager->get(StoreResolverInterface::class);
4749
/** @var StoreRepositoryInterface $storeRepository */
4850
$storeRepository = $this->objectManager->get(StoreRepositoryInterface::class);
4951
$storeId = $storeResolver->getCurrentStoreId();
5052
$store = $storeRepository->getById($storeId);
5153
/** @var StoreConfigInterface $defaultStoreConfig */
52-
$defaultStoreConfig = current($defaultStoreConfigsManager->getStoreConfigs([$store->getCode()]));
54+
$defaultStoreConfig = current($storeConfigManager->getStoreConfigs([$store->getCode()]));
5355
$query
5456
= <<<QUERY
5557
{
@@ -79,50 +81,6 @@ public function testGetStoreConfig(): void
7981
$this->validateStoreConfig($defaultStoreConfig, $response['storeConfig']);
8082
}
8183

82-
/**
83-
* @magentoApiDataFixture Magento/Store/_files/store.php
84-
* @magentoConfigFixture default_store store/information/name Default Store
85-
* @magentoConfigFixture test_store store/information/name Test Store
86-
* @throws Exception
87-
*/
88-
public function testAvailableStoreConfigs(): void
89-
{
90-
/** @var StoreConfigManagerInterface $defaultStoreConfigsManager */
91-
$defaultStoreConfigsManager = $this->objectManager->get(StoreConfigManagerInterface::class);
92-
$storeConfigs = $defaultStoreConfigsManager->getStoreConfigs();
93-
94-
$query
95-
= <<<QUERY
96-
{
97-
availableStores {
98-
id,
99-
code,
100-
website_id,
101-
locale,
102-
base_currency_code,
103-
default_display_currency_code,
104-
timezone,
105-
weight_unit,
106-
base_url,
107-
base_link_url,
108-
base_static_url,
109-
base_media_url,
110-
secure_base_url,
111-
secure_base_link_url,
112-
secure_base_static_url,
113-
secure_base_media_url,
114-
store_name
115-
}
116-
}
117-
QUERY;
118-
$response = $this->graphQlQuery($query);
119-
120-
$this->assertArrayHasKey('availableStores', $response);
121-
foreach ($storeConfigs as $key => $storeConfig) {
122-
$this->validateStoreConfig($storeConfig, $response['availableStores'][$key]);
123-
}
124-
}
125-
12684
/**
12785
* Validate Store Config Data
12886
*

0 commit comments

Comments
 (0)