Issue #3138652 by bnjmnm, dww: Remove StableDecoupledTest
parent
4eef94fa9a
commit
c509626db3
|
@ -1,317 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Drupal\KernelTests\Core\Theme;
|
|
||||||
|
|
||||||
use Drupal\KernelTests\KernelTestBase;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests that themes do not depend on Stable assets.
|
|
||||||
*
|
|
||||||
* These tests exist to facilitate the process of decoupling theme from Stable.
|
|
||||||
* The decoupling process includes:
|
|
||||||
* 1. Identifying Stable assets that differ from core ones
|
|
||||||
* 2. Of those differing assets, identify those that are inherited by
|
|
||||||
* the themes being tested.
|
|
||||||
* 3. Determine if a copy of that Stable asset must be added to the theme,
|
|
||||||
* or if it's acceptable for the theme to inherit the more recent version
|
|
||||||
* of the asset from core.
|
|
||||||
* This test will identify these assets and confirm that the theme has properly
|
|
||||||
* decoupled itself from them by either having a theme-specific copy of the
|
|
||||||
* asset, or it being determined that it's acceptable for the theme to use
|
|
||||||
* core's version (in which case it will be skipped by this test).
|
|
||||||
*
|
|
||||||
* @group Theme
|
|
||||||
*/
|
|
||||||
class StableDecoupledTest extends KernelTestBase {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Populates an array with CSS and templates used within a given directory.
|
|
||||||
*
|
|
||||||
* @param string[] &$assets
|
|
||||||
* Modified parameter, an array of asset filenames.
|
|
||||||
* @param string $path
|
|
||||||
* The path being checked.
|
|
||||||
*/
|
|
||||||
protected function getAssets(array &$assets, $path) {
|
|
||||||
$directory = new \RecursiveDirectoryIterator($path, \FilesystemIterator::CURRENT_AS_FILEINFO | \FilesystemIterator::SKIP_DOTS);
|
|
||||||
$iterator = new \RecursiveIteratorIterator($directory);
|
|
||||||
foreach ($iterator as $fileinfo) {
|
|
||||||
if ($fileinfo->getExtension() !== 'twig' && $fileinfo->getExtension() !== 'css') {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$filename = $fileinfo->getFilename();
|
|
||||||
$filepath = $fileinfo->getPathname();
|
|
||||||
// Tests can have assets with the same filename, so skip assets in those
|
|
||||||
// directories.
|
|
||||||
if (strpos($filepath, '/test') === FALSE) {
|
|
||||||
$assets[$filename] = file_get_contents($filepath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a list of asset filenames that are actually different in Stable.
|
|
||||||
*
|
|
||||||
* @return string[]
|
|
||||||
* Filenames of Stable assets that differ form their core equivalents.
|
|
||||||
*/
|
|
||||||
protected function assetsThatDifferInStable() {
|
|
||||||
static $non_identical_files = [];
|
|
||||||
if (!empty($non_identical_files)) {
|
|
||||||
return $non_identical_files;
|
|
||||||
}
|
|
||||||
$core_assets = [];
|
|
||||||
$stable_assets = [];
|
|
||||||
$non_identical_files = [];
|
|
||||||
|
|
||||||
$this->getAssets($core_assets, 'core/modules');
|
|
||||||
$this->getAssets($core_assets, 'core/misc');
|
|
||||||
$this->getAssets($stable_assets, 'core/themes/stable');
|
|
||||||
|
|
||||||
// Assets that are in core but not Stable.
|
|
||||||
$in_core_only = array_diff(array_keys($core_assets), array_keys($stable_assets));
|
|
||||||
|
|
||||||
// Files that are included in Stable but never loaded by core themes. This
|
|
||||||
// files file.admin.css and filter.admin.css were removed in core so
|
|
||||||
// Stable's libraries-override never replaces them with core's version. The
|
|
||||||
// simpletest-result-summary.html.twig template is skipped because the
|
|
||||||
// Simpletest module was removed from core.
|
|
||||||
$in_stable_but_never_loaded = [
|
|
||||||
'file.admin.css',
|
|
||||||
'filter.admin.css',
|
|
||||||
'simpletest-result-summary.html.twig',
|
|
||||||
];
|
|
||||||
|
|
||||||
// Files related to normalize.css can be skipped. These files are related to
|
|
||||||
// the core/normalize library and not inherited in the same manner.
|
|
||||||
$normalize_css_assets = ['normalize.css', 'normalize-fixes.css'];
|
|
||||||
|
|
||||||
// Create an array of skippable asset files.
|
|
||||||
$assets_to_skip = array_merge($in_core_only, $in_stable_but_never_loaded, $normalize_css_assets);
|
|
||||||
|
|
||||||
foreach ($stable_assets as $filename => $stable_asset_contents) {
|
|
||||||
if (in_array($filename, $assets_to_skip)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
$core_asset_contents = $core_assets[$filename];
|
|
||||||
|
|
||||||
// Most of the remaining logic in this loop is replacing expected
|
|
||||||
// differences between assets so the string comparison only surfaces
|
|
||||||
// functional differences between the two.
|
|
||||||
// Off canvas and layout builder CSS have different relative paths to
|
|
||||||
// image files than all other CSS files being tested.
|
|
||||||
if (strpos($filename, 'off-canvas') !== FALSE) {
|
|
||||||
$core_asset_contents = str_replace('(../icons', '(../../../images/core/icons', $core_asset_contents);
|
|
||||||
}
|
|
||||||
elseif (strpos($filename, 'layout-builder') !== FALSE || strpos($filename, 'settings_tray') !== FALSE) {
|
|
||||||
$core_asset_contents = str_replace('../misc', '../../misc', $core_asset_contents);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$core_asset_contents = str_replace('(../../../../misc/', '(../../../images/core/', $core_asset_contents);
|
|
||||||
$core_asset_contents = str_replace('(../../../misc/', '(../../images/core/', $core_asset_contents);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Account for several additional differences between core assets and the
|
|
||||||
// Stable equivalents.
|
|
||||||
$before = [
|
|
||||||
'* Default theme implementation',
|
|
||||||
'Default template for',
|
|
||||||
"*\n * @ingroup themeable\n */",
|
|
||||||
"*\n* @ingroup themeable\n*/",
|
|
||||||
'Default theme override',
|
|
||||||
'Default view template',
|
|
||||||
"* Theme override of a container used to wrap the media library's\n * modal dialog interface.",
|
|
||||||
];
|
|
||||||
$after = [
|
|
||||||
'* Theme override',
|
|
||||||
'Theme override for',
|
|
||||||
'*/',
|
|
||||||
'*/',
|
|
||||||
'Theme override',
|
|
||||||
'Theme override',
|
|
||||||
"* Theme override of a container used to wrap the media library's modal dialog\n * interface.",
|
|
||||||
];
|
|
||||||
$core_asset_contents = str_replace($before, $after, $core_asset_contents);
|
|
||||||
|
|
||||||
// Account for the module-specific subdirectories used by Stable CSS
|
|
||||||
// files that consume image files.
|
|
||||||
foreach (['shortcut', 'quickedit', 'color', 'views_ui', 'image'] as $module) {
|
|
||||||
$stable_asset_contents = str_replace("/../images/$module/", '/images/', $stable_asset_contents);
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the asset contents still differ after being changed to account for
|
|
||||||
// expected differences between core and stable, they are not identical
|
|
||||||
// and should be added to the array returned by this method.
|
|
||||||
if ($stable_asset_contents !== $core_asset_contents) {
|
|
||||||
$non_identical_files[] = $filename;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $non_identical_files;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Confirms that theme assets are decoupled from Stable.
|
|
||||||
*
|
|
||||||
* @param string $path
|
|
||||||
* The path to the theme being tested.
|
|
||||||
* @param string[] $to_skip
|
|
||||||
* Assets to skip in the test.
|
|
||||||
*
|
|
||||||
* @dataProvider providerTestDecoupledStable
|
|
||||||
*/
|
|
||||||
public function testDecoupledStable($path, array $to_skip) {
|
|
||||||
$assets = [];
|
|
||||||
|
|
||||||
// Get a list of asset files that differ between core and Stable.
|
|
||||||
$files_to_check = $this->assetsThatDifferInStable();
|
|
||||||
|
|
||||||
// Get all non-test .twig and .css assets within $path.
|
|
||||||
$this->getAssets($assets, $path);
|
|
||||||
|
|
||||||
// Of the assets to check, exclude any that appear within the theme being
|
|
||||||
// tested as that means they're already overridden. Also exclude those
|
|
||||||
// listed in $to_skip.
|
|
||||||
$files_inherited_from_stable = array_diff($files_to_check, array_keys($assets), $to_skip);
|
|
||||||
$this->assertEmpty($files_inherited_from_stable);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Data provider.
|
|
||||||
*
|
|
||||||
* The to-skip arrays should become increasingly smaller as issues that
|
|
||||||
* address Stable library dependencies are completed.
|
|
||||||
*
|
|
||||||
* @return array[]
|
|
||||||
* Themes and the asset filenames to be ignored.
|
|
||||||
*/
|
|
||||||
public function providerTestDecoupledStable() {
|
|
||||||
return [
|
|
||||||
'claro' => [
|
|
||||||
'path' => 'core/themes/claro',
|
|
||||||
'to-skip' => [
|
|
||||||
// The changes in the core version have acceptable results.
|
|
||||||
'block.admin.css',
|
|
||||||
// The only difference is to address an issue with normalize.css 3.0.3
|
|
||||||
// that is fixed by updating to version 8.0.1.
|
|
||||||
// @see https://drupal.org/node/2821525
|
|
||||||
'filter.caption.css',
|
|
||||||
// The only difference is overridden in Claro CSS.
|
|
||||||
'progress.module.css',
|
|
||||||
// This template is not used by core themes.
|
|
||||||
'status-report.html.twig',
|
|
||||||
// We've intentionally left system.admin.css broken in stable.
|
|
||||||
// @see https://drupal.org/node/3033734
|
|
||||||
'system.admin.css',
|
|
||||||
// The following two templates can be skipped as the only difference
|
|
||||||
// is the removal of an unnecessary data-striping attribute in core's
|
|
||||||
// version.
|
|
||||||
'system-modules-details.html.twig',
|
|
||||||
'system-modules-uninstall.html.twig',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
'seven' => [
|
|
||||||
'path' => 'core/themes/seven',
|
|
||||||
'to-skip' => [
|
|
||||||
// The changes in the core version have acceptable results.
|
|
||||||
'block.admin.css',
|
|
||||||
// The only difference is to address an issue with normalize.css 3.0.3
|
|
||||||
// that is fixed by updating to version 8.0.1.
|
|
||||||
// @see https://drupal.org/node/2821525
|
|
||||||
'filter.caption.css',
|
|
||||||
// The only difference is overridden in Seven CSS.
|
|
||||||
'progress.module.css',
|
|
||||||
// This template is not used by core themes.
|
|
||||||
'status-report.html.twig',
|
|
||||||
// The difference is a desired markup change.
|
|
||||||
// @see https://drupal.org/node/3113211
|
|
||||||
'views-ui-views-listing-table.html.twig',
|
|
||||||
// We've intentionally left system.admin.css broken in stable.
|
|
||||||
// @see https://drupal.org/node/3033734
|
|
||||||
'system.admin.css',
|
|
||||||
// The following two templates can be skipped as the only difference
|
|
||||||
// is the removal of an unnecessary data-striping attribute in core's
|
|
||||||
// version.
|
|
||||||
'system-modules-details.html.twig',
|
|
||||||
'system-modules-uninstall.html.twig',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
'bartik' => [
|
|
||||||
'path' => 'core/themes/bartik',
|
|
||||||
'to-skip' => [
|
|
||||||
// The only difference is overridden in Bartik CSS.
|
|
||||||
'container-inline.module.css',
|
|
||||||
// The only difference is overridden in Bartik CSS.
|
|
||||||
'progress.module.css',
|
|
||||||
// The changes are acceptable as Bartik is not an admin theme.
|
|
||||||
'block.admin.css',
|
|
||||||
// The only difference is to address an issue with normalize.css 3.0.3
|
|
||||||
// that is fixed by updating to version 8.0.1.
|
|
||||||
// @see https://drupal.org/node/2821525
|
|
||||||
'filter.caption.css',
|
|
||||||
// The only difference is a desired markup change.
|
|
||||||
// @see https://drupal.org/node/2528420
|
|
||||||
'install-page.html.twig',
|
|
||||||
// This template is not used by core themes.
|
|
||||||
'status-report.html.twig',
|
|
||||||
// The differences in Stable vs. core are acceptable ones.
|
|
||||||
'status-report-counter.html.twig',
|
|
||||||
// The only difference is one column of inconsequential whitespace.
|
|
||||||
'status-report-general-info.html.twig',
|
|
||||||
// The differences in Stable vs. core are acceptable ones.
|
|
||||||
'system-status-counter.css',
|
|
||||||
// We've intentionally left system.admin.css broken in stable.
|
|
||||||
// @see https://drupal.org/node/3033734
|
|
||||||
'system.admin.css',
|
|
||||||
// The difference is a desired markup change.
|
|
||||||
// @see https://drupal.org/node/3113211
|
|
||||||
'views-ui-views-listing-table.html.twig',
|
|
||||||
// The following two templates can be skipped as the only difference
|
|
||||||
// is the removal of an unnecessary data-striping attribute in core's
|
|
||||||
// version.
|
|
||||||
'system-modules-details.html.twig',
|
|
||||||
'system-modules-uninstall.html.twig',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
'umami' => [
|
|
||||||
'path' => 'core/profiles/demo_umami/themes/umami',
|
|
||||||
'to-skip' => [
|
|
||||||
// The only difference is overridden in Umami CSS.
|
|
||||||
'container-inline.module.css',
|
|
||||||
// The only difference is overridden in Umami CSS.
|
|
||||||
'progress.module.css',
|
|
||||||
// The changes are acceptable as Umami is not an admin theme.
|
|
||||||
'block.admin.css',
|
|
||||||
// The only difference is to address an issue with normalize.css 3.0.3
|
|
||||||
// that is fixed by updating to version 8.0.1.
|
|
||||||
// @see https://drupal.org/node/2821525
|
|
||||||
'filter.caption.css',
|
|
||||||
// The only difference is a desired markup change.
|
|
||||||
// @see https://drupal.org/node/2528420
|
|
||||||
'install-page.html.twig',
|
|
||||||
// This template is not used by core themes.
|
|
||||||
'status-report.html.twig',
|
|
||||||
// The differences in Stable vs. core are acceptable ones.
|
|
||||||
'status-report-counter.html.twig',
|
|
||||||
// The only difference is one column of inconsequential whitespace.
|
|
||||||
'status-report-general-info.html.twig',
|
|
||||||
// The differences in Stable vs. core are acceptable ones.
|
|
||||||
'system-status-counter.css',
|
|
||||||
// We've intentionally left system.admin.css broken in stable.
|
|
||||||
// @see https://drupal.org/node/3033734
|
|
||||||
'system.admin.css',
|
|
||||||
// The difference is a desired markup change.
|
|
||||||
// @see https://drupal.org/node/3113211
|
|
||||||
'views-ui-views-listing-table.html.twig',
|
|
||||||
// The following two templates can be skipped as the only difference
|
|
||||||
// is the removal of an unnecessary data-striping attribute in core's
|
|
||||||
// version.
|
|
||||||
'system-modules-details.html.twig',
|
|
||||||
'system-modules-uninstall.html.twig',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
Loading…
Reference in New Issue