Files
2026-09-15 10:26:34 +08:00

496 lines
17 KiB
PHP

<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Config\Console\Command;
use Magento\Config\Model\Config\Structure;
use Magento\Framework\App\DeploymentConfig\FileReader;
use Magento\Framework\App\DeploymentConfig\Writer;
use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Framework\Config\File\ConfigFilePool;
use Magento\Framework\Console\Cli;
use Magento\Framework\Exception\FileSystemException;
use Magento\Framework\Filesystem;
use Magento\Store\Model\ScopeInterface;
use Magento\Store\Test\Fixture\Group;
use Magento\Store\Test\Fixture\Store;
use Magento\Store\Test\Fixture\Website;
use Magento\TestFramework\Fixture\AppArea;
use Magento\TestFramework\Fixture\DataFixture;
use Magento\TestFramework\Fixture\DbIsolation;
use Magento\TestFramework\Helper\Bootstrap;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Console\Tester\CommandTester;
/**
* Test for \Magento\Config\Console\Command\ConfigShowCommand.
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class ConfigShowCommandTest extends TestCase
{
/**
* @var CommandTester
*/
private $commandTester;
/**
* @var Filesystem
*/
private $filesystem;
/**
* @var ConfigFilePool
*/
private $configFilePool;
/**
* @var FileReader
*/
private $reader;
/**
* @var Writer
*/
private $writer;
/**
* @var array
*/
private $env;
/**
* @var array
*/
private $config;
/**
* @var array
*/
private $envConfig;
/**
* @var Structure
*/
private $structure;
/**
* @inheritdoc
*/
protected function setUp(): void
{
$objectManager = Bootstrap::getObjectManager();
$this->configFilePool = $objectManager->get(ConfigFilePool::class);
$this->filesystem = $objectManager->get(Filesystem::class);
$this->reader = $objectManager->get(FileReader::class);
$this->writer = $objectManager->get(Writer::class);
$this->structure = $objectManager->get(Structure::class);
$this->config = $this->loadConfig();
$this->envConfig = $this->loadEnvConfig();
$this->env = $_ENV;
$config = include __DIR__ . '/../../_files/config.php';
$this->writer->saveConfig([ConfigFilePool::APP_CONFIG => $config]);
$config = include __DIR__ . '/../../_files/env.php';
$this->writer->saveConfig([ConfigFilePool::APP_ENV => $config]);
$_ENV['CONFIG__DEFAULT__WEB__TEST2__TEST_VALUE_4'] = 'value4.env.default.test';
$_ENV['CONFIG__WEBSITES__BASE__WEB__TEST2__TEST_VALUE_4'] = 'value4.env.website_base.test';
$_ENV['CONFIG__STORES__DEFAULT__WEB__TEST2__TEST_VALUE_4'] = 'value4.env.store_default.test';
$_ENV['CONFIG__DEFAULT__CAMELCASE__UPPERCASE__SNAKE_CASE'] = 'env.default.test';
$_ENV['CONFIG__WEBSITES__SECONDWEBSITE__CAMELCASE__UPPERCASE__SNAKE_CASE'] = 'env.website_secondwebsite.test';
$_ENV['CONFIG__STORES__THIRD_STORE__CAMELCASE__UPPERCASE__SNAKE_CASE'] = 'env.store_third_store.test';
$this->setConfigPaths();
$command = $objectManager->create(ConfigShowCommand::class);
$this->commandTester = new CommandTester($command);
}
/**
* Test execute config show command
*
* @param string $scope
* @param string $scopeCode
* @param int $resultCode
* @param array $configs
* @return void
*
* @magentoDbIsolation enabled
* @magentoDataFixture Magento/Config/_files/config_data.php
* @dataProvider executeDataProvider
*/
public function testExecute($scope, $scopeCode, $resultCode, array $configs): void
{
$this->setConfigPaths();
$this->checkConfigs($configs, $scope, $scopeCode, $resultCode);
}
/**
* Set config paths to structure
*
* @return void
*/
private function setConfigPaths(): void
{
$reflection = new \ReflectionClass(Structure::class);
$mappedPaths = $reflection->getProperty('mappedPaths');
$mappedPaths->setAccessible(true);
$mappedPaths->setValue($this->structure, $this->getConfigPaths());
}
/**
* Returns config paths
*
* @return array
*/
private function getConfigPaths(): array
{
$configs = [
'camelCase/UPPERCASE/snake_case',
'web/test/test_value_1',
'web/test/test_value_2',
'web/test2/test_value_3',
'web/test2/test_value_4',
'web/test/value',
'carriers/fedex/account',
'paypal/fetch_reports/ftp_password',
'camelCase/UPPERCASE',
'web/test',
'web/test2',
'camelCase',
'web',
];
return array_flip($configs);
}
/**
* @return array
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
*/
public function executeDataProvider()
{
return [
[
null,
null,
Cli::RETURN_SUCCESS,
[
'web/test/test_value_1' => ['value1.db.default.test'],
'web/test/test_value_2' => ['value2.local_config.default.test'],
'web/test2/test_value_3' => ['value3.config.default.test'],
'web/test2/test_value_4' => ['value4.env.default.test'],
'carriers/fedex/account' => ['******'],
'paypal/fetch_reports/ftp_password' => ['******'],
'web/test' => [
'web/test/test_value_1 - value1.db.default.test',
'web/test/test_value_2 - value2.local_config.default.test',
],
'web/test2' => [
'web/test2/test_value_3 - value3.config.default.test',
'web/test2/test_value_4 - value4.env.default.test',
],
'web' => [
'web/test/test_value_1 - value1.db.default.test',
'web/test/test_value_2 - value2.local_config.default.test',
'web/test2/test_value_3 - value3.config.default.test',
'web/test2/test_value_4 - value4.env.default.test',
],
'' => [
'web/test/test_value_1 - value1.db.default.test',
'web/test/test_value_2 - value2.local_config.default.test',
'web/test2/test_value_3 - value3.config.default.test',
'web/test2/test_value_4 - value4.env.default.test',
'carriers/fedex/account - ******',
'paypal/fetch_reports/ftp_password - ******',
],
]
],
[
ScopeInterface::SCOPE_WEBSITES,
'base',
Cli::RETURN_SUCCESS,
[
'web/test/test_value_1' => ['value1.db.website_base.test'],
'web/test/test_value_2' => ['value2.local_config.website_base.test'],
'web/test2/test_value_3' => ['value3.config.website_base.test'],
'web/test2/test_value_4' => ['value4.env.website_base.test'],
'web/test' => [
'web/test/test_value_1 - value1.db.website_base.test',
'web/test/test_value_2 - value2.local_config.website_base.test',
],
'web/test2' => [
'web/test2/test_value_3 - value3.config.website_base.test',
'web/test2/test_value_4 - value4.env.website_base.test',
],
'web' => [
'web/test/test_value_1 - value1.db.website_base.test',
'web/test/test_value_2 - value2.local_config.website_base.test',
'web/test2/test_value_3 - value3.config.website_base.test',
'web/test2/test_value_4 - value4.env.website_base.test',
],
'' => [
'web/test/test_value_1 - value1.db.website_base.test',
'web/test/test_value_2 - value2.local_config.website_base.test',
'web/test2/test_value_3 - value3.config.website_base.test',
'web/test2/test_value_4 - value4.env.website_base.test',
],
]
],
[
ScopeInterface::SCOPE_STORES,
'default',
Cli::RETURN_SUCCESS,
[
'web/test/test_value_1' => ['value1.db.store_default.test'],
'web/test/test_value_2' => ['value2.local_config.store_default.test'],
'web/test2/test_value_3' => ['value3.config.store_default.test'],
'web/test2/test_value_4' => ['value4.env.store_default.test'],
'web/test' => [
'web/test/test_value_1 - value1.db.store_default.test',
'web/test/test_value_2 - value2.local_config.store_default.test',
],
'web/test2' => [
'web/test2/test_value_3 - value3.config.store_default.test',
'web/test2/test_value_4 - value4.env.store_default.test',
],
'web' => [
'web/test/test_value_1 - value1.db.store_default.test',
'web/test/test_value_2 - value2.local_config.store_default.test',
'web/test2/test_value_3 - value3.config.store_default.test',
'web/test2/test_value_4 - value4.env.store_default.test',
],
'' => [
'web/test/test_value_1 - value1.db.store_default.test',
'web/test/test_value_2 - value2.local_config.store_default.test',
'web/test2/test_value_3 - value3.config.store_default.test',
'web/test2/test_value_4 - value4.env.store_default.test',
],
]
],
[
null,
null,
Cli::RETURN_FAILURE,
[
'web/test/test_wrong_value' => [
'The "web/test/test_wrong_value" path doesn\'t exist. Verify and try again.'
],
]
],
[
'default',
null,
Cli::RETURN_FAILURE,
[
'web/test/test_wrong_value' => [
'The "web/test/test_wrong_value" path doesn\'t exist. Verify and try again.'
],
]
],
[
'default',
'scope_code',
Cli::RETURN_FAILURE,
[
'web/test/test_wrong_value' => [
'The "default" scope can\'t include a scope code. Try again without entering a scope code.'
],
]
],
[
'some_scope',
'scope_code',
Cli::RETURN_FAILURE,
[
'web/test/test_wrong_value' => [
'The "some_scope" value doesn\'t exist. Enter another value and try again.'
],
]
],
[
'websites',
'scope_code',
Cli::RETURN_FAILURE,
[
'web/test/test_wrong_value' => [
'The "scope_code" value doesn\'t exist. Enter another value and try again.'
],
]
],
];
}
#[
AppArea('frontend'),
DbIsolation(false),
DataFixture(Website::class, ['code' => 'SecondWebsite'], as: 'website2'),
DataFixture(Website::class, ['code' => 'THIRD_WEBSITE'], as: 'website3'),
DataFixture(Website::class, ['code' => 'fourthWebsite'], as: 'website4'),
DataFixture(Group::class, ['website_id' => '$website2.id$'], 'store_group2'),
DataFixture(Group::class, ['website_id' => '$website3.id$'], 'store_group3'),
DataFixture(Group::class, ['website_id' => '$website4.id$'], 'store_group4'),
DataFixture(Store::class, ['store_group_id' => '$store_group2.id$', 'code' => 'SecondStore'], as: 'store2'),
DataFixture(Store::class, ['store_group_id' => '$store_group3.id$', 'code' => 'THIRD_STORE'], as: 'store3'),
DataFixture(Store::class, ['store_group_id' => '$store_group4.id$', 'code' => 'fourthStore'], as: 'store4')
]
public function testExecuteEnvOnWebsitesAndStores()
{
$this->setConfigPaths();
$data = $this->configsToCheck();
foreach ($data as $datum) {
$this->checkConfigs($datum[3], $datum[0], $datum[1], $datum[2]);
}
}
public function configsToCheck(): array
{
return [
[
null,
null,
Cli::RETURN_SUCCESS,
[
'camelCase/UPPERCASE/snake_case' => ['env.default.test']
]
],
[
ScopeInterface::SCOPE_STORES,
'default',
Cli::RETURN_SUCCESS,
[
'camelCase/UPPERCASE/snake_case' => ['local_config.store_default.test']
]
],
[
ScopeInterface::SCOPE_WEBSITES,
'SecondWebsite',
Cli::RETURN_SUCCESS,
[
'camelCase/UPPERCASE/snake_case' => ['env.website_secondwebsite.test']
]
],
[
ScopeInterface::SCOPE_STORES,
'SecondStore',
Cli::RETURN_SUCCESS,
[
'camelCase/UPPERCASE/snake_case' => ['local_config.store_secondstore.test']
]
],
[
ScopeInterface::SCOPE_WEBSITES,
'THIRD_WEBSITE',
Cli::RETURN_SUCCESS,
[
'camelCase/UPPERCASE/snake_case' => ['local_config.website_third_website.tes']
]
],
[
ScopeInterface::SCOPE_STORES,
'THIRD_STORE',
Cli::RETURN_SUCCESS,
[
'camelCase/UPPERCASE/snake_case' => ['env.store_third_store.tes']
]
],
[
ScopeInterface::SCOPE_WEBSITES,
'fourthWebsite',
Cli::RETURN_SUCCESS,
[
'camelCase/UPPERCASE/snake_case' => ['local_config.website_fourthwebsite.test']
]
],
[
ScopeInterface::SCOPE_STORES,
'fourthStore',
Cli::RETURN_SUCCESS,
[
'camelCase/UPPERCASE/snake_case' => ['local_config.store_fourthstore.test']
]
]
];
}
/**
* @return array
* @throws FileSystemException
*/
private function loadConfig()
{
return $this->reader->load(ConfigFilePool::APP_CONFIG);
}
/**
* @return array
* @throws FileSystemException
*/
private function loadEnvConfig()
{
return $this->reader->load(ConfigFilePool::APP_ENV);
}
/**
* @param array $configs
* @param $scope
* @param $scopeCode
* @param $resultCode
* @return void
*/
private function checkConfigs(array $configs, $scope, $scopeCode, $resultCode): void
{
foreach ($configs as $inputPath => $configValue) {
$arguments = [
ConfigShowCommand::INPUT_ARGUMENT_PATH => $inputPath
];
if ($scope !== null) {
$arguments['--' . ConfigShowCommand::INPUT_OPTION_SCOPE] = $scope;
}
if ($scopeCode !== null) {
$arguments['--' . ConfigShowCommand::INPUT_OPTION_SCOPE_CODE] = $scopeCode;
}
$this->commandTester->execute($arguments);
$this->assertEquals(
$resultCode,
$this->commandTester->getStatusCode()
);
$commandOutput = $this->commandTester->getDisplay();
foreach ($configValue as $value) {
$this->assertStringContainsString($value, $commandOutput);
}
}
}
protected function tearDown(): void
{
$_ENV = $this->env;
$this->filesystem->getDirectoryWrite(DirectoryList::CONFIG)->writeFile(
$this->configFilePool->getPath(ConfigFilePool::APP_CONFIG),
"<?php\n return array();\n"
);
$this->filesystem->getDirectoryWrite(DirectoryList::CONFIG)->writeFile(
$this->configFilePool->getPath(ConfigFilePool::APP_ENV),
"<?php\n return array();\n"
);
$this->writer->saveConfig([ConfigFilePool::APP_CONFIG => $this->config]);
$this->writer->saveConfig([ConfigFilePool::APP_ENV => $this->envConfig]);
}
}