class ConfirmClassyCopiesTest

Same name in other branches
  1. 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

Expanded class hierarchy of ConfirmClassyCopiesTest

File

core/tests/Drupal/KernelTests/Core/Theme/ConfirmClassyCopiesTest.php, line 18

Namespace

Drupal\KernelTests\Core\Theme
View 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.