View source
<?php
namespace Drupal\Tests\system\Functional\Theme;
use Drupal\Component\Utility\Xss;
use Drupal\Tests\BrowserTestBase;
class ThemeSuggestionsAlterTest extends BrowserTestBase {
protected static $modules = [
'theme_test',
];
protected $defaultTheme = 'stark';
protected function setUp() : void {
parent::setUp();
\Drupal::service('theme_installer')
->install([
'test_theme',
]);
}
public function testTemplateSuggestions() {
$this
->drupalGet('theme-test/suggestion-provided');
$this
->assertSession()
->pageTextContains('Template for testing suggestions provided by the module declaring the theme hook.');
$this
->config('system.theme')
->set('default', 'test_theme')
->save();
$this
->drupalGet('theme-test/suggestion-provided');
$this
->assertSession()
->pageTextContains('Template overridden based on suggestion provided by the module declaring the theme hook.');
}
public function testGeneralSuggestionsAlter() {
$this
->drupalGet('theme-test/general-suggestion-alter');
$this
->assertSession()
->pageTextContains('Original template for testing hook_theme_suggestions_alter().');
$this
->config('system.theme')
->set('default', 'test_theme')
->save();
$this
->drupalGet('theme-test/general-suggestion-alter');
$this
->assertSession()
->pageTextContains('Template overridden based on new theme suggestion provided by the test_theme theme via hook_theme_suggestions_alter().');
\Drupal::service('module_installer')
->install([
'theme_suggestions_test',
]);
$this
->resetAll();
$this
->drupalGet('theme-test/general-suggestion-alter');
$this
->assertSession()
->pageTextContains('Template overridden based on new theme suggestion provided by a module via hook_theme_suggestions_alter().');
}
public function testTemplateSuggestionsAlter() {
$this
->drupalGet('theme-test/suggestion-alter');
$this
->assertSession()
->pageTextContains('Original template for testing hook_theme_suggestions_HOOK_alter().');
$this
->config('system.theme')
->set('default', 'test_theme')
->save();
$this
->drupalGet('theme-test/suggestion-alter');
$this
->assertSession()
->pageTextContains('Template overridden based on new theme suggestion provided by the test_theme theme via hook_theme_suggestions_HOOK_alter().');
\Drupal::service('module_installer')
->install([
'theme_suggestions_test',
]);
$this
->resetAll();
$this
->drupalGet('theme-test/suggestion-alter');
$this
->assertSession()
->pageTextContains('Template overridden based on new theme suggestion provided by a module via hook_theme_suggestions_HOOK_alter().');
}
public function testSpecificSuggestionsAlter() {
$this
->drupalGet('theme-test/specific-suggestion-alter');
$this
->assertSession()
->pageTextContains('Template for testing specific theme calls.');
$this
->config('system.theme')
->set('default', 'test_theme')
->save();
$this
->drupalGet('theme-test/specific-suggestion-alter');
$this
->assertSession()
->pageTextContains('Template matching the specific theme call.');
$this
->assertSession()
->pageTextContains('theme_test_specific_suggestions__variant');
\Drupal::service('module_installer')
->install([
'theme_suggestions_test',
]);
$this
->resetAll();
$this
->drupalGet('theme-test/specific-suggestion-alter');
$this
->assertSession()
->pageTextContains('Template overridden based on suggestion alter hook determined by the base hook.');
$raw_content = $this
->getSession()
->getPage()
->getContent();
$this
->assertLessThan(strpos($raw_content, 'theme_test_specific_suggestions__variant__foo'), strpos($raw_content, 'theme_test_specific_suggestions__variant'));
}
public function testExecutionOrder() {
$this
->config('system.theme')
->set('default', 'test_theme')
->save();
\Drupal::service('module_installer')
->install([
'theme_suggestions_test',
]);
$this
->resetAll();
$this
->drupalGet('theme-test/suggestion-alter');
$expected_order = [
'theme_suggestions_test_theme_suggestions_alter() executed.',
'theme_suggestions_test_theme_suggestions_theme_test_suggestions_alter() executed.',
'theme_test_theme_suggestions_alter() executed for theme_test_suggestions.',
'theme_test_theme_suggestions_theme_test_suggestions_alter() executed.',
'test_theme_theme_suggestions_alter() executed.',
'test_theme_theme_suggestions_theme_test_suggestions_alter() executed.',
];
$content = preg_replace('/\\s+/', ' ', Xss::filter($this
->getSession()
->getPage()
->getContent(), []));
$order = 0;
foreach ($expected_order as $expected_string) {
$this
->assertGreaterThan($order, strpos($content, $expected_string));
$order = strpos($content, $expected_string);
}
}
}