Commit 9bc136d1 authored by webchick's avatar webchick
Browse files

Issue #2104123 by damiankloip: Consolidate test methods in MenuRouterTest.

parent 08816a98
......@@ -54,23 +54,33 @@ function setUp() {
// Enable dummy module that implements hook_menu.
parent::setUp();
// Explicitly set the default and admin themes.
$this->default_theme = 'bartik';
$this->admin_theme = 'seven';
$this->alternate_theme = 'stark';
theme_enable(array($this->default_theme));
\Drupal::config('system.theme')
->set('default', $this->default_theme)
->set('admin', $this->admin_theme)
->save();
theme_disable(array($this->alternate_theme));
$this->drupalPlaceBlock('system_menu_block:tools');
}
/**
* Tests menu integration.
*/
public function testMenuIntegration() {
$this->doTestTitleMenuCallback();
$this->doTestMenuSetItem();
$this->doTestMenuOptionalPlaceholders();
$this->doTestMenuOnRoute();
$this->doTestMenuHidden();
$this->doTestMenuGetItemNoAncestors();
$this->doTestMenuName();
$this->doTestMenuItemTitlesCases();
$this->doTestMenuLinkMaintain();
$this->doTestMenuLinkOptions();
$this->doTestMenuItemHooks();
$this->doTestDescriptionMenuItems();
$this->doTestHookMenuIntegration();
$this->doTestExoticPath();
}
/**
* Test local tasks with route placeholders.
*/
public function testHookMenuIntegration() {
protected function doTestHookMenuIntegration() {
// Generate base path with random argument.
$base_path = 'foo/' . $this->randomName(8);
$this->drupalGet($base_path);
......@@ -87,7 +97,7 @@ public function testHookMenuIntegration() {
/**
* Test title callback set to FALSE.
*/
function testTitleCallbackFalse() {
protected function doTestTitleCallbackFalse() {
$this->drupalGet('test-page');
$this->assertText('A title with @placeholder', 'Raw text found on the page');
$this->assertNoText(t('A title with @placeholder', array('@placeholder' => 'some other text')), 'Text with placeholder substitutions not found.');
......@@ -96,7 +106,7 @@ function testTitleCallbackFalse() {
/**
* Tests page title of MENU_CALLBACKs.
*/
function testTitleMenuCallback() {
protected function doTestTitleMenuCallback() {
// Verify that the menu router item title is not visible.
$this->drupalGet('');
$this->assertNoText(t('Menu Callback Title'));
......@@ -108,170 +118,17 @@ function testTitleMenuCallback() {
/**
* Tests menu item descriptions.
*/
function testDescriptionMenuItems() {
protected function doTestDescriptionMenuItems() {
// Verify that the menu router item title is output as page title.
$this->drupalGet('menu_callback_description');
$this->assertText(t('Menu item description text'));
$this->assertRaw(check_plain('<strong>Menu item description arguments</strong>'));
}
/**
* Test the theme callback when it is set to use an administrative theme.
*/
function testThemeCallbackAdministrative() {
theme_enable(array($this->admin_theme));
$this->drupalGet('menu-test/theme-callback/use-admin-theme');
$this->assertText('Custom theme: seven. Actual theme: seven.', 'The administrative theme can be correctly set in a theme callback.');
$this->assertRaw('seven/style.css', "The administrative theme's CSS appears on the page.");
}
/**
* Test that the theme callback is properly inherited.
*/
function testThemeCallbackInheritance() {
theme_enable(array($this->admin_theme));
$this->drupalGet('menu-test/theme-callback/use-admin-theme/inheritance');
$this->assertText('Custom theme: seven. Actual theme: seven. Theme callback inheritance is being tested.', 'Theme callback inheritance correctly uses the administrative theme.');
$this->assertRaw('seven/style.css', "The administrative theme's CSS appears on the page.");
}
/**
* Test path containing "exotic" characters.
*/
function testExoticPath() {
$path = "menu-test/ -._~!$'\"()*@[]?&+%#,;=:" . // "Special" ASCII characters.
"%23%25%26%2B%2F%3F" . // Characters that look like a percent-escaped string.
"éøïвβ中國書۞"; // Characters from various non-ASCII alphabets.
$this->drupalGet($path);
$this->assertRaw('This is menu_test_callback().');
}
/**
* Test the theme callback when the site is in maintenance mode.
*/
function testThemeCallbackMaintenanceMode() {
$this->container->get('state')->set('system.maintenance_mode', TRUE);
theme_enable(array($this->admin_theme));
// For a regular user, the fact that the site is in maintenance mode means
// we expect the theme callback system to be bypassed entirely.
$this->drupalGet('menu-test/theme-callback/use-admin-theme');
$this->assertRaw('bartik/css/style.css', "The maintenance theme's CSS appears on the page.");
// An administrator, however, should continue to see the requested theme.
$admin_user = $this->drupalCreateUser(array('access site in maintenance mode'));
$this->drupalLogin($admin_user);
$this->drupalGet('menu-test/theme-callback/use-admin-theme');
$this->assertText('Custom theme: seven. Actual theme: seven.', 'The theme callback system is correctly triggered for an administrator when the site is in maintenance mode.');
$this->assertRaw('seven/style.css', "The administrative theme's CSS appears on the page.");
$this->container->get('state')->set('system.maintenance_mode', FALSE);
}
/**
* Make sure the maintenance mode can be bypassed using an EventSubscriber.
*
* @see \Drupal\menu_test\EventSubscriber\MaintenanceModeSubscriber::onKernelRequestMaintenance().
*/
function testMaintenanceModeLoginPaths() {
$this->container->get('state')->set('system.maintenance_mode', TRUE);
$offline_message = t('@site is currently under maintenance. We should be back shortly. Thank you for your patience.', array('@site' => \Drupal::config('system.site')->get('name')));
$this->drupalGet('test-page');
$this->assertText($offline_message);
$this->drupalGet('menu_login_callback');
$this->assertText('This is TestControllers::testLogin.', 'Maintenance mode can be bypassed using an event subscriber.');
$this->container->get('state')->set('system.maintenance_mode', FALSE);
}
/**
* Test that an authenticated user hitting 'user/login' gets redirected to
* 'user' and 'user/register' gets redirected to the user edit page.
*/
function testAuthUserUserLogin() {
$web_user = $this->drupalCreateUser(array());
$this->drupalLogin($web_user);
$this->drupalGet('user/login');
// Check that we got to 'user'.
$this->assertTrue($this->url == url('user/' . $this->loggedInUser->id(), array('absolute' => TRUE)), "Logged-in user redirected to user on accessing user/login");
// user/register should redirect to user/UID/edit.
$this->drupalGet('user/register');
$this->assertTrue($this->url == url('user/' . $this->loggedInUser->id() . '/edit', array('absolute' => TRUE)), "Logged-in user redirected to user/UID/edit on accessing user/register");
}
/**
* Test the theme callback when it is set to use an optional theme.
*/
function testThemeCallbackOptionalTheme() {
// Request a theme that is not enabled.
$this->drupalGet('menu-test/theme-callback/use-stark-theme');
$this->assertText('Custom theme: NONE. Actual theme: bartik.', 'The theme callback system falls back on the default theme when a theme that is not enabled is requested.');
$this->assertRaw('bartik/css/style.css', "The default theme's CSS appears on the page.");
// Now enable the theme and request it again.
theme_enable(array($this->alternate_theme));
$this->drupalGet('menu-test/theme-callback/use-stark-theme');
$this->assertText('Custom theme: stark. Actual theme: stark.', 'The theme callback system uses an optional theme once it has been enabled.');
$this->assertRaw('stark/css/layout.css', "The optional theme's CSS appears on the page.");
}
/**
* Test the theme callback when it is set to use a theme that does not exist.
*/
function testThemeCallbackFakeTheme() {
$this->drupalGet('menu-test/theme-callback/use-fake-theme');
$this->assertText('Custom theme: NONE. Actual theme: bartik.', 'The theme callback system falls back on the default theme when a theme that does not exist is requested.');
$this->assertRaw('bartik/css/style.css', "The default theme's CSS appears on the page.");
}
/**
* Test the theme callback when no theme is requested.
*/
function testThemeCallbackNoThemeRequested() {
$this->drupalGet('menu-test/theme-callback/no-theme-requested');
$this->assertText('Custom theme: NONE. Actual theme: bartik.', 'The theme callback system falls back on the default theme when no theme is requested.');
$this->assertRaw('bartik/css/style.css', "The default theme's CSS appears on the page.");
}
/**
* Test that hook_custom_theme() can control the theme of a page.
*/
function testHookCustomTheme() {
// Trigger hook_custom_theme() to dynamically request the Stark theme for
// the requested page.
\Drupal::state()->set('menu_test.hook_custom_theme_name', $this->alternate_theme);
theme_enable(array($this->alternate_theme, $this->admin_theme));
// Visit a page that does not implement a theme callback. The above request
// should be honored.
$this->drupalGet('menu-test/no-theme-callback');
$this->assertText('Custom theme: stark. Actual theme: stark.', 'The result of hook_custom_theme() is used as the theme for the current page.');
$this->assertRaw('stark/css/layout.css', "The Stark theme's CSS appears on the page.");
}
/**
* Test that the theme callback wins out over hook_custom_theme().
*/
function testThemeCallbackHookCustomTheme() {
// Trigger hook_custom_theme() to dynamically request the Stark theme for
// the requested page.
\Drupal::state()->set('menu_test.hook_custom_theme_name', $this->alternate_theme);
theme_enable(array($this->alternate_theme, $this->admin_theme));
// The menu "theme callback" should take precedence over a value set in
// hook_custom_theme().
$this->drupalGet('menu-test/theme-callback/use-admin-theme');
$this->assertText('Custom theme: seven. Actual theme: seven.', 'The result of hook_custom_theme() does not override what was set in a theme callback.');
$this->assertRaw('seven/style.css', "The Seven theme's CSS appears on the page.");
}
/**
* Tests for menu_link_maintain().
*/
function testMenuLinkMaintain() {
protected function doTestMenuLinkMaintain() {
$admin_user = $this->drupalCreateUser(array('access content', 'administer site configuration'));
$this->drupalLogin($admin_user);
......@@ -317,7 +174,7 @@ function testMenuLinkMaintain() {
/**
* Tests for menu_name parameter for hook_menu().
*/
function testMenuName() {
protected function doTestMenuName() {
$admin_user = $this->drupalCreateUser(array('administer site configuration'));
$this->drupalLogin($admin_user);
......@@ -339,7 +196,7 @@ function testMenuName() {
/**
* Tests for menu hierarchy.
*/
function testMenuHierarchy() {
protected function doTestMenuHierarchy() {
$parent_links = entity_load_multiple_by_properties('menu_link', array('link_path' => 'menu-test/hierarchy/parent'));
$parent_link = reset($parent_links);
$child_links = entity_load_multiple_by_properties('menu_link', array('link_path' => 'menu-test/hierarchy/parent/child'));
......@@ -354,7 +211,7 @@ function testMenuHierarchy() {
/**
* Tests menu link depth and parents of local tasks and menu callbacks.
*/
function testMenuHidden() {
protected function doTestMenuHidden() {
// Verify links for one dynamic argument.
$query = \Drupal::entityQuery('menu_link')
->condition('router_path', 'menu-test/hidden/menu', 'STARTS_WITH')
......@@ -451,7 +308,7 @@ function testMenuHidden() {
/**
* Test menu_get_item() with empty ancestors.
*/
function testMenuGetItemNoAncestors() {
protected function doTestMenuGetItemNoAncestors() {
\Drupal::state()->set('menu.masks', array());
$this->drupalGet('');
}
......@@ -459,7 +316,7 @@ function testMenuGetItemNoAncestors() {
/**
* Test menu_set_item().
*/
function testMenuSetItem() {
protected function doTestMenuSetItem() {
$item = menu_get_item('test-page');
$this->assertEqual($item['path'], 'test-page', "Path from menu_get_item('test-page') is equal to 'test-page'", 'menu');
......@@ -476,7 +333,7 @@ function testMenuSetItem() {
/**
* Test menu maintenance hooks.
*/
function testMenuItemHooks() {
protected function doTestMenuItemHooks() {
// Create an item.
menu_link_maintain('menu_test', 'insert', 'menu_test_maintain/4', 'Menu link #4');
$this->assertEqual(menu_test_static_variable(), 'insert', 'hook_menu_link_insert() fired correctly');
......@@ -491,7 +348,7 @@ function testMenuItemHooks() {
/**
* Test menu link 'options' storage and rendering.
*/
function testMenuLinkOptions() {
protected function doTestMenuLinkOptions() {
// Create a menu link with options.
$menu_link = entity_create('menu_link', array(
'link_title' => 'Menu link options test',
......@@ -518,7 +375,7 @@ function testMenuLinkOptions() {
* Tests the possible ways to set the title for menu items.
* Also tests that menu item titles work with string overrides.
*/
function testMenuItemTitlesCases() {
protected function doTestMenuItemTitlesCases() {
// Build array with string overrides.
$test_data = array(
......@@ -540,7 +397,7 @@ function testMenuItemTitlesCases() {
* Get a URL and assert the title given a case number. If override is true,
* the title is asserted to begin with "Alternative".
*/
private function menuItemTitlesCasesHelper($case_no, $override = FALSE) {
protected function menuItemTitlesCasesHelper($case_no, $override = FALSE) {
$this->drupalGet('menu-title-test/case' . $case_no);
$this->assertResponse(200);
$asserted_title = $override ? 'Alternative example title - Case ' . $case_no : 'Example title - Case ' . $case_no;
......@@ -557,7 +414,7 @@ protected function menuLoadRouter($router_path) {
/**
* Test menu links that have optional placeholders.
*/
public function testMenuOptionalPlaceholders() {
protected function doTestMenuOptionalPlaceholders() {
$this->drupalGet('menu-test/optional');
$this->assertResponse(200);
$this->assertText('Sometimes there is no placeholder.');
......@@ -570,7 +427,7 @@ public function testMenuOptionalPlaceholders() {
/**
* Tests a menu on a router page.
*/
public function testMenuOnRoute() {
protected function doTestMenuOnRoute() {
\Drupal::moduleHandler()->install(array('router_test'));
\Drupal::service('router.builder')->rebuild();
......@@ -582,4 +439,201 @@ public function testMenuOnRoute() {
$this->assertLinkByHref('menu-title-test/case4');
}
/**
* Test path containing "exotic" characters.
*/
protected function doTestExoticPath() {
$path = "menu-test/ -._~!$'\"()*@[]?&+%#,;=:" . // "Special" ASCII characters.
"%23%25%26%2B%2F%3F" . // Characters that look like a percent-escaped string.
"éøïвβ中國書۞"; // Characters from various non-ASCII alphabets.
$this->drupalGet($path);
$this->assertRaw('This is menu_test_callback().');
}
/**
* Make sure the maintenance mode can be bypassed using an EventSubscriber.
*
* @see \Drupal\menu_test\EventSubscriber\MaintenanceModeSubscriber::onKernelRequestMaintenance().
*/
public function testMaintenanceModeLoginPaths() {
$this->container->get('state')->set('system.maintenance_mode', TRUE);
$offline_message = t('@site is currently under maintenance. We should be back shortly. Thank you for your patience.', array('@site' => \Drupal::config('system.site')->get('name')));
$this->drupalGet('test-page');
$this->assertText($offline_message);
$this->drupalGet('menu_login_callback');
$this->assertText('This is TestControllers::testLogin.', 'Maintenance mode can be bypassed using an event subscriber.');
$this->container->get('state')->set('system.maintenance_mode', FALSE);
}
/**
* Test that an authenticated user hitting 'user/login' gets redirected to
* 'user' and 'user/register' gets redirected to the user edit page.
*/
public function testAuthUserUserLogin() {
$web_user = $this->drupalCreateUser(array());
$this->drupalLogin($web_user);
$this->drupalGet('user/login');
// Check that we got to 'user'.
$this->assertTrue($this->url == url('user/' . $this->loggedInUser->id(), array('absolute' => TRUE)), "Logged-in user redirected to user on accessing user/login");
// user/register should redirect to user/UID/edit.
$this->drupalGet('user/register');
$this->assertTrue($this->url == url('user/' . $this->loggedInUser->id() . '/edit', array('absolute' => TRUE)), "Logged-in user redirected to user/UID/edit on accessing user/register");
}
/**
* Tests theme integration.
*/
public function testThemeIntegration() {
$this->initializeTestThemeConfiguration();
$this->doTestThemeCallbackMaintenanceMode();
$this->initializeTestThemeConfiguration();
$this->doTestThemeCallbackFakeTheme();
$this->initializeTestThemeConfiguration();
$this->doTestHookCustomTheme();
$this->initializeTestThemeConfiguration();
$this->doTestThemeCallbackHookCustomTheme();
$this->initializeTestThemeConfiguration();
$this->doTestThemeCallbackAdministrative();
$this->initializeTestThemeConfiguration();
$this->doTestThemeCallbackInheritance();
$this->initializeTestThemeConfiguration();
$this->doTestThemeCallbackNoThemeRequested();
$this->initializeTestThemeConfiguration();
$this->doTestThemeCallbackOptionalTheme();
}
/**
* Explicitly set the default and admin themes.
*/
protected function initializeTestThemeConfiguration() {
$this->default_theme = 'bartik';
$this->admin_theme = 'seven';
$this->alternate_theme = 'stark';
theme_enable(array($this->default_theme));
\Drupal::config('system.theme')
->set('default', $this->default_theme)
->set('admin', $this->admin_theme)
->save();
theme_disable(array($this->alternate_theme));
}
/**
* Test the theme callback when it is set to use an administrative theme.
*/
protected function doTestThemeCallbackAdministrative() {
theme_enable(array($this->admin_theme));
$this->drupalGet('menu-test/theme-callback/use-admin-theme');
$this->assertText('Custom theme: seven. Actual theme: seven.', 'The administrative theme can be correctly set in a theme callback.');
$this->assertRaw('seven/style.css', "The administrative theme's CSS appears on the page.");
}
/**
* Test that the theme callback is properly inherited.
*/
protected function doTestThemeCallbackInheritance() {
theme_enable(array($this->admin_theme));
$this->drupalGet('menu-test/theme-callback/use-admin-theme/inheritance');
$this->assertText('Custom theme: seven. Actual theme: seven. Theme callback inheritance is being tested.', 'Theme callback inheritance correctly uses the administrative theme.');
$this->assertRaw('seven/style.css', "The administrative theme's CSS appears on the page.");
}
/**
* Test the theme callback when the site is in maintenance mode.
*/
protected function doTestThemeCallbackMaintenanceMode() {
$this->container->get('state')->set('system.maintenance_mode', TRUE);
theme_enable(array($this->admin_theme));
// For a regular user, the fact that the site is in maintenance mode means
// we expect the theme callback system to be bypassed entirely.
$this->drupalGet('menu-test/theme-callback/use-admin-theme');
$this->assertRaw('bartik/css/style.css', "The maintenance theme's CSS appears on the page.");
// An administrator, however, should continue to see the requested theme.
$admin_user = $this->drupalCreateUser(array('access site in maintenance mode'));
$this->drupalLogin($admin_user);
$this->drupalGet('menu-test/theme-callback/use-admin-theme');
$this->assertText('Custom theme: seven. Actual theme: seven.', 'The theme callback system is correctly triggered for an administrator when the site is in maintenance mode.');
$this->assertRaw('seven/style.css', "The administrative theme's CSS appears on the page.");
$this->container->get('state')->set('system.maintenance_mode', FALSE);
}
/**
* Test the theme callback when it is set to use an optional theme.
*/
protected function doTestThemeCallbackOptionalTheme() {
// Request a theme that is not enabled.
$this->drupalGet('menu-test/theme-callback/use-stark-theme');
$this->assertText('Custom theme: NONE. Actual theme: bartik.', 'The theme callback system falls back on the default theme when a theme that is not enabled is requested.');
$this->assertRaw('bartik/css/style.css', "The default theme's CSS appears on the page.");
// Now enable the theme and request it again.
theme_enable(array($this->alternate_theme));
$this->drupalGet('menu-test/theme-callback/use-stark-theme');
$this->assertText('Custom theme: stark. Actual theme: stark.', 'The theme callback system uses an optional theme once it has been enabled.');
$this->assertRaw('stark/css/layout.css', "The optional theme's CSS appears on the page.");
}
/**
* Test the theme callback when it is set to use a theme that does not exist.
*/
protected function doTestThemeCallbackFakeTheme() {
$this->drupalGet('menu-test/theme-callback/use-fake-theme');
$this->assertText('Custom theme: NONE. Actual theme: bartik.', 'The theme callback system falls back on the default theme when a theme that does not exist is requested.');
$this->assertRaw('bartik/css/style.css', "The default theme's CSS appears on the page.");
}
/**
* Test the theme callback when no theme is requested.
*/
protected function doTestThemeCallbackNoThemeRequested() {
$this->drupalGet('menu-test/theme-callback/no-theme-requested');
$this->assertText('Custom theme: NONE. Actual theme: bartik.', 'The theme callback system falls back on the default theme when no theme is requested.');
$this->assertRaw('bartik/css/style.css', "The default theme's CSS appears on the page.");
}
/**
* Test that hook_custom_theme() can control the theme of a page.
*/
protected function doTestHookCustomTheme() {
// Trigger hook_custom_theme() to dynamically request the Stark theme for
// the requested page.
\Drupal::state()->set('menu_test.hook_custom_theme_name', $this->alternate_theme);
theme_enable(array($this->alternate_theme, $this->admin_theme));
// Visit a page that does not implement a theme callback. The above request
// should be honored.
$this->drupalGet('menu-test/no-theme-callback');
$this->assertText('Custom theme: stark. Actual theme: stark.', 'The result of hook_custom_theme() is used as the theme for the current page.');
$this->assertRaw('stark/css/layout.css', "The Stark theme's CSS appears on the page.");
}
/**
* Test that the theme callback wins out over hook_custom_theme().
*/
protected function doTestThemeCallbackHookCustomTheme() {
// Trigger hook_custom_theme() to dynamically request the Stark theme for
// the requested page.
\Drupal::state()->set('menu_test.hook_custom_theme_name', $this->alternate_theme);
theme_enable(array($this->alternate_theme, $this->admin_theme));
// The menu "theme callback" should take precedence over a value set in
// hook_custom_theme().
$this->drupalGet('menu-test/theme-callback/use-admin-theme');
$this->assertText('Custom theme: seven. Actual theme: seven.', 'The result of hook_custom_theme() does not override what was set in a theme callback.');
$this->assertRaw('seven/style.css', "The Seven theme's CSS appears on the page.");
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment