allThemes); $this->container->get('theme_installer')->install($this->allThemes); // Enable all core modules. $all_modules = system_rebuild_module_data(); $all_modules = array_filter($all_modules, function ($module) { // Filter contrib, hidden, already enabled modules and modules in the // Testing package. if ($module->origin !== 'core' || !empty($module->info['hidden']) || $module->status == TRUE || $module->info['package'] == 'Testing') { return FALSE; } return TRUE; }); $this->allModules = array_keys($all_modules); $this->allModules[] = 'system'; sort($this->allModules); $this->container->get('module_installer')->install($this->allModules); $this->themeHandler = $this->container->get('theme_handler'); $this->themeInitialization = $this->container->get('theme.initialization'); $this->themeManager = $this->container->get('theme.manager'); $this->libraryDiscovery = $this->container->get('library.discovery'); } /** * Ensures that all core module and theme library files exist. */ public function testCoreLibraryCompleteness() { // First verify all libraries with no active theme. $this->verifyLibraryFilesExist($this->getAllLibraries()); // Then verify all libraries for each core theme. This may seem like // overkill but themes can override and extend other extensions' libraries // and these changes are only applied for the active theme. foreach ($this->allThemes as $theme) { $this->themeManager->setActiveTheme($this->themeInitialization->getActiveThemeByName($theme)); $this->libraryDiscovery->clearCachedDefinitions(); $this->verifyLibraryFilesExist($this->getAllLibraries()); } } /** * Checks that all the library files exist. * * @param array[] $library_definitions * An array of library definitions, keyed by extension, then by library, and * so on. */ protected function verifyLibraryFilesExist($library_definitions) { $root = \Drupal::root(); foreach ($library_definitions as $extension => $libraries) { foreach ($libraries as $library_name => $library) { if (in_array("$extension/$library_name", $this->librariesToSkip)) { continue; } // Check that all the assets exist. foreach (['css', 'js'] as $asset_type) { foreach ($library[$asset_type] as $asset) { $file = $asset['data']; $path = $root . '/' . $file; // Only check and assert each file path once. if (!isset($this->pathsChecked[$path])) { $this->assertTrue(is_file($path), "$file file referenced from the $extension/$library_name library exists."); $this->pathsChecked[$path] = TRUE; } } } } } } /** * Gets all libraries for core and all installed modules. * * @return \Drupal\Core\Extension\Extension[] */ protected function getAllLibraries() { $modules = \Drupal::moduleHandler()->getModuleList(); $extensions = $modules; $module_list = array_keys($modules); sort($module_list); $this->assertEqual($this->allModules, $module_list, 'All core modules are installed.'); $themes = $this->themeHandler->listInfo(); $extensions += $themes; $theme_list = array_keys($themes); sort($theme_list); $this->assertEqual($this->allThemes, $theme_list, 'All core themes are installed.'); $libraries['core'] = $this->libraryDiscovery->getLibrariesByExtension('core'); $root = \Drupal::root(); foreach ($extensions as $extension_name => $extension) { $library_file = $extension->getPath() . '/' . $extension_name . '.libraries.yml'; if (is_file($root . '/' . $library_file)) { $libraries[$extension_name] = $this->libraryDiscovery->getLibrariesByExtension($extension_name); } } return $libraries; } }