class ConfirmClassyCopiesTest
Same name in other branches
- 8.9.x core/tests/Drupal/KernelTests/Core/Theme/ConfirmClassyCopiesTest.php \Drupal\KernelTests\Core\Theme\ConfirmClassyCopiesTest
Confirms that theme assets copied from Classy have not been changed.
If a copied Classy asset is changed, it should no longer be in a /classy subdirectory. The files there should be exact copies from Classy. Once it has changed, it is custom to the theme and should be moved to a different location.
@group Theme @group legacy
Hierarchy
- class \Drupal\KernelTests\KernelTestBase extends \PHPUnit\Framework\TestCase implements \Drupal\Core\DependencyInjection\ServiceProviderInterface uses \Drupal\KernelTests\AssertLegacyTrait, \Drupal\KernelTests\AssertContentTrait, \Drupal\Tests\RandomGeneratorTrait, \Drupal\Tests\ConfigTestTrait, \Drupal\Tests\ExtensionListTestTrait, \Drupal\Tests\TestRequirementsTrait, \Drupal\Tests\Traits\PhpUnitWarnings, \Drupal\Tests\PhpUnitCompatibilityTrait, \Symfony\Bridge\PhpUnit\ExpectDeprecationTrait
- class \Drupal\KernelTests\Core\Theme\ConfirmClassyCopiesTest extends \Drupal\KernelTests\KernelTestBase
Expanded class hierarchy of ConfirmClassyCopiesTest
File
-
core/
tests/ Drupal/ KernelTests/ Core/ Theme/ ConfirmClassyCopiesTest.php, line 18
Namespace
Drupal\KernelTests\Core\ThemeView source
class ConfirmClassyCopiesTest extends KernelTestBase {
/**
* Tests Classy's assets have not been altered.
*/
public function testClassyHashes() {
$theme_path = $this->container
->get('extension.list.theme')
->getPath('classy');
foreach ([
'images',
'css',
'js',
'templates',
] as $type => $sub_folder) {
$asset_path = "{$theme_path}/{$sub_folder}";
$directory = new \RecursiveDirectoryIterator($asset_path, \FilesystemIterator::CURRENT_AS_FILEINFO | \FilesystemIterator::SKIP_DOTS);
$iterator = new \RecursiveIteratorIterator($directory);
$this->assertGreaterThan(0, iterator_count($iterator));
foreach ($iterator as $fileinfo) {
$filename = $fileinfo->getFilename();
$this->assertSame($this->getClassyHash($sub_folder, $filename), md5_file($fileinfo->getPathname()), "{$filename} has expected hash");
}
}
}
/**
* Confirms that files copied from Classy have not been altered.
*
* The /classy subdirectory in a theme's css, js and images directories is for
* unaltered copies of files from Classy. If a file in that subdirectory has
* changed, then it is custom to that theme and should be moved to a different
* directory. Additional information can be found in the README.txt of each of
* those /classy subdirectories.
*
* @param string $theme
* The theme being tested.
* @param string $path_replace
* A string to replace paths found in CSS so relative URLs don't cause the
* hash to differ.
* @param string[] $filenames
* Provides list of every asset copied from Classy.
*
* @dataProvider providerTestClassyCopies
*/
public function testClassyCopies($theme, $path_replace, array $filenames) {
$theme_path = $this->container
->get('extension.list.theme')
->getPath($theme);
foreach ([
'images',
'css',
'js',
'templates',
] as $sub_folder) {
$asset_path = "{$theme_path}/{$sub_folder}/classy";
// If a theme has completely customized all files of a type there is
// potentially no Classy subdirectory for that type. Tests can be skipped
// for that type.
if (!file_exists($asset_path)) {
$this->assertEmpty($filenames[$sub_folder]);
continue;
}
// Create iterators to collect all files in a asset directory.
$directory = new \RecursiveDirectoryIterator($asset_path, \FilesystemIterator::CURRENT_AS_FILEINFO | \FilesystemIterator::SKIP_DOTS);
$iterator = new \RecursiveIteratorIterator($directory);
$filecount = 0;
foreach ($iterator as $fileinfo) {
$filename = $fileinfo->getFilename();
if ($filename === 'README.txt') {
continue;
}
$filecount++;
// Replace paths in the contents so the hash will match Classy's hashes.
$contents = file_get_contents($fileinfo->getPathname());
$contents = str_replace('(' . $path_replace, '(../../../../', $contents);
$contents = str_replace('(../../../images/classy/icons', '(../../images/icons', $contents);
preg_match_all("/attach_library\\('.+\\/classy\\.(.+)'/", $contents, $classy_attach_library_matches);
if (!empty($classy_attach_library_matches[0])) {
$library_module = $classy_attach_library_matches[1][0];
$contents = str_replace("'{$theme}/classy.{$library_module}'", "'classy/{$library_module}'", $contents);
}
$this->assertContains($filename, $filenames[$sub_folder], "{$sub_folder} file: {$filename} not present.");
$this->assertSame($this->getClassyHash($sub_folder, $filename), md5($contents), "{$filename} is in the theme's /classy subdirectory, but the file contents no longer match the original file from Classy. This should be moved to a new directory and libraries should be updated. The file can be removed from the data provider.");
}
$this->assertCount($filecount, $filenames[$sub_folder], "Different count for {$sub_folder} files in the /classy subdirectory. If a file was added to /classy, it shouldn't have been. If it was intentionally removed, it should also be removed from this test's data provider.");
}
}
/**
* Provides lists of filenames for a theme's asset files copied from Classy.
*
* @return array
* Theme name, how to replace a path to core assets and asset file names.
*/
public function providerTestClassyCopies() {
return [
'umami' => [
'theme-name' => 'umami',
'path-replace' => '../../../../../../../',
'filenames' => [
'css' => [
'action-links.css',
'book-navigation.css',
'breadcrumb.css',
'button.css',
'collapse-processed.css',
'container-inline.css',
'details.css',
'dialog.css',
'dropbutton.css',
'exposed-filters.css',
'field.css',
'file.css',
'form.css',
'forum.css',
'icons.css',
'inline-form.css',
'item-list.css',
'link.css',
'links.css',
'media-embed-error.css',
'media-library.css',
'menu.css',
'more-link.css',
'node.css',
'pager.css',
'progress.css',
'search-results.css',
'tabledrag.css',
'tableselect.css',
'tablesort.css',
'tabs.css',
'textarea.css',
'ui-dialog.css',
],
'js' => [
'media_embed_ckeditor.theme.es6.js',
'media_embed_ckeditor.theme.js',
],
'images' => [
'application-octet-stream.png',
'application-pdf.png',
'application-x-executable.png',
'audio-x-generic.png',
'forum-icons.png',
'image-x-generic.png',
'package-x-generic.png',
'text-html.png',
'text-plain.png',
'text-x-generic.png',
'text-x-script.png',
'video-x-generic.png',
'x-office-document.png',
'x-office-presentation.png',
'x-office-spreadsheet.png',
],
'templates' => [
'node-edit-form.html.twig',
'image-widget.html.twig',
'node-add-list.html.twig',
'filter-guidelines.html.twig',
'filter-tips.html.twig',
'file-managed-file.html.twig',
'text-format-wrapper.html.twig',
'filter-caption.html.twig',
'help-section.html.twig',
'progress-bar.html.twig',
'form-element-label.html.twig',
'datetime-wrapper.html.twig',
'fieldset.html.twig',
'datetime-form.html.twig',
'textarea.html.twig',
'details.html.twig',
'form-element.html.twig',
'radios.html.twig',
'item-list.html.twig',
'aggregator-feed.html.twig',
'item-list--search-results.html.twig',
'table.html.twig',
'forum-list.html.twig',
'forum-icon.html.twig',
'forums.html.twig',
'maintenance-page.html.twig',
'book-export-html.html.twig',
'html.html.twig',
'region.html.twig',
'book-all-books-block.html.twig',
'book-tree.html.twig',
'book-navigation.html.twig',
'toolbar.html.twig',
'comment.html.twig',
'taxonomy-term.html.twig',
'media-embed-error.html.twig',
'book-node-export-html.html.twig',
'links--node.html.twig',
'page-title.html.twig',
'search-result.html.twig',
'aggregator-item.html.twig',
'media.html.twig',
'mark.html.twig',
'forum-submitted.html.twig',
'username.html.twig',
'user.html.twig',
'time.html.twig',
'image.html.twig',
'field--text.html.twig',
'field--text-long.html.twig',
'file-audio.html.twig',
'field--comment.html.twig',
'link-formatter-link-separate.html.twig',
'field.html.twig',
'field--text-with-summary.html.twig',
'field--node--uid.html.twig',
'field--node--title.html.twig',
'field--node--created.html.twig',
'file-video.html.twig',
'links--media-library-menu.html.twig',
'media--media-library.html.twig',
'views-view-unformatted--media-library.html.twig',
'container--media-library-content.html.twig',
'media-library-item--small.html.twig',
'container--media-library-widget-selection.html.twig',
'media-library-wrapper.html.twig',
'media-library-item.html.twig',
'views-mini-pager.html.twig',
'views-exposed-form.html.twig',
'views-view-grouping.html.twig',
'views-view-summary.html.twig',
'views-view-table.html.twig',
'views-view-row-rss.html.twig',
'views-view-summary-unformatted.html.twig',
'views-view.html.twig',
'block.html.twig',
'block--local-actions-block.html.twig',
'block--system-menu-block.html.twig',
'block--local-tasks-block.html.twig',
],
],
],
'claro' => [
'theme-name' => 'claro',
'path-replace' => '../../../../../',
'filenames' => [
'css' => [
'book-navigation.css',
'container-inline.css',
'exposed-filters.css',
'field.css',
'file.css',
'forum.css',
'icons.css',
'indented.css',
'inline-form.css',
'item-list.css',
'link.css',
'links.css',
'media-embed-error.css',
'menu.css',
'more-link.css',
'node.css',
'search-results.css',
'tablesort.css',
'textarea.css',
'ui-dialog.css',
],
'js' => [
'media_embed_ckeditor.theme.es6.js',
'media_embed_ckeditor.theme.js',
],
'images' => [
'application-octet-stream.png',
'application-pdf.png',
'application-x-executable.png',
'audio-x-generic.png',
'forum-icons.png',
'image-x-generic.png',
'package-x-generic.png',
'text-html.png',
'text-plain.png',
'text-x-generic.png',
'text-x-script.png',
'video-x-generic.png',
'x-office-document.png',
'x-office-presentation.png',
'x-office-spreadsheet.png',
],
'templates' => [
'filter-caption.html.twig',
'rdf-metadata.html.twig',
'help-section.html.twig',
'progress-bar.html.twig',
'item-list.html.twig',
'aggregator-feed.html.twig',
'item-list--search-results.html.twig',
'table.html.twig',
'forum-list.html.twig',
'forum-icon.html.twig',
'forums.html.twig',
'book-export-html.html.twig',
'html.html.twig',
'region.html.twig',
'menu.html.twig',
'book-all-books-block.html.twig',
'book-tree.html.twig',
'book-navigation.html.twig',
'toolbar.html.twig',
'comment.html.twig',
'node.html.twig',
'taxonomy-term.html.twig',
'media-embed-error.html.twig',
'book-node-export-html.html.twig',
'links--node.html.twig',
'page-title.html.twig',
'search-result.html.twig',
'aggregator-item.html.twig',
'media.html.twig',
'mark.html.twig',
'forum-submitted.html.twig',
'username.html.twig',
'user.html.twig',
'time.html.twig',
'image.html.twig',
'field--text.html.twig',
'field--text-long.html.twig',
'file-audio.html.twig',
'field--comment.html.twig',
'link-formatter-link-separate.html.twig',
'field.html.twig',
'field--text-with-summary.html.twig',
'field--node--uid.html.twig',
'field--node--title.html.twig',
'field--node--created.html.twig',
'file-video.html.twig',
'links--media-library-menu.html.twig',
'container--media-library-content.html.twig',
'media-library-item--small.html.twig',
'container--media-library-widget-selection.html.twig',
'media-library-wrapper.html.twig',
'media-library-item.html.twig',
'views-view-grouping.html.twig',
'views-view-summary.html.twig',
'views-view-table.html.twig',
'views-view-row-rss.html.twig',
'views-view-summary-unformatted.html.twig',
'views-view.html.twig',
'block--system-branding-block.html.twig',
'block--search-form-block.html.twig',
'block.html.twig',
'block--system-menu-block.html.twig',
],
],
],
'seven' => [
'theme-name' => 'seven',
'path-replace' => '../../../../../',
'filenames' => [
'css' => [
'action-links.css',
'book-navigation.css',
'breadcrumb.css',
'button.css',
'collapse-processed.css',
'container-inline.css',
'dropbutton.css',
'exposed-filters.css',
'field.css',
'file.css',
'form.css',
'forum.css',
'icons.css',
'image-widget.css',
'indented.css',
'inline-form.css',
'item-list.css',
'link.css',
'links.css',
'media-embed-error.css',
'media-library.css',
'menu.css',
'messages.css',
'more-link.css',
'node.css',
'pager.css',
'progress.css',
'search-results.css',
'tabledrag.css',
'tableselect.css',
'tablesort.css',
'tabs.css',
'textarea.css',
'ui-dialog.css',
],
'js' => [
'media_embed_ckeditor.theme.es6.js',
'media_embed_ckeditor.theme.js',
],
'images' => [
'application-octet-stream.png',
'application-pdf.png',
'application-x-executable.png',
'audio-x-generic.png',
'forum-icons.png',
'image-x-generic.png',
'package-x-generic.png',
'text-html.png',
'text-plain.png',
'text-x-generic.png',
'text-x-script.png',
'video-x-generic.png',
'x-office-document.png',
'x-office-presentation.png',
'x-office-spreadsheet.png',
],
'templates' => [
'filter-guidelines.html.twig',
'filter-tips.html.twig',
'file-managed-file.html.twig',
'text-format-wrapper.html.twig',
'filter-caption.html.twig',
'rdf-metadata.html.twig',
'help-section.html.twig',
'progress-bar.html.twig',
'status-messages.html.twig',
'form-element-label.html.twig',
'datetime-wrapper.html.twig',
'fieldset.html.twig',
'datetime-form.html.twig',
'textarea.html.twig',
'form-element.html.twig',
'radios.html.twig',
'item-list.html.twig',
'aggregator-feed.html.twig',
'item-list--search-results.html.twig',
'table.html.twig',
'forum-list.html.twig',
'forum-icon.html.twig',
'forums.html.twig',
'book-export-html.html.twig',
'html.html.twig',
'region.html.twig',
'menu.html.twig',
'book-all-books-block.html.twig',
'book-tree.html.twig',
'menu-local-task.html.twig',
'book-navigation.html.twig',
'breadcrumb.html.twig',
'toolbar.html.twig',
'comment.html.twig',
'node.html.twig',
'taxonomy-term.html.twig',
'media-embed-error.html.twig',
'book-node-export-html.html.twig',
'links--node.html.twig',
'page-title.html.twig',
'search-result.html.twig',
'aggregator-item.html.twig',
'media.html.twig',
'mark.html.twig',
'forum-submitted.html.twig',
'username.html.twig',
'user.html.twig',
'time.html.twig',
'image.html.twig',
'field--text.html.twig',
'field--text-long.html.twig',
'file-audio.html.twig',
'field--comment.html.twig',
'link-formatter-link-separate.html.twig',
'field.html.twig',
'field--text-with-summary.html.twig',
'field--node--uid.html.twig',
'field--node--title.html.twig',
'field--node--created.html.twig',
'file-video.html.twig',
'links--media-library-menu.html.twig',
'media--media-library.html.twig',
'container--media-library-content.html.twig',
'media-library-item--small.html.twig',
'container--media-library-widget-selection.html.twig',
'media-library-wrapper.html.twig',
'media-library-item.html.twig',
'views-mini-pager.html.twig',
'views-exposed-form.html.twig',
'views-view-grouping.html.twig',
'views-view-summary.html.twig',
'views-view-table.html.twig',
'views-view-row-rss.html.twig',
'views-view-summary-unformatted.html.twig',
'views-view.html.twig',
'block--system-branding-block.html.twig',
'block--search-form-block.html.twig',
'block.html.twig',
'block--system-menu-block.html.twig',
'block--local-tasks-block.html.twig',
],
],
],
// Will be populated when Classy libraries are copied to Bartik.
'bartik' => [
'theme-name' => 'bartik',
'path-replace' => '../../../../../',
'filenames' => [
'css' => [
'media-library.css',
'action-links.css',
'file.css',
'dropbutton.css',
'book-navigation.css',
'tableselect.css',
'ui-dialog.css',
'item-list.css',
'field.css',
'tablesort.css',
'tabs.css',
'forum.css',
'progress.css',
'collapse-processed.css',
'details.css',
'inline-form.css',
'link.css',
'textarea.css',
'links.css',
'form.css',
'exposed-filters.css',
'tabledrag.css',
'messages.css',
'pager.css',
'search-results.css',
'button.css',
'node.css',
'dialog.css',
'menu.css',
'icons.css',
'breadcrumb.css',
'media-embed-error.css',
'container-inline.css',
'more-link.css',
],
'js' => [
'media_embed_ckeditor.theme.es6.js',
'media_embed_ckeditor.theme.js',
],
'images' => [
'application-octet-stream.png',
'application-pdf.png',
'application-x-executable.png',
'audio-x-generic.png',
'forum-icons.png',
'image-x-generic.png',
'package-x-generic.png',
'text-html.png',
'text-plain.png',
'text-x-generic.png',
'text-x-script.png',
'video-x-generic.png',
'x-office-document.png',
'x-office-presentation.png',
'x-office-spreadsheet.png',
],
'templates' => [
'node-edit-form.html.twig',
'image-widget.html.twig',
'node-add-list.html.twig',
'filter-guidelines.html.twig',
'filter-tips.html.twig',
'file-managed-file.html.twig',
'text-format-wrapper.html.twig',
'filter-caption.html.twig',
'rdf-metadata.html.twig',
'help-section.html.twig',
'progress-bar.html.twig',
'form-element-label.html.twig',
'datetime-wrapper.html.twig',
'fieldset.html.twig',
'datetime-form.html.twig',
'textarea.html.twig',
'details.html.twig',
'form-element.html.twig',
'radios.html.twig',
'item-list.html.twig',
'aggregator-feed.html.twig',
'item-list--search-results.html.twig',
'table.html.twig',
'forum-list.html.twig',
'forum-icon.html.twig',
'forums.html.twig',
'book-export-html.html.twig',
'html.html.twig',
'region.html.twig',
'menu.html.twig',
'book-all-books-block.html.twig',
'book-tree.html.twig',
'menu-local-task.html.twig',
'book-navigation.html.twig',
'breadcrumb.html.twig',
'toolbar.html.twig',
'menu-local-tasks.html.twig',
'taxonomy-term.html.twig',
'media-embed-error.html.twig',
'book-node-export-html.html.twig',
'links--node.html.twig',
'search-result.html.twig',
'aggregator-item.html.twig',
'media.html.twig',
'mark.html.twig',
'forum-submitted.html.twig',
'username.html.twig',
'user.html.twig',
'time.html.twig',
'image.html.twig',
'field--text.html.twig',
'field--text-long.html.twig',
'file-audio.html.twig',
'field--comment.html.twig',
'link-formatter-link-separate.html.twig',
'field.html.twig',
'field--text-with-summary.html.twig',
'field--node--uid.html.twig',
'field--node--title.html.twig',
'field--node--created.html.twig',
'file-video.html.twig',
'links--media-library-menu.html.twig',
'media--media-library.html.twig',
'views-view-unformatted--media-library.html.twig',
'container--media-library-content.html.twig',
'media-library-item--small.html.twig',
'container--media-library-widget-selection.html.twig',
'media-library-wrapper.html.twig',
'media-library-item.html.twig',
'views-mini-pager.html.twig',
'views-exposed-form.html.twig',
'views-view-grouping.html.twig',
'views-view-summary.html.twig',
'views-view-table.html.twig',
'views-view-row-rss.html.twig',
'views-view-summary-unformatted.html.twig',
'views-view.html.twig',
'block--local-actions-block.html.twig',
'block--local-tasks-block.html.twig',
],
],
],
];
}
/**
* Gets the hash of a Classy asset.
*
* @param string $type
* The asset type.
* @param string $file
* The asset filename.
*
* @return string
* A hash for the file.
*/
protected function getClassyHash($type, $file) {
static $hashes = [
'css' => [
'action-links.css' => '6abb88c2b3b6884c1a64fa5ca4853d45',
'book-navigation.css' => 'e8219368d360bd4a10763610ada85a1c',
'breadcrumb.css' => '14268f8071dffd40ce7a39862b8fbc56',
'button.css' => '3abebf58e144fd4150d80facdbe5d10f',
'collapse-processed.css' => 'e928df55485662a4499c9ba12def22e6',
'container-inline.css' => 'ae9caee6071b319ac97bf0bb3e14b542',
'details.css' => 'fdd0606ea856072f5e6a19ab1a2e850e',
'dialog.css' => 'f30e4423380f5f01d02ef0a93e010c53',
'dropbutton.css' => 'f8e4b0b81ff60206b27f622e85a6a0ee',
'exposed-filters.css' => '396a5f76dafec5f78f4e736f69a0874f',
'field.css' => '8f4718bc926eea7e007ecfd6f410ee8d',
'file.css' => '7f36f62ca67c57a82f9d9e882918a01b',
'form.css' => 'a8733b00eebffbc3293779cb779c808e',
'forum.css' => '8aad2d86dfd29818e991757581cd7ab8',
'icons.css' => '56f623bd343b9bc7e7ac3e3e95d7f3ce',
'image-widget.css' => '2da54829199f64a2c390930c3b0913a3',
'indented.css' => '3f7be76cf4b5df7dca1c96a28c76b134',
'inline-form.css' => 'cc5cbfd34511d9021a53ec693c110740',
'item-list.css' => '1d519afe6007f4b01e00f22b0ba8bf33',
'link.css' => '22f42d430fe458080a7739c70a2d2ea5',
'links.css' => '21fe64349f5702cd5b89104a1d3b9cd3',
'media-embed-error.css' => 'ab7f4c91f7b312122d30d7e09bb1bcc4',
'media-library.css' => 'bb405519d30970c721405452dfb7b38e',
'menu.css' => 'c4608b4ac9aafce1f6e0d21c6e6e6ee8',
'messages.css' => '2930ea9bebf4d1658e9bdc3b1f83bd43',
'more-link.css' => 'b2ebfb826e035334340193b42246b180',
'node.css' => '81ea0a3fef211dbc32549ac7f39ec646',
'pager.css' => 'd10589366720f9c15b66df434baab4da',
'progress.css' => '5147a9b07ede9f456c6a3f3efeb520e1',
'search-results.css' => 'ce3ca8fcd54e72f142ba29da5a3a5c9a',
'tabledrag.css' => '98d24ff864c7699dfa6da9190c5e70df',
'tableselect.css' => '8e966ac85a0cc60f470717410640c8fe',
'tablesort.css' => 'f6ed3b44832bebffa09fc3b4b6ce27ab',
'tabs.css' => 'e58827db5c767c41b67488244c14056c',
'textarea.css' => '2bc390c137c5205bbcd7645d6c1c86de',
'ui-dialog.css' => '4a3d036007ba8c8c80f4a21a369c72cc',
'user.css' => '0ec6acc22567a7c9c228f04b5a97c711',
],
'js' => [
'media_embed_ckeditor.theme.es6.js' => 'd9fa9e008aff8d4fb0401083bab0a1ad',
'media_embed_ckeditor.theme.js' => '8abd200fde0284ff70026eb7cc8e412c',
],
'images' => [
'application-octet-stream.png' => 'fef73511632890590b5ae0a13c99e4bf',
'application-pdf.png' => 'bb41f8b679b9d93323b30c87fde14de9',
'application-x-executable.png' => 'fef73511632890590b5ae0a13c99e4bf',
'audio-x-generic.png' => 'f7d0e6fbcde58594bd1102db95e3ea7b',
'forum-icons.png' => 'dfa091b192819cc14523ccd653e7b5ff',
'image-x-generic.png' => '9aca2e02c3cdbb391ca721d40fa4c0c6',
'package-x-generic.png' => 'bb8581301a2030b48ff3c67374eed88a',
'text-html.png' => '9d2d3003a786ab392d42744b2d064eec',
'text-plain.png' => '1b769df473f54d6f78f7aba79ec25e12',
'text-x-generic.png' => '1b769df473f54d6f78f7aba79ec25e12',
'text-x-script.png' => 'f9dc156d35298536011ea48226b21682',
'video-x-generic.png' => 'a5dc89b884a8a1b666c15bb41fd88ee9',
'x-office-document.png' => '48e0c92b5dec1a027f43a5c6fe190f39',
'x-office-presentation.png' => '8ba9f51c97a2b47de2c8c117aafd7dcd',
'x-office-spreadsheet.png' => 'fc5d4b32f259ea6d0f960b17a0886f63',
],
'templates' => [
'node-edit-form.html.twig' => '62333c862703b199fe339677ce6783ac',
'file-widget-multiple.html.twig' => '93425e782dabe54b88b1516dc681f9ce',
'image-widget.html.twig' => '03d1151c7e99999174a0113d21375372',
'file-upload-help.html.twig' => 'd8fcf1f79c4eff6c89539c17d03c4731',
'node-add-list.html.twig' => '43cef03ea415399b8e51e2e363479702',
'filter-guidelines.html.twig' => '250f9abf18cfc45f174d994dc505585b',
'filter-tips.html.twig' => 'fefcab317b602cbfe7f608bc481be889',
'file-managed-file.html.twig' => 'ee735232c3d782f09178bc56df8f89b1',
'text-format-wrapper.html.twig' => '9b9f43cee239648f0c6966c68fc4d72e',
'filter-caption.html.twig' => '7cc9ce9634332604bd3a565af2ef0cd5',
'rdf-metadata.html.twig' => 'ebf2c20050b6a89b04168ce66d0a55dc',
'help-section.html.twig' => '4f98fbb266cf9069a4604049c848a4c2',
'progress-bar.html.twig' => 'ad07ee846d10bb46eb71d4c81d5bce75',
'status-messages.html.twig' => '5c8403daec6d92b35407a893c04a6a36',
'container.html.twig' => 'd88ec99c466a11fa9b83e3594675cc9a',
'input.html.twig' => 'b844ef5f74df3058bd6ff9ec024d907b',
'form-element-label.html.twig' => '21026361fa9ba15ccdc823d6bb00a6d9',
'datetime-wrapper.html.twig' => '765aa519f7e4ae36ee4726ae2633de6d',
'fieldset.html.twig' => '5900e42f5ee2574a3d002d19771bd764',
'form.html.twig' => '0767ff441543553d51443b970c4b736b',
'datetime-form.html.twig' => '649c36a2900c556b8a1385c1fa755281',
'checkboxes.html.twig' => 'a5faa5fdd7de4aa42045753db65ffb0b',
'textarea.html.twig' => '4a583e6afa9c04ed6a7b2a36ba172f16',
'field-multiple-value-form.html.twig' => '152e4e8b944d093742f5a1c3ce65b28b',
'dropbutton-wrapper.html.twig' => 'ed30bb07a6a5ac007f985b935d8a07a9',
'details.html.twig' => 'ac7d9de69428a0a04933775d1cfd78c6',
'select.html.twig' => '4dd8e366a76518187462930e1fe487ae',
'form-element.html.twig' => '0dbef99d7eb04f81f38af1dd5c0954a0',
'confirm-form.html.twig' => '12f6086c3742ef59e1b25b0cadc1f890',
'radios.html.twig' => 'd938c3dd61fc99b79cf4f07ad673ee83',
'item-list.html.twig' => '869d9d6a7c79844b69e88a622eb1e4b1',
'aggregator-feed.html.twig' => 'b9c4dc3b384bca32041edf63c598e197',
'item-list--search-results.html.twig' => 'fe10f094b0caff314d63842bd332cfb3',
'table.html.twig' => '8a3c6dc67452ec6372d56cfb496c711d',
'forum-list.html.twig' => '1e1d16f6359350f08c531260d3919149',
'forum-icon.html.twig' => 'ad4bb2036adf04888e0bf82dfd93890e',
'forums.html.twig' => '0a46228fa1f90089dfc67e7fe4c6690b',
'page.html.twig' => '14210892625e61cb8570cda6a3a932ce',
'maintenance-page.html.twig' => '627dd51c95d2930844c584a385eff3c5',
'book-export-html.html.twig' => 'd09aadf9e8e05d50145872f86544d0d0',
'html.html.twig' => '7bc0366efb52d727aa6fb48d4d3d75fb',
'region.html.twig' => 'b1c621b93e5ab7334151fe31d4c163a8',
'menu.html.twig' => 'a85f0d836f62a4a2834934b15b5cc4f3',
'book-all-books-block.html.twig' => '7210413d32aafa0c5413f1c29b9a87cc',
'book-tree.html.twig' => '027a2d9aa9d8e13afeb87b2f830f4339',
'links.html.twig' => '158ded06d80f3071b051a3263d9bdeac',
'vertical-tabs.html.twig' => 'cccdb9b454f5befdfedfc629a6a51e4d',
'pager.html.twig' => '3ad3ad68fa70d7f6b69676d1e28b0338',
'menu-local-task.html.twig' => 'eb20b3b773365137893f25e31a9768e3',
'book-navigation.html.twig' => '6ecc18ab554936f9e3b4cadd92a94d66',
'breadcrumb.html.twig' => '3de826e26e00fbe1a661b1f64d4c45d0',
'menu-local-action.html.twig' => 'ff1dfb632b6235a304146aaeaa49c3ca',
'toolbar.html.twig' => '151657ffe8fc7c8f0d9571a8b0684294',
'menu-local-tasks.html.twig' => '1e0112bb83f6073f6fc44a94b43dd74b',
'comment.html.twig' => '271cebfb1c64860e0e392df3a6787ca2',
'node.html.twig' => '68ce2322607c5a258bd64cb78f49b0e0',
'taxonomy-term.html.twig' => '63e39620cd877c85297914fef61930de',
'media-embed-error.html.twig' => '83621141a91e525cd4df15c1d93b58b2',
'book-node-export-html.html.twig' => 'e3f896d5f4f69c28256807fb57382eb5',
'links--node.html.twig' => '746362f23d45654540368b963e6b9feb',
'page-title.html.twig' => '73e9f3f4933b1a1b789db6e4a6556355',
'search-result.html.twig' => '5676e5f62d82fcb1a2588da2197d1455',
'aggregator-item.html.twig' => '5d1d474391f1f1cce4731b5b33e04df4',
'media.html.twig' => 'ba8a5c1035a7d9f958d6bb16ea862a74',
'mark.html.twig' => '8a162708ce2ca9c3fc272daf4a92897e',
'forum-submitted.html.twig' => '9566e863a16db23a76ec3e289e16fa47',
'username.html.twig' => '92ebba7253772a4389c76c27f7d2b0f0',
'user.html.twig' => 'b265def674626cf35ac46f1bbad3e28f',
'time.html.twig' => '74a5bbb48d3bce23ccab80993e1d04c1',
'image.html.twig' => 'b8dd5d5b7e1bf594f85411f28eb29440',
'field--text.html.twig' => '4cb76e10e41ccf0b7cf350be600853c5',
'field--text-long.html.twig' => '898425e3da212ed81ff01c7b624033fd',
'file-audio.html.twig' => '2dec3e01acc93858bdad64ccac1d0fc1',
'field--comment.html.twig' => 'c116dc85a39418301a676b9138a8d697',
'link-formatter-link-separate.html.twig' => '944fe3b95472c411013da977d446f843',
'field.html.twig' => '4da82841bf83d728ed2f3757de7402fb',
'file-link.html.twig' => '0f10f3e79ecb9b6e82ef30c66e4ebcc6',
'field--text-with-summary.html.twig' => '898425e3da212ed81ff01c7b624033fd',
'field--node--uid.html.twig' => 'd8b6b27f106d1494dca27efe7bf76c59',
'field--node--title.html.twig' => '8b1830816fb75a0025965b5eb09c24c6',
'image-style.html.twig' => '6d2588a4453ed014601f66cd45baf00f',
'field--node--created.html.twig' => 'e597e1c783d32862b85720ab08049339',
'image-formatter.html.twig' => '9bc966dd2fe1a913cd7a89fbd243d947',
'file-video.html.twig' => '9f58b817bf059a86300d2757c76f0d97',
'links--media-library-menu.html.twig' => '31f4f0f507af5dde490e9a992fa89db6',
'media--media-library.html.twig' => '72a2af7f2f0ac3013f0a20f887e4d48a',
'views-view-unformatted--media-library.html.twig' => '4071005d8fac358614742983d77940a2',
'container--media-library-content.html.twig' => 'dede085892e5039aefb3c2cc2dc2074b',
'media-library-item--small.html.twig' => 'e45cfe56961b3419feb8008a5abb7357',
'container--media-library-widget-selection.html.twig' => '70759ddf4d23f5cdd7ef62f3d3e0eda0',
'media-library-wrapper.html.twig' => 'acd6cc6ac1bc47ad8085612294b1c369',
'media-library-item.html.twig' => '278c18d4f6ec1651a408a1fce3ec70a5',
'views-mini-pager.html.twig' => '92f8935c78df8c61ba1bb03c34e305a8',
'views-view-row-opml.html.twig' => 'defbd7edeff60ebb16a06414ef13db06',
'views-exposed-form.html.twig' => 'd88119f917c62e0caa75ca0becc8c327',
'views-view-grouping.html.twig' => 'e766e383b51511b86fc0815c94167c18',
'views-view-summary.html.twig' => '38639cb9e815e387782b126cb613bb40',
'views-view-table.html.twig' => '206e53d257651ea8b0eead68888878c0',
'views-view-list.html.twig' => '7480144ffa90384ad2c3162f03ad042f',
'views-view-unformatted.html.twig' => 'b2faf1bd77678dba68e1e6bb05c3a219',
'views-view-row-rss.html.twig' => '0721785e0471ca23bbed6358dde0df68',
'views-view-mapping-test.html.twig' => '818431786e1d19df33cecccad98d5a22',
'views-view-opml.html.twig' => '4ab17668908dcd4af75d35f891f97fff',
'views-view-summary-unformatted.html.twig' => '76f6e5882aa7fe6bc0440b66e85a0a6c',
'views-view.html.twig' => '6e823aff4c9a83fa2f426510a90e8f7d',
'views-view-grid.html.twig' => '8f4ea66bf949530d31a79a44f3d87650',
'views-view-rss.html.twig' => 'f4e49d0d8df01019245c51ff2a4259c2',
'block--system-branding-block.html.twig' => '558d83af4c06e78f46790e0e18295588',
'block--search-form-block.html.twig' => '4e9d433b954dcea12b307f9edcbbe764',
'block.html.twig' => 'c1bce6c31368c08f6f93c687e872f055',
'block--local-actions-block.html.twig' => '6afe8adb14d3f37ec374400fecd5b809',
'block--system-menu-block.html.twig' => '084931fef1422cf11a38170702677b0f',
'block--local-tasks-block.html.twig' => 'd462897ef5c9b6935ce801de122bce30',
],
];
$this->assertArrayHasKey($type, $hashes);
$this->assertArrayHasKey($file, $hashes[$type]);
return $hashes[$type][$file];
}
}
Members
Title Sort descending | Deprecated | Modifiers | Object type | Summary | Overriden Title | Overrides |
---|---|---|---|---|---|---|
AssertContentTrait::$content | protected | property | The current raw content. | |||
AssertContentTrait::$drupalSettings | protected | property | The drupalSettings value from the current raw $content. | |||
AssertContentTrait::$elements | protected | property | The XML structure parsed from the current raw $content. | 1 | ||
AssertContentTrait::$plainTextContent | protected | property | The plain-text content of raw $content (text nodes). | |||
AssertContentTrait::assertEscaped | protected | function | Passes if the raw text IS found escaped on the loaded page, fail otherwise. | |||
AssertContentTrait::assertField | protected | function | Asserts that a field exists with the given name or ID. | |||
AssertContentTrait::assertFieldById | protected | function | Asserts that a field exists with the given ID and value. | |||
AssertContentTrait::assertFieldByName | protected | function | Asserts that a field exists with the given name and value. | |||
AssertContentTrait::assertFieldByXPath | protected | function | Asserts that a field exists in the current page by the given XPath. | |||
AssertContentTrait::assertFieldChecked | protected | function | Asserts that a checkbox field in the current page is checked. | |||
AssertContentTrait::assertFieldsByValue | protected | function | Asserts that a field exists in the current page with a given Xpath result. | |||
AssertContentTrait::assertLink | protected | function | Passes if a link with the specified label is found. | |||
AssertContentTrait::assertLinkByHref | protected | function | Passes if a link containing a given href (part) is found. | |||
AssertContentTrait::assertNoDuplicateIds | protected | function | Asserts that each HTML ID is used for just a single element. | |||
AssertContentTrait::assertNoEscaped | protected | function | Passes if raw text IS NOT found escaped on loaded page, fail otherwise. | |||
AssertContentTrait::assertNoField | protected | function | Asserts that a field does not exist with the given name or ID. | |||
AssertContentTrait::assertNoFieldById | protected | function | Asserts that a field does not exist with the given ID and value. | |||
AssertContentTrait::assertNoFieldByName | protected | function | Asserts that a field does not exist with the given name and value. | |||
AssertContentTrait::assertNoFieldByXPath | protected | function | Asserts that a field does not exist or its value does not match, by XPath. | |||
AssertContentTrait::assertNoFieldChecked | protected | function | Asserts that a checkbox field in the current page is not checked. | |||
AssertContentTrait::assertNoLink | protected | function | Passes if a link with the specified label is not found. | |||
AssertContentTrait::assertNoLinkByHref | protected | function | Passes if a link containing a given href (part) is not found. | |||
AssertContentTrait::assertNoLinkByHrefInMainRegion | protected | function | Passes if a link containing a given href is not found in the main region. | |||
AssertContentTrait::assertNoOption | protected | function | Asserts that a select option in the current page does not exist. | |||
AssertContentTrait::assertNoOptionSelected | protected | function | Asserts that a select option in the current page is not checked. | |||
AssertContentTrait::assertNoPattern | protected | function | Triggers a pass if the perl regex pattern is not found in raw content. | |||
AssertContentTrait::assertNoRaw | protected | function | Passes if the raw text is NOT found on the loaded page, fail otherwise. | |||
AssertContentTrait::assertNoText | protected | function | Passes if the page (with HTML stripped) does not contains the text. | |||
AssertContentTrait::assertNoTitle | protected | function | Pass if the page title is not the given string. | |||
AssertContentTrait::assertNoUniqueText | protected | function | Passes if the text is found MORE THAN ONCE on the text version of the page. | |||
AssertContentTrait::assertOption | protected | function | Asserts that a select option in the current page exists. | |||
AssertContentTrait::assertOptionByText | protected | function | Asserts that a select option with the visible text exists. | |||
AssertContentTrait::assertOptionSelected | protected | function | Asserts that a select option in the current page is checked. | |||
AssertContentTrait::assertOptionSelectedWithDrupalSelector | protected | function | Asserts that a select option in the current page is checked. | |||
AssertContentTrait::assertOptionWithDrupalSelector | protected | function | Asserts that a select option in the current page exists. | |||
AssertContentTrait::assertPattern | protected | function | Triggers a pass if the Perl regex pattern is found in the raw content. | |||
AssertContentTrait::assertRaw | protected | function | Passes if the raw text IS found on the loaded page, fail otherwise. | |||
AssertContentTrait::assertText | protected | function | Passes if the page (with HTML stripped) contains the text. | |||
AssertContentTrait::assertTextHelper | protected | function | Helper for assertText and assertNoText. | |||
AssertContentTrait::assertTextPattern | protected | function | Asserts that a Perl regex pattern is found in the plain-text content. | |||
AssertContentTrait::assertThemeOutput | protected | function | Asserts themed output. | |||
AssertContentTrait::assertTitle | protected | function | Pass if the page title is the given string. | |||
AssertContentTrait::assertUniqueText | protected | function | Passes if the text is found ONLY ONCE on the text version of the page. | |||
AssertContentTrait::assertUniqueTextHelper | protected | function | Helper for assertUniqueText and assertNoUniqueText. | |||
AssertContentTrait::buildXPathQuery | protected | function | Builds an XPath query. | |||
AssertContentTrait::constructFieldXpath | protected | function | Helper: Constructs an XPath for the given set of attributes and value. | |||
AssertContentTrait::cssSelect | protected | function | Searches elements using a CSS selector in the raw content. | |||
AssertContentTrait::getAllOptions | protected | function | Get all option elements, including nested options, in a select. | |||
AssertContentTrait::getDrupalSettings | protected | function | Gets the value of drupalSettings for the currently-loaded page. | |||
AssertContentTrait::getRawContent | protected | function | Gets the current raw content. | |||
AssertContentTrait::getSelectedItem | protected | function | Get the selected value from a select field. | |||
AssertContentTrait::getTextContent | protected | function | Retrieves the plain-text content from the current raw content. | |||
AssertContentTrait::getUrl | protected | function | Get the current URL from the cURL handler. | 1 | ||
AssertContentTrait::parse | protected | function | Parse content returned from curlExec using DOM and SimpleXML. | |||
AssertContentTrait::removeWhiteSpace | protected | function | Removes all white-space between HTML tags from the raw content. | |||
AssertContentTrait::setDrupalSettings | protected | function | Sets the value of drupalSettings for the currently-loaded page. | |||
AssertContentTrait::setRawContent | protected | function | Sets the raw content (e.g. HTML). | |||
AssertContentTrait::xpath | protected | function | Performs an xpath search on the contents of the internal browser. | |||
AssertLegacyTrait::assert | Deprecated | protected | function | |||
AssertLegacyTrait::assertEqual | Deprecated | protected | function | |||
AssertLegacyTrait::assertIdentical | Deprecated | protected | function | |||
AssertLegacyTrait::assertIdenticalObject | Deprecated | protected | function | |||
AssertLegacyTrait::assertNotEqual | Deprecated | protected | function | |||
AssertLegacyTrait::assertNotIdentical | Deprecated | protected | function | |||
AssertLegacyTrait::pass | Deprecated | protected | function | |||
AssertLegacyTrait::verbose | Deprecated | protected | function | |||
ConfigTestTrait::configImporter | protected | function | Returns a ConfigImporter object to import test configuration. | |||
ConfigTestTrait::copyConfig | protected | function | Copies configuration objects from source storage to target storage. | |||
ConfirmClassyCopiesTest::getClassyHash | protected | function | Gets the hash of a Classy asset. | |||
ConfirmClassyCopiesTest::providerTestClassyCopies | public | function | Provides lists of filenames for a theme's asset files copied from Classy. | |||
ConfirmClassyCopiesTest::testClassyCopies | public | function | Confirms that files copied from Classy have not been altered. | |||
ConfirmClassyCopiesTest::testClassyHashes | public | function | Tests Classy's assets have not been altered. | |||
ExtensionListTestTrait::getModulePath | protected | function | Gets the path for the specified module. | |||
ExtensionListTestTrait::getThemePath | protected | function | Gets the path for the specified theme. | |||
KernelTestBase::$backupGlobals | protected | property | Back up and restore any global variables that may be changed by tests. | |||
KernelTestBase::$backupStaticAttributes | protected | property | Back up and restore static class properties that may be changed by tests. | |||
KernelTestBase::$backupStaticAttributesBlacklist | protected | property | Contains a few static class properties for performance. | |||
KernelTestBase::$classLoader | protected | property | ||||
KernelTestBase::$configImporter | protected | property | @todo Move into Config test base class. | 6 | ||
KernelTestBase::$configSchemaCheckerExclusions | protected static | property | An array of config object names that are excluded from schema checking. | |||
KernelTestBase::$container | protected | property | ||||
KernelTestBase::$databasePrefix | protected | property | ||||
KernelTestBase::$keyValue | protected | property | The key_value service that must persist between container rebuilds. | |||
KernelTestBase::$modules | protected static | property | Modules to enable. | 487 | ||
KernelTestBase::$preserveGlobalState | protected | property | Do not forward any global state from the parent process to the processes that run the actual tests. |
|||
KernelTestBase::$root | protected | property | The app root. | |||
KernelTestBase::$runTestInSeparateProcess | protected | property | Kernel tests are run in separate processes because they allow autoloading of code from extensions. Running the test in a separate process isolates this behavior from other tests. Subclasses should not override this property. |
|||
KernelTestBase::$siteDirectory | protected | property | ||||
KernelTestBase::$strictConfigSchema | protected | property | Set to TRUE to strict check all configuration saved. | 7 | ||
KernelTestBase::$vfsRoot | protected | property | The virtual filesystem root directory. | |||
KernelTestBase::assertPostConditions | protected | function | 1 | |||
KernelTestBase::bootEnvironment | protected | function | Bootstraps a basic test environment. | |||
KernelTestBase::bootKernel | private | function | Bootstraps a kernel for a test. | |||
KernelTestBase::config | protected | function | Configuration accessor for tests. Returns non-overridden configuration. | |||
KernelTestBase::disableModules | protected | function | Disables modules for this test. | |||
KernelTestBase::enableModules | protected | function | Enables modules for this test. | |||
KernelTestBase::getConfigSchemaExclusions | protected | function | Gets the config schema exclusions for this test. | |||
KernelTestBase::getDatabaseConnectionInfo | protected | function | Returns the Database connection info to be used for this test. | 3 | ||
KernelTestBase::getDatabasePrefix | public | function | ||||
KernelTestBase::getExtensionsForModules | private | function | Returns Extension objects for $modules to enable. | |||
KernelTestBase::getModulesToEnable | private static | function | Returns the modules to enable for this test. | |||
KernelTestBase::initFileCache | protected | function | Initializes the FileCache component. | |||
KernelTestBase::installConfig | protected | function | Installs default configuration for a given list of modules. | |||
KernelTestBase::installEntitySchema | protected | function | Installs the storage schema for a specific entity type. | |||
KernelTestBase::installSchema | protected | function | Installs database tables from a module schema definition. | |||
KernelTestBase::register | public | function | Registers test-specific services. | Overrides ServiceProviderInterface::register | 26 | |
KernelTestBase::render | protected | function | Renders a render array. | 1 | ||
KernelTestBase::setInstallProfile | protected | function | Sets the install profile and rebuilds the container to update it. | |||
KernelTestBase::setSetting | protected | function | Sets an in-memory Settings variable. | |||
KernelTestBase::setUp | protected | function | 353 | |||
KernelTestBase::setUpBeforeClass | public static | function | 1 | |||
KernelTestBase::setUpFilesystem | protected | function | Sets up the filesystem, so things like the file directory. | 3 | ||
KernelTestBase::stop | protected | function | Stops test execution. | |||
KernelTestBase::tearDown | protected | function | 5 | |||
KernelTestBase::tearDownCloseDatabaseConnection | public | function | @after | |||
KernelTestBase::vfsDump | protected | function | Dumps the current state of the virtual filesystem to STDOUT. | |||
KernelTestBase::__sleep | public | function | Prevents serializing any properties. | |||
PhpUnitWarnings::$deprecationWarnings | private static | property | Deprecation warnings from PHPUnit to raise with @trigger_error(). | |||
PhpUnitWarnings::addWarning | public | function | Converts PHPUnit deprecation warnings to E_USER_DEPRECATED. | |||
RandomGeneratorTrait::$randomGenerator | protected | property | The random generator. | |||
RandomGeneratorTrait::getRandomGenerator | protected | function | Gets the random generator for the utility methods. | |||
RandomGeneratorTrait::randomMachineName | protected | function | Generates a unique random string containing letters and numbers. | 1 | ||
RandomGeneratorTrait::randomObject | public | function | Generates a random PHP object. | |||
RandomGeneratorTrait::randomString | public | function | Generates a pseudo-random string of ASCII characters of codes 32 to 126. | |||
RandomGeneratorTrait::randomStringValidate | public | function | Callback for random string validation. | |||
StorageCopyTrait::replaceStorageContents | protected static | function | Copy the configuration from one storage to another and remove stale items. | |||
TestRequirementsTrait::checkModuleRequirements | private | function | Checks missing module requirements. | |||
TestRequirementsTrait::checkRequirements | protected | function | Check module requirements for the Drupal use case. | |||
TestRequirementsTrait::getDrupalRoot | protected static | function | Returns the Drupal root directory. |
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.