Skip to content

Commit d4e6297

Browse files
author
Stanislav Idolov
authored
ENGCOM-2445: 120 implement store configs coverage #126
2 parents 6896431 + b42fd5f commit d4e6297

File tree

5 files changed

+274
-1
lines changed

5 files changed

+274
-1
lines changed
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
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\StoreGraphQl\Model\Resolver\Store;
9+
10+
use Magento\Store\Api\Data\StoreConfigInterface;
11+
use Magento\Store\Api\StoreConfigManagerInterface;
12+
use Magento\Store\Api\StoreRepositoryInterface;
13+
use Magento\Store\Api\StoreResolverInterface;
14+
15+
/**
16+
* StoreConfig field data provider, used for GraphQL request processing.
17+
*/
18+
class StoreConfigDataProvider
19+
{
20+
/**
21+
* @var StoreConfigManagerInterface
22+
*/
23+
private $storeConfigManager;
24+
25+
/**
26+
* @var StoreResolverInterface
27+
*/
28+
private $storeResolver;
29+
30+
/**
31+
* @var StoreRepositoryInterface
32+
*/
33+
private $storeRepository;
34+
35+
/**
36+
* @param StoreConfigManagerInterface $storeConfigManager
37+
* @param StoreResolverInterface $storeResolver
38+
* @param StoreRepositoryInterface $storeRepository
39+
*/
40+
public function __construct(
41+
StoreConfigManagerInterface $storeConfigManager,
42+
StoreResolverInterface $storeResolver,
43+
StoreRepositoryInterface $storeRepository
44+
) {
45+
$this->storeConfigManager = $storeConfigManager;
46+
$this->storeResolver = $storeResolver;
47+
$this->storeRepository = $storeRepository;
48+
}
49+
50+
/**
51+
* Get store config for current store
52+
*
53+
* @return array
54+
*/
55+
public function getStoreConfig() : array
56+
{
57+
$storeId = $this->storeResolver->getCurrentStoreId();
58+
$store = $this->storeRepository->getById($storeId);
59+
$storeConfig = current($this->storeConfigManager->getStoreConfigs([$store->getCode()]));
60+
61+
return $this->hidrateStoreConfig($storeConfig);
62+
}
63+
64+
/**
65+
* Transform StoreConfig object to in array format
66+
*
67+
* @param StoreConfigInterface $storeConfig
68+
* @return array
69+
*/
70+
private function hidrateStoreConfig($storeConfig): array
71+
{
72+
/** @var StoreConfigInterface $storeConfig */
73+
$storeConfigData = [
74+
'id' => $storeConfig->getId(),
75+
'code' => $storeConfig->getCode(),
76+
'website_id' => $storeConfig->getWebsiteId(),
77+
'locale' => $storeConfig->getLocale(),
78+
'base_currency_code' => $storeConfig->getBaseCurrencyCode(),
79+
'default_display_currency_code' => $storeConfig->getDefaultDisplayCurrencyCode(),
80+
'timezone' => $storeConfig->getTimezone(),
81+
'weight_unit' => $storeConfig->getWeightUnit(),
82+
'base_url' => $storeConfig->getBaseUrl(),
83+
'base_link_url' => $storeConfig->getBaseLinkUrl(),
84+
'base_static_url' => $storeConfig->getSecureBaseStaticUrl(),
85+
'base_media_url' => $storeConfig->getBaseMediaUrl(),
86+
'secure_base_url' => $storeConfig->getSecureBaseUrl(),
87+
'secure_base_link_url' => $storeConfig->getSecureBaseLinkUrl(),
88+
'secure_base_static_url' => $storeConfig->getSecureBaseStaticUrl(),
89+
'secure_base_media_url' => $storeConfig->getSecureBaseMediaUrl()
90+
];
91+
92+
return $storeConfigData;
93+
}
94+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
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\StoreGraphQl\Model\Resolver;
9+
10+
use Magento\Framework\GraphQl\Config\Element\Field;
11+
use Magento\Framework\GraphQl\Query\Resolver\Value;
12+
use Magento\Framework\GraphQl\Query\Resolver\ValueFactory;
13+
use Magento\Framework\GraphQl\Query\ResolverInterface;
14+
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
15+
use Magento\StoreGraphQl\Model\Resolver\Store\StoreConfigDataProvider;
16+
17+
/**
18+
* StoreConfig page field resolver, used for GraphQL request processing.
19+
*/
20+
class StoreConfigResolver implements ResolverInterface
21+
{
22+
/**
23+
* @var StoreConfigDataProvider
24+
*/
25+
private $storeConfigDataProvider;
26+
27+
/**
28+
* @var ValueFactory
29+
*/
30+
private $valueFactory;
31+
32+
/**
33+
* @param StoreConfigDataProvider $storeConfigsDataProvider
34+
* @param ValueFactory $valueFactory
35+
*/
36+
public function __construct(
37+
StoreConfigDataProvider $storeConfigsDataProvider,
38+
ValueFactory $valueFactory
39+
) {
40+
$this->valueFactory = $valueFactory;
41+
$this->storeConfigDataProvider = $storeConfigsDataProvider;
42+
}
43+
44+
/**
45+
* {@inheritdoc}
46+
*/
47+
public function resolve(
48+
Field $field,
49+
$context,
50+
ResolveInfo $info,
51+
array $value = null,
52+
array $args = null
53+
) : Value {
54+
55+
$storeConfigData = $this->storeConfigDataProvider->getStoreConfig();
56+
57+
$result = function () use ($storeConfigData) {
58+
return !empty($storeConfigData) ? $storeConfigData : [];
59+
};
60+
61+
return $this->valueFactory->create($result);
62+
}
63+
}

app/code/Magento/StoreGraphQl/composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
"type": "magento2-module",
55
"require": {
66
"php": "~7.1.3||~7.2.0",
7-
"magento/framework": "*"
7+
"magento/framework": "*",
8+
"magento/module-store": "*"
89
},
910
"suggest": {
1011
"magento/module-graph-ql": "*",

app/code/Magento/StoreGraphQl/etc/schema.graphqls

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# Copyright © Magento, Inc. All rights reserved.
22
# See COPYING.txt for license details.
3+
type Query {
4+
storeConfig : StoreConfig @resolver(class: "Magento\\StoreGraphQl\\Model\\Resolver\\StoreConfigResolver") @doc(description: "The store config query")
5+
}
36

47
type Website @doc(description: "The type contains information about a website") {
58
id : Int @doc(description: "The ID number assigned to the website")
@@ -9,3 +12,22 @@ type Website @doc(description: "The type contains information about a website")
912
default_group_id : String @doc(description: "The default group id that the website has")
1013
is_default : Boolean @doc(description: "Specifies if this is the default website")
1114
}
15+
16+
type StoreConfig @doc(description: "The type contains information about a store config") {
17+
id : Int @doc(description: "The ID number assigned to the store")
18+
code : String @doc(description: "A code assigned to the store to identify it")
19+
website_id : Int @doc(description: "The ID number assigned to the website store belongs")
20+
locale : String @doc(description: "Store locale")
21+
base_currency_code : String @doc(description: "Base currency code")
22+
default_display_currency_code : String @doc(description: "Default display currency code")
23+
timezone : String @doc(description: "Timezone of the store")
24+
weight_unit : String @doc(description: "The unit of weight")
25+
base_url : String @doc(description: "Base URL for the store")
26+
base_link_url : String @doc(description: "Base link URL for the store")
27+
base_static_url : String @doc(description: "Base static URL for the store")
28+
base_media_url : String @doc(description: "Base media URL for the store")
29+
secure_base_url : String @doc(description: "Secure base URL for the store")
30+
secure_base_link_url : String @doc(description: "Secure base link URL for the store")
31+
secure_base_static_url : String @doc(description: "Secure base static URL for the store")
32+
secure_base_media_url : String @doc(description: "Secure base media URL for the store")
33+
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
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\Store\Api\Data\StoreConfigInterface;
11+
use Magento\Store\Api\StoreConfigManagerInterface;
12+
use Magento\Store\Api\StoreRepositoryInterface;
13+
use Magento\Store\Api\StoreResolverInterface;
14+
use Magento\TestFramework\ObjectManager;
15+
use Magento\TestFramework\TestCase\GraphQlAbstract;
16+
17+
/**
18+
* Test the GraphQL endpoint's StoreConfigs query
19+
*/
20+
class StoreConfigResolverTest extends GraphQlAbstract
21+
{
22+
23+
/** @var ObjectManager */
24+
private $objectManager;
25+
26+
protected function setUp()
27+
{
28+
$this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
29+
}
30+
31+
/**
32+
* @magentoApiDataFixture Magento/Store/_files/store.php
33+
*/
34+
public function testGetStoreConfig()
35+
{
36+
/** @var StoreConfigManagerInterface $storeConfigsManager */
37+
$storeConfigsManager = $this->objectManager->get(StoreConfigManagerInterface::class);
38+
/** @var StoreResolverInterface $storeResolver */
39+
$storeResolver = $this->objectManager->get(StoreResolverInterface::class);
40+
/** @var StoreRepositoryInterface $storeRepository */
41+
$storeRepository = $this->objectManager->get(StoreRepositoryInterface::class);
42+
$storeId = $storeResolver->getCurrentStoreId();
43+
$store = $storeRepository->getById($storeId);
44+
/** @var StoreConfigInterface $storeConfig */
45+
$storeConfig = current($storeConfigsManager->getStoreConfigs([$store->getCode()]));
46+
$query
47+
= <<<QUERY
48+
{
49+
storeConfig{
50+
id,
51+
code,
52+
website_id,
53+
locale,
54+
base_currency_code,
55+
default_display_currency_code,
56+
timezone,
57+
weight_unit,
58+
base_url,
59+
base_link_url,
60+
base_static_url,
61+
base_media_url,
62+
secure_base_url,
63+
secure_base_link_url,
64+
secure_base_static_url,
65+
secure_base_media_url
66+
}
67+
}
68+
QUERY;
69+
$response = $this->graphQlQuery($query);
70+
$this->assertArrayHasKey('storeConfig', $response);
71+
$this->assertEquals($storeConfig->getId(), $response['storeConfig']['id']);
72+
$this->assertEquals($storeConfig->getCode(), $response['storeConfig']['code']);
73+
$this->assertEquals($storeConfig->getLocale(), $response['storeConfig']['locale']);
74+
$this->assertEquals($storeConfig->getBaseCurrencyCode(), $response['storeConfig']['base_currency_code']);
75+
$this->assertEquals(
76+
$storeConfig->getDefaultDisplayCurrencyCode(),
77+
$response['storeConfig']['default_display_currency_code']
78+
);
79+
$this->assertEquals($storeConfig->getTimezone(), $response['storeConfig']['timezone']);
80+
$this->assertEquals($storeConfig->getWeightUnit(), $response['storeConfig']['weight_unit']);
81+
$this->assertEquals($storeConfig->getBaseUrl(), $response['storeConfig']['base_url']);
82+
$this->assertEquals($storeConfig->getBaseLinkUrl(), $response['storeConfig']['base_link_url']);
83+
$this->assertEquals($storeConfig->getBaseStaticUrl(), $response['storeConfig']['base_static_url']);
84+
$this->assertEquals($storeConfig->getBaseMediaUrl(), $response['storeConfig']['base_media_url']);
85+
$this->assertEquals($storeConfig->getSecureBaseUrl(), $response['storeConfig']['secure_base_url']);
86+
$this->assertEquals($storeConfig->getSecureBaseLinkUrl(), $response['storeConfig']['secure_base_link_url']);
87+
$this->assertEquals(
88+
$storeConfig->getSecureBaseStaticUrl(),
89+
$response['storeConfig']['secure_base_static_url']
90+
);
91+
$this->assertEquals($storeConfig->getSecureBaseMediaUrl(), $response['storeConfig']['secure_base_media_url']);
92+
}
93+
}

0 commit comments

Comments
 (0)