View source
<?php
namespace Drupal\Tests\config_actions\Kernel;
use Drupal\KernelTests\KernelTestBase;
use Drupal\Component\Serialization\Yaml;
use Drupal\config_actions\ConfigActionsTransform;
class ConfigActionsPluginTest extends KernelTestBase {
public static $modules = [
'node',
'system',
'user',
'config_actions',
'test_config_actions',
];
protected $strictConfigSchema = FALSE;
protected $configActions;
protected function setUp() {
parent::setUp();
$this
->installConfig('system');
$this
->installConfig('node');
$this
->installConfig('test_config_actions');
$this->configActions = $this->container
->get('config_actions');
}
protected function getConfig($id) {
return $this->container
->get('config.factory')
->get($id)
->get();
}
protected function deleteConfig($id) {
return $this->container
->get('config.factory')
->getEditable($id)
->delete();
}
public function testReplace() {
$source = [
'langcode' => 'en',
'status' => true,
'dependencies' => [],
'id' => '@format@',
'label' => 'Default long date',
'locked' => false,
'pattern' => 'l, F j, Y - H:i',
'@key@' => 'date',
];
$replace = [
'@test@' => 'new',
'@format@' => 'long',
'@key@' => 'date',
'date' => [
'with' => 'datetime',
'type' => 'value',
'in' => [
'load',
],
],
'label' => [
'with' => 'mylabel',
'type' => 'key',
],
];
$value = 'My @test@ date';
$action = [
'plugin' => 'change',
'source' => $source,
'path' => [
'mylabel',
],
'value' => $value,
'replace' => $replace,
'replace_in' => [
'value',
'load',
'path',
],
];
$new_config = $this->configActions
->processAction($action);
$source['mylabel'] = 'My new date';
$source['id'] = 'long';
unset($source['label']);
$source['date'] = 'datetime';
unset($source['@key@']);
self::assertEquals($source, $new_config);
}
public function testOptionReplace() {
$action = [
'plugin' => 'change',
'source' => '@id@',
'path' => [
'label',
],
'actions' => [
'core.date_format.short' => [
'value' => 'Test short date',
],
'core.date_format.long' => [
'value' => 'Test long date',
],
],
];
$config = $this->configActions
->processAction($action);
$short_config = $this
->getConfig('core.date_format.short');
$long_config = $this
->getConfig('core.date_format.long');
self::assertEquals('Test short date', $short_config['label']);
self::assertEquals('Test long date', $long_config['label']);
}
public function testSource() {
$source = [
'mykey' => 'myvalue',
'label' => 'This is a @test@',
];
$dest = 'core.date_format.long';
$replace = [
'label' => [
'with' => 'mylabel',
'in' => [
'value',
],
],
'@test@' => 'new',
];
$value = 'My @test@ label';
$action = [
'plugin' => 'change',
'source' => $source,
'dest' => $dest,
'path' => [
'label',
],
'value' => $value,
'replace' => $replace,
];
$orig_config = $this
->getConfig($dest);
$tree = $this->configActions
->processAction($action);
$new_config = $this
->getConfig($dest);
$source['label'] = 'My new mylabel';
self::assertEquals($source, $tree);
$orig_config['label'] = 'My new mylabel';
self::assertEquals($orig_config, $new_config);
self::assertArrayNotHasKey('mykey', $new_config);
}
public function testDelete() {
$source = 'core.date_format.long';
$action = [
'plugin' => 'delete',
'source' => $source,
'path' => [
'label',
],
];
$orig_config = $this
->getConfig($source);
$this->configActions
->processAction($action);
$new_config = $this
->getConfig($source);
$orig_config['label'] = '';
self::assertEquals($orig_config, $new_config);
$source = 'core.date_format.long';
$action = [
'plugin' => 'delete',
'source' => $source,
'path' => [
'label',
],
'prune' => TRUE,
];
$orig_config = $this
->getConfig($source);
$new_config = $this->configActions
->processAction($action);
unset($orig_config['label']);
self::assertEquals($orig_config, $new_config);
$source = 'core.date_format.long';
$action = [
'plugin' => 'delete',
'source' => $source,
];
$this->configActions
->processAction($action);
$new_config = $this
->getConfig($source);
self::assertEmpty($new_config);
}
public function testChange() {
$source = 'core.date_format.long';
$value = 'My new label';
$action = [
'plugin' => 'change',
'source' => $source,
'path' => [
'label',
],
'value' => $value,
];
$orig_config = $this
->getConfig($source);
$this->configActions
->processAction($action);
$new_config = $this
->getConfig($source);
$orig_config['label'] = $value;
self::assertEquals($orig_config, $new_config);
$value = 'Another new label';
$action = [
'plugin' => 'change',
'source' => $source,
'value' => [
'label' => $value,
],
];
$orig_config = $this
->getConfig($source);
$this->configActions
->processAction($action);
$new_config = $this
->getConfig($source);
$orig_config['label'] = $value;
self::assertEquals($orig_config, $new_config);
$new_value = 'New Value';
$action = [
'plugin' => 'change',
'source' => $source,
'path' => [
'label',
],
'value' => $new_value,
'current_value' => $value,
];
$orig_config = $this
->getConfig($source);
$this->configActions
->processAction($action);
$new_config = $this
->getConfig($source);
$orig_config['label'] = $new_value;
self::assertEquals($orig_config, $new_config);
$action = [
'plugin' => 'change',
'source' => $source,
'path' => [
'label',
],
'value' => $value,
'current_value' => 'NONE',
];
$this
->expectException(\Exception::class);
$this
->expectExceptionMessage('Failed to validate path value for config action.');
$this->configActions
->processAction($action);
}
public function testAdd() {
$source = 'system.action.node_delete_action';
$value = [
'abc' => 123,
'def' => 'test',
];
$action = [
'plugin' => 'add',
'source' => $source,
'path' => [
'newkey',
],
'value' => $value,
];
$orig_config = $this
->getConfig($source);
$tree = $this->configActions
->processAction($action);
$orig_config['newkey'] = $value;
self::assertEquals($orig_config, $tree);
$new_config = $this
->getConfig($source);
self::assertArrayNotHasKey('newkey', $new_config);
$value = 'mydata';
$action = [
'plugin' => 'add',
'source' => $source,
'path' => [
'configuration',
],
'value' => $value,
];
$orig_config = $this
->getConfig($source);
$this->configActions
->processAction($action);
$new_config = $this
->getConfig($source);
$orig_config['configuration'] = [
$value,
];
self::assertEquals($orig_config, $new_config);
$value2 = 'another';
$action = [
'plugin' => 'add',
'source' => $source,
'path' => [
'configuration',
],
'value' => $value2,
];
$orig_config = $this
->getConfig($source);
$this->configActions
->processAction($action);
$new_config = $this
->getConfig($source);
$orig_config['configuration'] = [
$value,
$value2,
];
self::assertEquals($orig_config, $new_config);
$action = [
'plugin' => 'change',
'source' => $source,
'path' => [
'configuration',
],
'value' => [
$value,
],
];
$orig_config = $this
->getConfig($source);
$this->configActions
->processAction($action);
$new_config = $this
->getConfig($source);
$orig_config['configuration'] = [
$value,
];
self::assertEquals($orig_config, $new_config);
}
public function testNested() {
$source = 'core.date_format.@format@';
$value = 'My new label';
$action = [
'source' => $source,
'path' => [
'label',
],
'replace_in' => [
'source',
],
'actions' => [
'long-action' => [
'replace' => [
'@format@' => 'long',
],
'actions' => [
'change-action' => [
'plugin' => 'change',
'value' => $value,
],
'change-status' => [
'plugin' => 'change',
'path' => [
'locked',
],
'value' => true,
],
],
],
'short-action' => [
'plugin' => 'change',
'value' => $value,
'replace' => [
'@format@' => 'short',
],
],
],
];
$orig_config_long = $this
->getConfig('core.date_format.long');
$orig_config_short = $this
->getConfig('core.date_format.short');
$this->configActions
->processAction($action);
$new_config_long = $this
->getConfig('core.date_format.long');
$new_config_short = $this
->getConfig('core.date_format.short');
$orig_config_long['label'] = $value;
$orig_config_long['locked'] = true;
$orig_config_short['label'] = $value;
self::assertEquals($orig_config_long, $new_config_long);
self::assertEquals($orig_config_short, $new_config_short);
}
public function testTemplate() {
$config_id = 'field.storage.node.myimage';
$source_file = dirname(__FILE__) . '/field.storage.node.image.yml';
$dest = 'field.storage.node.@field_name@';
$replace = [
'@field_name@' => 'myimage',
'@cardinality@' => 2,
];
$action = [
'source' => $source_file,
'dest' => $dest,
'replace' => $replace,
];
$orig_config = Yaml::decode(file_get_contents($source_file));
$orig_config = ConfigActionsTransform::replace($orig_config, $replace);
$this->configActions
->processAction($action);
$new_config = $this
->getConfig($config_id);
self::assertEquals($orig_config, $new_config);
self::assertTrue(is_int($new_config['cardinality']), 'Cardinality test should set config as integer value');
$this
->deleteConfig($config_id);
$dest = 'field.storage.node.field_name';
$replace = [
'field_name' => 'myimage',
'@cardinality@' => 1,
];
$action = [
'source' => $source_file,
'dest' => $dest,
'replace' => $replace,
'replace_in' => [],
];
$orig_config = Yaml::decode(file_get_contents($source_file));
$tree = $this->configActions
->processAction($action);
self::assertEquals($orig_config, $tree);
$new_config = $this
->getConfig($dest);
self::assertEquals($orig_config, $new_config);
$new_config = $this
->getConfig($config_id);
self::assertEmpty($new_config);
$this
->deleteConfig($config_id);
$dest = $config_id;
$replace = [
'@field_name@' => 'myimage',
];
$action = [
'source' => [
'@dest@',
$source_file,
],
'dest' => $dest,
'replace' => $replace,
'value' => [
'cardinality' => 2,
'translatable' => true,
],
];
$orig_config = Yaml::decode(file_get_contents($source_file));
$orig_config = ConfigActionsTransform::replace($orig_config, $replace);
$orig_config['cardinality'] = 2;
$orig_config['translatable'] = true;
$this->configActions
->processAction($action);
$new_config = $this
->getConfig($config_id);
self::assertEquals($orig_config, $new_config);
$this->configActions
->clearSourceCache();
$dest = $config_id;
$replace = [
'@field_name@' => 'myimage',
];
$action = [
'source' => [
'@dest@',
$source_file,
],
'dest' => $dest,
'replace' => $replace,
'value' => [
'translatable' => false,
],
];
$orig_config = Yaml::decode(file_get_contents($source_file));
$orig_config = ConfigActionsTransform::replace($orig_config, $replace);
$orig_config['cardinality'] = 2;
$orig_config['translatable'] = false;
$this->configActions
->processAction($action);
$new_config = $this
->getConfig($config_id);
self::assertEquals($orig_config, $new_config);
}
public function testInclude() {
$replace = [
'@field_name@' => 'myimage',
'@cardinality@' => 1,
];
$action = [
'plugin' => 'include',
'module' => 'test_config_actions',
'action' => 'field_storage',
'replace' => $replace,
];
$path = drupal_get_path('module', 'test_config_actions') . '/config/templates';
$source = $path . '/field.storage.node.image.yml';
$orig_config = Yaml::decode(file_get_contents($source));
$orig_config = ConfigActionsTransform::replace($orig_config, $replace);
$this->configActions
->processAction($action);
$new_config = $this
->getConfig('field.storage.node.myimage');
self::assertEquals($orig_config, $new_config);
self::assertTrue(is_int($new_config['cardinality']), 'Cardinality test should set config as integer value');
$replace = [
'@field_name@' => 'myimage',
'@bundle@' => 'mypage',
];
$replace_article = [
'@field_name@' => 'myimage',
'@bundle@' => 'article',
];
$replace_page = [
'@field_name@' => 'myimage',
'@bundle@' => 'page',
];
$action = [
'plugin' => 'include',
'module' => 'test_config_actions',
'action' => 'field_instance',
'replace' => $replace,
];
$path = drupal_get_path('module', 'test_config_actions') . '/config/templates';
$source = $path . '/field.field.node.image.yml';
$orig_config = Yaml::decode(file_get_contents($source));
$orig_config_article = ConfigActionsTransform::replace($orig_config, $replace_article);
$orig_config_page = ConfigActionsTransform::replace($orig_config, $replace_page);
$this->configActions
->processAction($action);
$new_config_article = $this
->getConfig('field.field.node.article.myimage');
$new_config_page = $this
->getConfig('field.field.node.page.myimage');
self::assertEquals($orig_config_article, $new_config_article);
self::assertEquals($orig_config_page, $new_config_page);
$this
->deleteConfig('field.field.node.article.myimage');
$this
->deleteConfig('field.field.node.page.myimage');
$action = [
'plugin' => 'include',
'module' => 'test_config_actions',
'action' => 'field_instance:article',
'replace' => $replace,
];
$orig_config = Yaml::decode(file_get_contents($source));
$orig_config = ConfigActionsTransform::replace($orig_config, $replace);
$this->configActions
->processAction($action);
$new_config = $this
->getConfig('field.field.node.mypage.myimage');
$new_config_article = $this
->getConfig('field.field.node.article.myimage');
$new_config_page = $this
->getConfig('field.field.node.page.myimage');
self::assertEquals($orig_config, $new_config);
self::assertEmpty($new_config_article);
self::assertEmpty($new_config_page);
$config_id = 'core.date_format.short';
$action = [
'plugin' => 'include',
'module' => 'test_config_actions',
'file' => $config_id,
];
$this->configActions
->processAction($action);
$new_config = $this
->getConfig($config_id);
self::assertEquals('Test short date', $new_config['label']);
$config_id = 'core.date_format.short';
$label = 'New short date';
$action = [
'plugin' => 'include',
'module' => 'test_config_actions',
'file' => $config_id . '.yml',
'@label@' => $label,
];
$this->configActions
->processAction($action);
$new_config = $this
->getConfig($config_id);
self::assertEquals($label, $new_config['label']);
}
function testPipeline() {
$source = 'user.role.myrole';
$action = [
'source' => $source,
'path' => [
'permissions',
],
'actions' => [
'add-permission-1' => [
'plugin' => 'add',
'value' => 'permission1',
],
'delete-permissions' => [
'plugin' => 'delete',
'prune' => TRUE,
],
'add-permission-2' => [
'plugin' => 'add',
'value' => 'permission2',
],
],
];
$this->configActions
->processAction($action);
$new_config = $this
->getConfig($source);
self::assertEquals([
'permission2',
], $new_config['permissions']);
}
}