Skip to content

Commit

Permalink
#28569: Multi-store: Missing store codes in relation to a group and w…
Browse files Browse the repository at this point in the history
…ebsite

- Created separate test for available stores

Added website specific store output
  • Loading branch information
gallyamov committed Jun 25, 2020
1 parent 48f8add commit d8643e2
Show file tree
Hide file tree
Showing 4 changed files with 208 additions and 55 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,6 @@ public function resolve(
array $value = null,
array $args = null
) {
return $this->storeConfigDataProvider->getAvailableStores();
return $this->storeConfigDataProvider->getAvailableStoreConfig($context->getExtensionAttributes()->getStore());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Store\Api\Data\StoreConfigInterface;
use Magento\Store\Api\StoreConfigManagerInterface;
use Magento\Store\Model\ResourceModel\Store\Collection;
use Magento\Store\Model\ResourceModel\StoreWebsiteRelation;
use Magento\Store\Model\ScopeInterface;
use Magento\Store\Api\Data\StoreInterface;

Expand All @@ -33,19 +35,35 @@ class StoreConfigDataProvider
*/
private $extendedConfigData;

/**
* @var StoreWebsiteRelation
*/
private $storeWebsiteRelation;

/**
* @var Collection
*/
private $storeCollection;

/**
* @param StoreConfigManagerInterface $storeConfigManager
* @param ScopeConfigInterface $scopeConfig
* @param StoreWebsiteRelation $storeWebsiteRelation
* @param Collection $storeCollection
* @param array $extendedConfigData
*/
public function __construct(
StoreConfigManagerInterface $storeConfigManager,
ScopeConfigInterface $scopeConfig,
StoreWebsiteRelation $storeWebsiteRelation,
Collection $storeCollection,
array $extendedConfigData = []
) {
$this->storeConfigManager = $storeConfigManager;
$this->scopeConfig = $scopeConfig;
$this->extendedConfigData = $extendedConfigData;
$this->storeWebsiteRelation = $storeWebsiteRelation;
$this->storeCollection = $storeCollection;
}

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

/**
* Get available stores
* Get website available stores
*
* @param StoreInterface $store
* @return array
*/
public function getAvailableStores(): array
public function getAvailableStoreConfig(StoreInterface $store): array
{
$storeIds = $this->storeWebsiteRelation->getStoreByWebsiteId($store->getWebsiteId());
$websiteStores = $this->storeCollection->addIdFilter($storeIds);
$storesConfigData = [];
$storeConfigs = $this->storeConfigManager->getStoreConfigs();

foreach ($storeConfigs as $storeConfig) {
$storesConfigData[] = $this->prepareStoreConfigData($storeConfig);
foreach ($websiteStores as $websiteStore) {
if ($websiteStore->getIsActive()) {
$storesConfigData[] = $this->prepareStoreConfigData(
$this->storeConfigManager->getStoreConfig($websiteStore)
);
}
}

return $storesConfigData;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

namespace Magento\GraphQl\Store;

use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\ObjectManagerInterface;
use Magento\Store\Api\Data\StoreConfigInterface;
use Magento\Store\Api\StoreConfigManagerInterface;
use Magento\Store\Model\ScopeInterface;
use Magento\TestFramework\Helper\Bootstrap;
use Magento\TestFramework\TestCase\GraphQlAbstract;

/**
* Test the GraphQL endpoint's StoreConfigs and AvailableStores queries
*/
class AvailableStoreConfigTest extends GraphQlAbstract
{

/**
* @var ObjectManagerInterface
*/
private $objectManager;

/**
* @inheritDoc
*/
protected function setUp(): void
{
$this->objectManager = Bootstrap::getObjectManager();
}

/**
* @magentoApiDataFixture Magento/Store/_files/store.php
* @magentoApiDataFixture Magento/Store/_files/inactive_store.php
* @magentoConfigFixture default_store store/information/name Default Store
* @magentoConfigFixture test_store store/information/name Test Store
*/
public function testDefaultWebsiteAvailableStoreConfigs(): void
{
/** @var StoreConfigManagerInterface $storeConfigManager */
$storeConfigManager = $this->objectManager->get(StoreConfigManagerInterface::class);
$storeConfigs = $storeConfigManager->getStoreConfigs();

$expectedAvailableStores = [];
$expectedAvailableStoreCodes = [
'default',
'test'
];

foreach ($storeConfigs as $storeConfig) {
if (in_array($storeConfig->getCode(), $expectedAvailableStoreCodes)) {
$expectedAvailableStores[] = $storeConfig;
}
}

$query
= <<<QUERY
{
availableStores {
id,
code,
website_id,
locale,
base_currency_code,
default_display_currency_code,
timezone,
weight_unit,
base_url,
base_link_url,
base_static_url,
base_media_url,
secure_base_url,
secure_base_link_url,
secure_base_static_url,
secure_base_media_url,
store_name
}
}
QUERY;
$response = $this->graphQlQuery($query);

$this->assertArrayHasKey('availableStores', $response);
foreach ($expectedAvailableStores as $key => $storeConfig) {
$this->validateStoreConfig($storeConfig, $response['availableStores'][$key]);
}
}

/**
* @magentoApiDataFixture Magento/Store/_files/second_website_with_two_stores.php
* @magentoConfigFixture fixture_second_store_store store/information/name Fixture Second Store
* @magentoConfigFixture fixture_third_store_store store/information/name Fixture Third Store
*/
public function testNonDefaultWebsiteAvailableStoreConfigs(): void
{
/** @var StoreConfigManagerInterface $storeConfigManager */
$storeConfigManager = $this->objectManager->get(StoreConfigManagerInterface::class);
$storeConfigs = $storeConfigManager->getStoreConfigs(['fixture_second_store', 'fixture_third_store']);

$query
= <<<QUERY
{
availableStores {
id,
code,
website_id,
locale,
base_currency_code,
default_display_currency_code,
timezone,
weight_unit,
base_url,
base_link_url,
base_static_url,
base_media_url,
secure_base_url,
secure_base_link_url,
secure_base_static_url,
secure_base_media_url,
store_name
}
}
QUERY;
$headerMap = ['Store' => 'fixture_second_store'];
$response = $this->graphQlQuery($query, [], '', $headerMap);

$this->assertArrayHasKey('availableStores', $response);
foreach ($storeConfigs as $key => $storeConfig) {
$this->validateStoreConfig($storeConfig, $response['availableStores'][$key]);
}
}

/**
* Validate Store Config Data
*
* @param StoreConfigInterface $storeConfig
* @param array $responseConfig
*/
private function validateStoreConfig($storeConfig, $responseConfig): void
{
/* @var $scopeConfig ScopeConfigInterface */
$scopeConfig = $this->objectManager->get(ScopeConfigInterface::class);
$this->assertEquals($storeConfig->getId(), $responseConfig['id']);
$this->assertEquals($storeConfig->getCode(), $responseConfig['code']);
$this->assertEquals($storeConfig->getLocale(), $responseConfig['locale']);
$this->assertEquals($storeConfig->getBaseCurrencyCode(), $responseConfig['base_currency_code']);
$this->assertEquals(
$storeConfig->getDefaultDisplayCurrencyCode(),
$responseConfig['default_display_currency_code']
);
$this->assertEquals($storeConfig->getTimezone(), $responseConfig['timezone']);
$this->assertEquals($storeConfig->getWeightUnit(), $responseConfig['weight_unit']);
$this->assertEquals($storeConfig->getBaseUrl(), $responseConfig['base_url']);
$this->assertEquals($storeConfig->getBaseLinkUrl(), $responseConfig['base_link_url']);
$this->assertEquals($storeConfig->getBaseStaticUrl(), $responseConfig['base_static_url']);
$this->assertEquals($storeConfig->getBaseMediaUrl(), $responseConfig['base_media_url']);
$this->assertEquals($storeConfig->getSecureBaseUrl(), $responseConfig['secure_base_url']);
$this->assertEquals($storeConfig->getSecureBaseLinkUrl(), $responseConfig['secure_base_link_url']);
$this->assertEquals($storeConfig->getSecureBaseStaticUrl(), $responseConfig['secure_base_static_url']);
$this->assertEquals($storeConfig->getSecureBaseMediaUrl(), $responseConfig['secure_base_media_url']);
$this->assertEquals($scopeConfig->getValue(
'store/information/name',
ScopeInterface::SCOPE_STORE,
$storeConfig->getId()
), $responseConfig['store_name']);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@

namespace Magento\GraphQl\Store;

use Exception;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Store\Api\Data\StoreConfigInterface;
Expand All @@ -25,9 +24,12 @@
class StoreConfigResolverTest extends GraphQlAbstract
{

/** @var ObjectManager */
/** @var ObjectManager */
private $objectManager;

/**
* @inheritDoc
*/
protected function setUp(): void
{
$this->objectManager = Bootstrap::getObjectManager();
Expand All @@ -40,16 +42,16 @@ protected function setUp(): void
*/
public function testGetStoreConfig(): void
{
/** @var StoreConfigManagerInterface $defaultStoreConfigsManager */
$defaultStoreConfigsManager = $this->objectManager->get(StoreConfigManagerInterface::class);
/** @var StoreConfigManagerInterface $storeConfigManager */
$storeConfigManager = $this->objectManager->get(StoreConfigManagerInterface::class);
/** @var StoreResolverInterface $storeResolver */
$storeResolver = $this->objectManager->get(StoreResolverInterface::class);
/** @var StoreRepositoryInterface $storeRepository */
$storeRepository = $this->objectManager->get(StoreRepositoryInterface::class);
$storeId = $storeResolver->getCurrentStoreId();
$store = $storeRepository->getById($storeId);
/** @var StoreConfigInterface $defaultStoreConfig */
$defaultStoreConfig = current($defaultStoreConfigsManager->getStoreConfigs([$store->getCode()]));
$defaultStoreConfig = current($storeConfigManager->getStoreConfigs([$store->getCode()]));
$query
= <<<QUERY
{
Expand Down Expand Up @@ -79,50 +81,6 @@ public function testGetStoreConfig(): void
$this->validateStoreConfig($defaultStoreConfig, $response['storeConfig']);
}

/**
* @magentoApiDataFixture Magento/Store/_files/store.php
* @magentoConfigFixture default_store store/information/name Default Store
* @magentoConfigFixture test_store store/information/name Test Store
* @throws Exception
*/
public function testAvailableStoreConfigs(): void
{
/** @var StoreConfigManagerInterface $defaultStoreConfigsManager */
$defaultStoreConfigsManager = $this->objectManager->get(StoreConfigManagerInterface::class);
$storeConfigs = $defaultStoreConfigsManager->getStoreConfigs();

$query
= <<<QUERY
{
availableStores {
id,
code,
website_id,
locale,
base_currency_code,
default_display_currency_code,
timezone,
weight_unit,
base_url,
base_link_url,
base_static_url,
base_media_url,
secure_base_url,
secure_base_link_url,
secure_base_static_url,
secure_base_media_url,
store_name
}
}
QUERY;
$response = $this->graphQlQuery($query);

$this->assertArrayHasKey('availableStores', $response);
foreach ($storeConfigs as $key => $storeConfig) {
$this->validateStoreConfig($storeConfig, $response['availableStores'][$key]);
}
}

/**
* Validate Store Config Data
*
Expand Down

0 comments on commit d8643e2

Please sign in to comment.