View source
<?php
namespace Drupal\Tests\config_split\Kernel;
use Drupal\config_split\Config\SplitCollectionStorage;
use Drupal\Core\Config\MemoryStorage;
use Drupal\Core\Config\StorageCopyTrait;
use Drupal\Core\Config\StorageInterface;
use Drupal\KernelTests\KernelTestBase;
use Drupal\language\Entity\ConfigurableLanguage;
use Drupal\Tests\config_filter\Kernel\ConfigStorageTestTrait;
class SplitMergeTest extends KernelTestBase {
use ConfigStorageTestTrait;
use SplitTestTrait;
use StorageCopyTrait;
public static $modules = [
'system',
'language',
'user',
'node',
'field',
'text',
'config',
'config_test',
'config_exclude_test',
'config_split',
'config_filter',
];
protected function setUp() : void {
parent::setUp();
$this
->installEntitySchema('user');
$this
->installEntitySchema('node');
$this
->installConfig([
'system',
'field',
'config_test',
'config_exclude_test',
]);
ConfigurableLanguage::createFromLangcode('fr')
->save();
ConfigurableLanguage::createFromLangcode('de')
->save();
}
public function storageAlternativesProvider() : array {
return [
[
'folder',
],
[
'collection',
],
[
'database',
],
];
}
public function testSimpleSplitExport($storage) {
$config = $this
->createSplitConfig('test_split', [
'storage' => $storage,
'module' => [
'config_test' => 0,
],
]);
$active = $this
->getActiveStorage();
$expectedExport = new MemoryStorage();
$expectedSplit = new MemoryStorage();
foreach (array_merge($active
->getAllCollectionNames(), [
StorageInterface::DEFAULT_COLLECTION,
]) as $collection) {
$active = $active
->createCollection($collection);
$expectedExport = $expectedExport
->createCollection($collection);
$expectedSplit = $expectedSplit
->createCollection($collection);
foreach ($active
->listAll() as $name) {
$data = $active
->read($name);
if ($name === 'core.extension') {
unset($data['module']['config_test']);
}
if (strpos($name, 'config_test') !== FALSE || in_array($name, [
'system.menu.exclude_test',
'system.menu.indirect_exclude_test',
])) {
$expectedSplit
->write($name, $data);
}
else {
$expectedExport
->write($name, $data);
}
}
}
if ($storage === 'collection') {
$temp = new SplitCollectionStorage($expectedExport, $config
->get('id'));
self::replaceStorageContents($expectedSplit, $temp);
}
$export = $this
->getExportStorage();
static::assertStorageEquals($expectedExport, $export);
static::assertStorageEquals($expectedSplit, $this
->getSplitPreviewStorage($config, $export));
$this
->copyConfig($expectedExport, $this
->getSyncFileStorage());
$this
->copyConfig($expectedSplit, $this
->getSplitSourceStorage($config));
static::assertStorageEquals($active, $this
->getImportStorage());
}
public function testCompleteAndConditionalSplitExport($storage) {
$config = $this
->createSplitConfig('test_split', [
'storage' => $storage,
'complete_list' => [
'config_test.types',
],
'partial_list' => [
'config_test.system',
],
]);
$active = $this
->getActiveStorage();
$this
->copyConfig($active, $this
->getSyncFileStorage());
$originalSystem = $this
->config('config_test.system')
->getRawData();
$this
->config('config_test.system')
->set('foo', 'baz')
->save();
$systemPatch = [
'added' => [
'foo' => 'bar',
],
'removed' => [
'foo' => 'baz',
],
];
$expectedExport = new MemoryStorage();
$expectedSplit = new MemoryStorage();
foreach (array_merge($active
->getAllCollectionNames(), [
StorageInterface::DEFAULT_COLLECTION,
]) as $collection) {
$active = $active
->createCollection($collection);
$expectedExport = $expectedExport
->createCollection($collection);
$expectedSplit = $expectedSplit
->createCollection($collection);
foreach ($active
->listAll() as $name) {
$data = $active
->read($name);
if ($name === 'config_test.types') {
$expectedSplit
->write($name, $data);
}
elseif ($name === 'config_test.system') {
if ($collection === StorageInterface::DEFAULT_COLLECTION) {
$expectedSplit
->write('config_split.patch.' . $name, $systemPatch);
$expectedExport
->write($name, $originalSystem);
}
else {
$expectedExport
->write($name, $data);
}
}
else {
$expectedExport
->write($name, $data);
}
}
}
if ($storage === 'collection') {
$temp = new SplitCollectionStorage($expectedExport, $config
->get('id'));
self::replaceStorageContents($expectedSplit, $temp);
}
$export = $this
->getExportStorage();
static::assertStorageEquals($expectedExport, $export);
static::assertStorageEquals($expectedSplit, $this
->getSplitPreviewStorage($config, $export));
$config
->set('complete_list', [
'config_test.system',
])
->set('partial_list', [])
->save();
$active = $this
->getActiveStorage();
$expectedExport
->write($config
->getName(), $config
->getRawData());
$expectedExport
->write('config_test.types', $active
->read('config_test.types'));
$expectedSplit
->delete('config_test.types');
$expectedSplit
->delete('config_split.patch.config_test.system');
$expectedExport
->delete('config_test.system');
$expectedSplit
->write('config_test.system', $active
->read('config_test.system'));
foreach (array_merge($active
->getAllCollectionNames(), [
StorageInterface::DEFAULT_COLLECTION,
]) as $collection) {
$active = $active
->createCollection($collection);
$expectedExport = $expectedExport
->createCollection($collection);
$expectedSplit = $expectedSplit
->createCollection($collection);
$expectedExport
->delete('config_test.system');
$expectedSplit
->write('config_test.system', $active
->read('config_test.system'));
}
if ($storage === 'collection') {
$temp = new SplitCollectionStorage($expectedExport, $config
->get('id'));
self::replaceStorageContents($expectedSplit, $temp);
}
$export = $this
->getExportStorage();
static::assertStorageEquals($expectedExport, $export);
static::assertStorageEquals($expectedSplit, $this
->getSplitPreviewStorage($config, $export));
$this
->copyConfig($expectedExport, $this
->getSyncFileStorage());
$this
->copyConfig($expectedSplit, $this
->getSplitSourceStorage($config));
static::assertStorageEquals($active, $this
->getImportStorage());
}
public function testConditionalSplitWithModuleConfig($storage) {
$config = $this
->createSplitConfig('test_split', [
'storage' => $storage,
'module' => [
'config_test' => 0,
],
'partial_list' => [
'config_test.system',
],
]);
$active = $this
->getActiveStorage();
$this
->copyConfig($active, $this
->getSyncFileStorage());
$this
->config('config_test.system')
->set('foo', 'baz')
->save();
$expectedExport = new MemoryStorage();
$expectedSplit = new MemoryStorage();
foreach (array_merge([
StorageInterface::DEFAULT_COLLECTION,
], $active
->getAllCollectionNames()) as $collection) {
$active = $active
->createCollection($collection);
$expectedExport = $expectedExport
->createCollection($collection);
$expectedSplit = $expectedSplit
->createCollection($collection);
foreach ($active
->listAll() as $name) {
$data = $active
->read($name);
if ($name === 'core.extension') {
unset($data['module']['config_test']);
}
if (strpos($name, 'config_test') !== FALSE || in_array($name, [
'system.menu.exclude_test',
'system.menu.indirect_exclude_test',
])) {
$expectedSplit
->write($name, $data);
}
else {
$expectedExport
->write($name, $data);
}
}
}
if ($storage === 'collection') {
$temp = new SplitCollectionStorage($expectedExport, $config
->get('id'));
self::replaceStorageContents($expectedSplit, $temp);
}
$export = $this
->getExportStorage();
static::assertStorageEquals($expectedExport, $export);
static::assertStorageEquals($expectedSplit, $this
->getSplitPreviewStorage($config, $export));
$this
->copyConfig($expectedExport, $this
->getSyncFileStorage());
$this
->copyConfig($expectedSplit, $this
->getSplitSourceStorage($config));
static::assertStorageEquals($active, $this
->getImportStorage());
}
public function testIncludeDependency($storage) {
$config = $this
->createSplitConfig('test_split', [
'storage' => $storage,
'complete_list' => [
'system.menu.exclude_test',
],
]);
$this
->copyConfig($this
->getActiveStorage(), $this
->getSyncFileStorage());
$this
->config('system.menu.indirect_exclude_test')
->set('label', 'Split Test')
->save();
$active = $this
->getActiveStorage();
$expectedExport = new MemoryStorage();
$expectedSplit = new MemoryStorage();
foreach (array_merge([
StorageInterface::DEFAULT_COLLECTION,
], $active
->getAllCollectionNames()) as $collection) {
$active = $active
->createCollection($collection);
$expectedExport = $expectedExport
->createCollection($collection);
$expectedSplit = $expectedSplit
->createCollection($collection);
foreach ($active
->listAll() as $name) {
$data = $active
->read($name);
if (in_array($name, [
'system.menu.exclude_test',
'system.menu.indirect_exclude_test',
])) {
$expectedSplit
->write($name, $data);
}
else {
$expectedExport
->write($name, $data);
}
}
}
if ($storage === 'collection') {
$temp = new SplitCollectionStorage($expectedExport, $config
->get('id'));
self::replaceStorageContents($expectedSplit, $temp);
}
$export = $this
->getExportStorage();
static::assertStorageEquals($expectedExport, $export);
static::assertStorageEquals($expectedSplit, $this
->getSplitPreviewStorage($config, $export));
$this
->copyConfig($expectedExport, $this
->getSyncFileStorage());
$this
->copyConfig($expectedSplit, $this
->getSplitSourceStorage($config));
static::assertStorageEquals($active, $this
->getImportStorage());
}
}