class DesignTokenConfigEntityKernelTest
Tests values are from test module design_tokens_test.
Any change of the definition will impact the tests.
Attributes
#[CoversClass(DesignToken::class)]
#[Group('design_token')]
#[RunTestsInSeparateProcesses]
Hierarchy
- class \Drupal\KernelTests\KernelTestBase implements \Drupal\Core\DependencyInjection\ServiceProviderInterface uses \Drupal\Tests\DrupalTestCaseTrait, \Drupal\KernelTests\AssertContentTrait, \Drupal\Tests\RandomGeneratorTrait, \Drupal\Tests\ConfigTestTrait, \Drupal\Tests\ExtensionListTestTrait, \Drupal\Tests\PhpUnitCompatibilityTrait, \Prophecy\PhpUnit\ProphecyTrait, \Drupal\TestTools\Extension\DeprecationBridge\ExpectDeprecationTrait, \Drupal\Tests\BrowserHtmlDebugTrait, \Drupal\Tests\HttpKernelUiHelperTrait extends \PHPUnit\Framework\TestCase
- class \Drupal\KernelTests\Core\Theme\DesignToken\DesignTokenConfigEntityKernelTest extends \Drupal\KernelTests\KernelTestBase
Expanded class hierarchy of DesignTokenConfigEntityKernelTest
See also
core/modules/system/tests/modules/design_tokens_test/design_tokens.tokens.yml
File
-
core/
tests/ Drupal/ KernelTests/ Core/ Theme/ DesignToken/ DesignTokenConfigEntityKernelTest.php, line 27
Namespace
Drupal\KernelTests\Core\Theme\DesignTokenView source
class DesignTokenConfigEntityKernelTest extends KernelTestBase {
/**
* The entity type manager.
*/
protected EntityTypeManagerInterface $entityTypeManager;
/**
* The DesignTokenValuePluginManager service.
*/
protected DesignTokenValuePluginManagerInterface $designTokenValuePluginManager;
/**
* {@inheritdoc}
*/
protected function setUp() : void {
parent::setUp();
$this->entityTypeManager = $this->container
->get(EntityTypeManagerInterface::class);
$this->designTokenValuePluginManager = $this->container
->get(DesignTokenValuePluginManagerInterface::class);
}
/**
* Tests preSave.
*/
public function testPreSave() : void {
$values = [
'id' => 'my_id',
'path' => 'foo.bar.baz',
'type' => 'dimension',
'scopes' => [
':root' => [
'value' => 12,
'unit' => 'px',
],
'.card' => [
'value' => 14,
'unit' => 'rem',
],
'%breadcrumb' => [
'value' => 14,
'unit' => 'rem',
],
],
];
$expected = [
':root' => [
'value' => 12,
'unit' => 'px',
],
'%card' => [
'value' => 14,
'unit' => 'rem',
],
'%breadcrumb' => [
'value' => 14,
'unit' => 'rem',
],
];
$expectedProcessed = [
':root' => new Dimension([
'value' => 12,
'unit' => 'px',
], 'dimension', [
'class' => Dimension::class,
'provider' => 'core',
'id' => 'dimension',
'label' => new TranslatableMarkup('Dimension'),
]),
'%card' => new Dimension([
'value' => 14,
'unit' => 'rem',
], 'dimension', [
'class' => Dimension::class,
'provider' => 'core',
'id' => 'dimension',
'label' => new TranslatableMarkup('Dimension'),
]),
'%breadcrumb' => new Dimension([
'value' => 14,
'unit' => 'rem',
], 'dimension', [
'class' => Dimension::class,
'provider' => 'core',
'id' => 'dimension',
'label' => new TranslatableMarkup('Dimension'),
]),
];
/** @var \Drupal\Core\Theme\Entity\DesignTokenInterface $config */
$config = $this->entityTypeManager
->getStorage('design_token')
->create($values);
$config->save();
$reflection = new \ReflectionClass($config);
$property = $reflection->getProperty('scopes');
// Ensure scopes had been converted for storage.
$this->assertEquals($expected, $property->getValue($config));
// Ensure conversion for storage does not impact export.
foreach ($expectedProcessed as $scope => $pluginInstance) {
$this->assertEquals($pluginInstance, $config->getScopes()
->get($scope));
}
}
/**
* Tests CSS export.
*/
public function testToCss() : void {
$values = [
'id' => 'my_id',
'path' => 'foo.bar.baz',
'type' => 'dimension',
'scopes' => [
':root' => [
'value' => 12,
'unit' => 'px',
],
'%card' => [
'value' => 14,
'unit' => 'rem',
],
],
];
$expected = ':root{--foo-bar-baz:12px;}.card{--foo-bar-baz:14rem;}';
/** @var \Drupal\Core\Theme\Entity\DesignTokenInterface $config */
$config = $this->entityTypeManager
->getStorage('design_token')
->create($values);
$this->assertEquals($expected, DesignToken::toCss([
$config,
]));
}
/**
* Tests config schema.
*/
public function testConfigSchema() : void {
$types = [
'dimension' => [
'id' => 'dimension',
'path' => 'dimension',
'type' => 'dimension',
'scopes' => [
':root' => [
'value' => 12,
'unit' => 'px',
],
],
],
'dimension with enum' => [
'id' => 'dimension_with_enum',
'path' => 'dimension',
'type' => 'dimension',
'scopes' => [
':root' => [
'value' => 12,
'unit' => DimensionUnit::Rem,
],
],
],
'fontFamily' => [
'id' => 'font_family',
'path' => 'font.family',
'type' => 'fontFamily',
'scopes' => [
':root' => [
'Arial',
],
],
],
'fontFamily with string' => [
'id' => 'font_family_with_family',
'path' => 'font.family',
'type' => 'fontFamily',
'scopes' => [
':root' => 'Arial',
],
],
'fontWeight' => [
'id' => 'font_weight',
'path' => 'font.weight',
'type' => 'fontWeight',
'scopes' => [
':root' => 202,
],
],
'fontWeight with string' => [
'id' => 'font_weight_with_string',
'path' => 'font.weight',
'type' => 'fontWeight',
'scopes' => [
':root' => 'regular',
],
],
'fontWeight with enum' => [
'id' => 'font_weight_with_enum',
'path' => 'font.weight',
'type' => 'fontWeight',
'scopes' => [
':root' => FontWeightAlias::Bold,
],
],
'number' => [
'id' => 'number',
'path' => 'number',
'type' => 'number',
'scopes' => [
':root' => 12,
],
],
'typography' => [
'id' => 'typography',
'path' => 'typography',
'type' => 'typography',
'scopes' => [
':root' => [
'fontFamily' => [
'Arial',
'Helvetica',
],
'fontSize' => [
'value' => 10,
'unit' => 'px',
],
'fontWeight' => 'bold',
'letterSpacing' => [
'value' => 5,
'unit' => 'px',
],
'lineHeight' => 5,
],
],
],
'typography with other config structure' => [
'id' => 'typography_with_other',
'path' => 'typography',
'type' => 'typography',
'scopes' => [
':root' => [
'fontFamily' => 'Arial',
'fontSize' => [
'value' => 10,
'unit' => DimensionUnit::Rem,
],
'fontWeight' => 'bold',
'letterSpacing' => [
'value' => 5,
'unit' => DimensionUnit::Px,
],
'lineHeight' => 5,
],
],
],
'valid_path' => [
'id' => 'valid_path',
'path' => 'foo bar.baz_foo-bar',
'type' => 'number',
'scopes' => [
':root' => 12,
],
],
];
foreach ($types as $values) {
/** @var \Drupal\Core\Theme\Entity\DesignTokenInterface $config */
$config = $this->entityTypeManager
->getStorage('design_token')
->create($values);
$config->save();
$this->assertInstanceOf(DesignTokenInterface::class, $config);
}
}
/**
* Tests invalid config schema.
*/
public function testInvalidConfigSchema() : void {
$definitions = $this->designTokenValuePluginManager
->getDefinitions();
$validIds = implode(', ', array_keys($definitions));
$cases = [
'invalid_id' => [
'exceptionMessage' => 'Schema errors for core.design_token.invalidId with the following errors: 0 [id] The <em class="placeholder">&quot;invalidId&quot;</em> machine name is not valid.',
'config' => [
'id' => 'invalidId',
'path' => 'foo',
'type' => 'number',
'scopes' => [
':root' => 12,
],
],
],
'invalid_path' => [
'exceptionMessage' => 'Schema errors for core.design_token.invalid_path with the following errors: 0 [path] The <em class="placeholder">&quot;foo bar.baz_foo-bar Capital&quot;</em> path is not valid.',
'config' => [
'id' => 'invalid_path',
'path' => 'foo bar.baz_foo-bar Capital',
'type' => 'number',
'scopes' => [
':root' => 12,
],
],
],
'invalid_type' => [
'exceptionMessage' => 'The "foo" plugin does not exist. Valid plugin IDs for Drupal\\Core\\Theme\\DesignToken\\DesignTokenValuePluginManager are: ' . $validIds,
'config' => [
'id' => 'invalid_type',
'path' => 'bar',
'type' => 'foo',
'scopes' => [
':root' => [],
],
],
],
'invalid_scope' => [
'exceptionMessage' => 'Schema errors for core.design_token.invalid_scope with the following errors: 0 [scopes] The CSS selector {invalid_scope} is invalid., 1 [scopes] The keys of the sequence do not match the given constraints.',
'config' => [
'id' => 'invalid_scope',
'path' => 'invalid_scope',
'type' => 'fontFamily',
'scopes' => [
'{invalid_scope}' => [
'Arial',
],
],
],
],
'invalid_value_structure' => [
'exceptionMessage' => "The configuration property scopes.:root.0.0 doesn't exist.",
'config' => [
'id' => 'font_family',
'path' => 'font.family',
'type' => 'fontFamily',
'scopes' => [
':root' => [
[
6,
],
],
],
],
],
'invalid_font_weight_range' => [
'exceptionMessage' => "Schema errors for core.design_token.font_weight_range with the following errors: 0 [scopes.:root] This value should be between <em class="placeholder">1</em> and <em class="placeholder">1000</em>.",
'config' => [
'id' => 'font_weight_range',
'path' => 'font.family',
'type' => 'fontWeight',
'scopes' => [
':root' => 1500,
],
],
],
];
foreach ($cases as $key => $case) {
try {
/** @var \Drupal\Core\Theme\Entity\DesignTokenInterface $config */
$config = $this->entityTypeManager
->getStorage('design_token')
->create($case['config']);
$config->save();
$this->fail("There should have been a config schema exception with the case {$key}.");
} catch (\Exception $exception) {
$this->assertEquals($case['exceptionMessage'], $exception->getMessage());
$this->assertInstanceOf(\Exception::class, $exception);
}
}
}
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.