RouterTest.php

Definition of Drupal\system\Tests\Menu\RouterTest.

Namespace

Drupal\system\Tests\Menu

File

drupal/core/modules/system/lib/Drupal/system/Tests/Menu/RouterTest.php
View source
<?php

/**
 * @file
 * Definition of Drupal\system\Tests\Menu\RouterTest.
 */
namespace Drupal\system\Tests\Menu;

use PDO;
use Drupal\simpletest\WebTestBase;

/**
 * Tests menu router and hook_menu() functionality.
 */
class RouterTest extends WebTestBase {

  /**
   * Modules to enable.
   *
   * @var array
   */
  public static $modules = array(
    'block',
    'menu_test',
    'test_page_test',
  );
  public static function getInfo() {
    return array(
      'name' => 'Menu router',
      'description' => 'Tests menu router and hook_menu() functionality.',
      'group' => 'Menu',
    );
  }
  function setUp() {

    // Enable dummy module that implements hook_menu.
    parent::setUp();

    // Make the tests below more robust by explicitly setting the default theme
    // and administrative theme that they expect.
    theme_enable(array(
      'bartik',
    ));
    variable_set('theme_default', 'bartik');
    variable_set('admin_theme', 'seven');
    theme_disable(array(
      'stark',
    ));

    // Enable navigation menu block.
    db_merge('block')
      ->key(array(
      'module' => 'system',
      'delta' => 'menu-tools',
      'theme' => 'bartik',
    ))
      ->fields(array(
      'status' => 1,
      'weight' => 0,
      'region' => 'sidebar_first',
      'pages' => '',
      'cache' => -1,
    ))
      ->execute();
  }

  /**
   * Test title callback set to FALSE.
   */
  function testTitleCallbackFalse() {
    $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.');
  }

  /**
   * Tests page title of MENU_CALLBACKs.
   */
  function testTitleMenuCallback() {

    // Verify that the menu router item title is not visible.
    $this
      ->drupalGet('');
    $this
      ->assertNoText(t('Menu Callback Title'));

    // Verify that the menu router item title is output as page title.
    $this
      ->drupalGet('menu_callback_title');
    $this
      ->assertText(t('Menu Callback Title'));
  }

  /**
   * Tests menu item descriptions.
   */
  function testDescriptionMenuItems() {

    // 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(
      'seven',
    ));
    $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(
      'seven',
    ));
    $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 that 'page callback', 'file' and 'file path' keys are properly
   * inherited from parent menu paths.
   */
  function testFileInheritance() {
    $this
      ->drupalGet('admin/config/development/file-inheritance');
    $this
      ->assertText('File inheritance test description', 'File inheritance works.');
  }

  /**
   * Test path containing "exotic" characters.
   */
  function testExoticPath() {
    $path = "menu-test/ -._~!\$'\"()*@[]?&+%#,;=:" . "%23%25%26%2B%2F%3F" . "éøïвβ中國書۞";

    // 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() {
    config('system.maintenance')
      ->set('enabled', 1)
      ->save();
    theme_enable(array(
      'seven',
    ));

    // 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.");
    config('system.maintenance')
      ->set('enabled', 0)
      ->save();
  }

  /**
   * Make sure the maintenance mode can be bypassed using hook_menu_site_status_alter().
   *
   * @see hook_menu_site_status_alter().
   */
  function testMaintenanceModeLoginPaths() {
    config('system.maintenance')
      ->set('enabled', 1)
      ->save();
    $offline_message = t('@site is currently under maintenance. We should be back shortly. Thank you for your patience.', array(
      '@site' => config('system.site')
        ->get('name'),
    ));
    $this
      ->drupalGet('test-page');
    $this
      ->assertText($offline_message);
    $this
      ->drupalGet('menu_login_callback');
    $this
      ->assertText('This is menu_login_callback().', 'Maintenance mode can be bypassed through hook_menu_site_status_alter().');
    config('system.maintenance')
      ->set('enabled', 0)
      ->save();
  }

  /**
   * 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->uid, 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->uid . '/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(
      'stark',
    ));
    $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.
    state()
      ->set('menu_test.hook_custom_theme_name', 'stark');
    theme_enable(array(
      'stark',
      'seven',
    ));

    // 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.
    state()
      ->set('menu_test.hook_custom_theme_name', 'stark');
    theme_enable(array(
      'stark',
      'seven',
    ));

    // 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() {
    $admin_user = $this
      ->drupalCreateUser(array(
      'access content',
      'administer site configuration',
    ));
    $this
      ->drupalLogin($admin_user);

    // Create three menu items.
    menu_link_maintain('menu_test', 'insert', 'menu_test_maintain/1', 'Menu link #1');
    menu_link_maintain('menu_test', 'insert', 'menu_test_maintain/1', 'Menu link #1-main');
    menu_link_maintain('menu_test', 'insert', 'menu_test_maintain/2', 'Menu link #2');

    // Move second link to the main-menu, to test caching later on.
    db_update('menu_links')
      ->fields(array(
      'menu_name' => 'main',
    ))
      ->condition('link_title', 'Menu link #1-main')
      ->condition('customized', 0)
      ->condition('module', 'menu_test')
      ->execute();
    menu_cache_clear_all();

    // Load front page.
    $this
      ->drupalGet('');
    $this
      ->assertLink('Menu link #1');
    $this
      ->assertLink('Menu link #1-main');
    $this
      ->assertLink('Menu link #2');

    // Rename all links for the given path.
    menu_link_maintain('menu_test', 'update', 'menu_test_maintain/1', 'Menu link updated');

    // Load a different page to be sure that we have up to date information.
    $this
      ->drupalGet('menu_test_maintain/1');
    $this
      ->assertLink('Menu link updated');
    $this
      ->assertNoLink('Menu link #1');
    $this
      ->assertNoLink('Menu link #1-main');
    $this
      ->assertLink('Menu link #2');

    // Delete all links for the given path.
    menu_link_maintain('menu_test', 'delete', 'menu_test_maintain/1', '');

    // Load a different page to be sure that we have up to date information.
    $this
      ->drupalGet('menu_test_maintain/2');
    $this
      ->assertNoLink('Menu link updated');
    $this
      ->assertNoLink('Menu link #1');
    $this
      ->assertNoLink('Menu link #1-main');
    $this
      ->assertLink('Menu link #2');
  }

  /**
   * Tests for menu_name parameter for hook_menu().
   */
  function testMenuName() {
    $admin_user = $this
      ->drupalCreateUser(array(
      'administer site configuration',
    ));
    $this
      ->drupalLogin($admin_user);
    $sql = "SELECT menu_name FROM {menu_links} WHERE router_path = 'menu_name_test'";
    $name = db_query($sql)
      ->fetchField();
    $this
      ->assertEqual($name, 'original', 'Menu name is "original".');

    // Change the menu_name parameter in menu_test.module, then force a menu
    // rebuild.
    menu_test_menu_name('changed');
    menu_router_rebuild();
    $sql = "SELECT menu_name FROM {menu_links} WHERE router_path = 'menu_name_test'";
    $name = db_query($sql)
      ->fetchField();
    $this
      ->assertEqual($name, 'changed', 'Menu name was successfully changed after rebuild.');
  }

  /**
   * Tests for menu hierarchy.
   */
  function testMenuHierarchy() {
    $parent_link = db_query('SELECT * FROM {menu_links} WHERE link_path = :link_path', array(
      ':link_path' => 'menu-test/hierarchy/parent',
    ))
      ->fetchAssoc();
    $child_link = db_query('SELECT * FROM {menu_links} WHERE link_path = :link_path', array(
      ':link_path' => 'menu-test/hierarchy/parent/child',
    ))
      ->fetchAssoc();
    $unattached_child_link = db_query('SELECT * FROM {menu_links} WHERE link_path = :link_path', array(
      ':link_path' => 'menu-test/hierarchy/parent/child2/child',
    ))
      ->fetchAssoc();
    $this
      ->assertEqual($child_link['plid'], $parent_link['mlid'], 'The parent of a directly attached child is correct.');
    $this
      ->assertEqual($unattached_child_link['plid'], $parent_link['mlid'], 'The parent of a non-directly attached child is correct.');
  }

  /**
   * Tests menu link depth and parents of local tasks and menu callbacks.
   */
  function testMenuHidden() {

    // Verify links for one dynamic argument.
    $links = db_select('menu_links', 'ml')
      ->fields('ml')
      ->condition('ml.router_path', 'menu-test/hidden/menu%', 'LIKE')
      ->orderBy('ml.router_path')
      ->execute()
      ->fetchAllAssoc('router_path', PDO::FETCH_ASSOC);
    $parent = $links['menu-test/hidden/menu'];
    $depth = $parent['depth'] + 1;
    $plid = $parent['mlid'];
    $link = $links['menu-test/hidden/menu/list'];
    $this
      ->assertEqual($link['depth'], $depth, format_string('%path depth @link_depth is equal to @depth.', array(
      '%path' => $link['router_path'],
      '@link_depth' => $link['depth'],
      '@depth' => $depth,
    )));
    $this
      ->assertEqual($link['plid'], $plid, format_string('%path plid @link_plid is equal to @plid.', array(
      '%path' => $link['router_path'],
      '@link_plid' => $link['plid'],
      '@plid' => $plid,
    )));
    $link = $links['menu-test/hidden/menu/add'];
    $this
      ->assertEqual($link['depth'], $depth, format_string('%path depth @link_depth is equal to @depth.', array(
      '%path' => $link['router_path'],
      '@link_depth' => $link['depth'],
      '@depth' => $depth,
    )));
    $this
      ->assertEqual($link['plid'], $plid, format_string('%path plid @link_plid is equal to @plid.', array(
      '%path' => $link['router_path'],
      '@link_plid' => $link['plid'],
      '@plid' => $plid,
    )));
    $link = $links['menu-test/hidden/menu/settings'];
    $this
      ->assertEqual($link['depth'], $depth, format_string('%path depth @link_depth is equal to @depth.', array(
      '%path' => $link['router_path'],
      '@link_depth' => $link['depth'],
      '@depth' => $depth,
    )));
    $this
      ->assertEqual($link['plid'], $plid, format_string('%path plid @link_plid is equal to @plid.', array(
      '%path' => $link['router_path'],
      '@link_plid' => $link['plid'],
      '@plid' => $plid,
    )));
    $link = $links['menu-test/hidden/menu/manage/%'];
    $this
      ->assertEqual($link['depth'], $depth, format_string('%path depth @link_depth is equal to @depth.', array(
      '%path' => $link['router_path'],
      '@link_depth' => $link['depth'],
      '@depth' => $depth,
    )));
    $this
      ->assertEqual($link['plid'], $plid, format_string('%path plid @link_plid is equal to @plid.', array(
      '%path' => $link['router_path'],
      '@link_plid' => $link['plid'],
      '@plid' => $plid,
    )));
    $parent = $links['menu-test/hidden/menu/manage/%'];
    $depth = $parent['depth'] + 1;
    $plid = $parent['mlid'];
    $link = $links['menu-test/hidden/menu/manage/%/list'];
    $this
      ->assertEqual($link['depth'], $depth, format_string('%path depth @link_depth is equal to @depth.', array(
      '%path' => $link['router_path'],
      '@link_depth' => $link['depth'],
      '@depth' => $depth,
    )));
    $this
      ->assertEqual($link['plid'], $plid, format_string('%path plid @link_plid is equal to @plid.', array(
      '%path' => $link['router_path'],
      '@link_plid' => $link['plid'],
      '@plid' => $plid,
    )));
    $link = $links['menu-test/hidden/menu/manage/%/add'];
    $this
      ->assertEqual($link['depth'], $depth, format_string('%path depth @link_depth is equal to @depth.', array(
      '%path' => $link['router_path'],
      '@link_depth' => $link['depth'],
      '@depth' => $depth,
    )));
    $this
      ->assertEqual($link['plid'], $plid, format_string('%path plid @link_plid is equal to @plid.', array(
      '%path' => $link['router_path'],
      '@link_plid' => $link['plid'],
      '@plid' => $plid,
    )));
    $link = $links['menu-test/hidden/menu/manage/%/edit'];
    $this
      ->assertEqual($link['depth'], $depth, format_string('%path depth @link_depth is equal to @depth.', array(
      '%path' => $link['router_path'],
      '@link_depth' => $link['depth'],
      '@depth' => $depth,
    )));
    $this
      ->assertEqual($link['plid'], $plid, format_string('%path plid @link_plid is equal to @plid.', array(
      '%path' => $link['router_path'],
      '@link_plid' => $link['plid'],
      '@plid' => $plid,
    )));
    $link = $links['menu-test/hidden/menu/manage/%/delete'];
    $this
      ->assertEqual($link['depth'], $depth, format_string('%path depth @link_depth is equal to @depth.', array(
      '%path' => $link['router_path'],
      '@link_depth' => $link['depth'],
      '@depth' => $depth,
    )));
    $this
      ->assertEqual($link['plid'], $plid, format_string('%path plid @link_plid is equal to @plid.', array(
      '%path' => $link['router_path'],
      '@link_plid' => $link['plid'],
      '@plid' => $plid,
    )));

    // Verify links for two dynamic arguments.
    $links = db_select('menu_links', 'ml')
      ->fields('ml')
      ->condition('ml.router_path', 'menu-test/hidden/block%', 'LIKE')
      ->orderBy('ml.router_path')
      ->execute()
      ->fetchAllAssoc('router_path', PDO::FETCH_ASSOC);
    $parent = $links['menu-test/hidden/block'];
    $depth = $parent['depth'] + 1;
    $plid = $parent['mlid'];
    $link = $links['menu-test/hidden/block/list'];
    $this
      ->assertEqual($link['depth'], $depth, format_string('%path depth @link_depth is equal to @depth.', array(
      '%path' => $link['router_path'],
      '@link_depth' => $link['depth'],
      '@depth' => $depth,
    )));
    $this
      ->assertEqual($link['plid'], $plid, format_string('%path plid @link_plid is equal to @plid.', array(
      '%path' => $link['router_path'],
      '@link_plid' => $link['plid'],
      '@plid' => $plid,
    )));
    $link = $links['menu-test/hidden/block/add'];
    $this
      ->assertEqual($link['depth'], $depth, format_string('%path depth @link_depth is equal to @depth.', array(
      '%path' => $link['router_path'],
      '@link_depth' => $link['depth'],
      '@depth' => $depth,
    )));
    $this
      ->assertEqual($link['plid'], $plid, format_string('%path plid @link_plid is equal to @plid.', array(
      '%path' => $link['router_path'],
      '@link_plid' => $link['plid'],
      '@plid' => $plid,
    )));
    $link = $links['menu-test/hidden/block/manage/%/%'];
    $this
      ->assertEqual($link['depth'], $depth, format_string('%path depth @link_depth is equal to @depth.', array(
      '%path' => $link['router_path'],
      '@link_depth' => $link['depth'],
      '@depth' => $depth,
    )));
    $this
      ->assertEqual($link['plid'], $plid, format_string('%path plid @link_plid is equal to @plid.', array(
      '%path' => $link['router_path'],
      '@link_plid' => $link['plid'],
      '@plid' => $plid,
    )));
    $parent = $links['menu-test/hidden/block/manage/%/%'];
    $depth = $parent['depth'] + 1;
    $plid = $parent['mlid'];
    $link = $links['menu-test/hidden/block/manage/%/%/configure'];
    $this
      ->assertEqual($link['depth'], $depth, format_string('%path depth @link_depth is equal to @depth.', array(
      '%path' => $link['router_path'],
      '@link_depth' => $link['depth'],
      '@depth' => $depth,
    )));
    $this
      ->assertEqual($link['plid'], $plid, format_string('%path plid @link_plid is equal to @plid.', array(
      '%path' => $link['router_path'],
      '@link_plid' => $link['plid'],
      '@plid' => $plid,
    )));
    $link = $links['menu-test/hidden/block/manage/%/%/delete'];
    $this
      ->assertEqual($link['depth'], $depth, format_string('%path depth @link_depth is equal to @depth.', array(
      '%path' => $link['router_path'],
      '@link_depth' => $link['depth'],
      '@depth' => $depth,
    )));
    $this
      ->assertEqual($link['plid'], $plid, format_string('%path plid @link_plid is equal to @plid.', array(
      '%path' => $link['router_path'],
      '@link_plid' => $link['plid'],
      '@plid' => $plid,
    )));
  }

  /**
   * Test menu_get_item() with empty ancestors.
   */
  function testMenuGetItemNoAncestors() {
    state()
      ->set('menu.masks', array());
    $this
      ->drupalGet('');
  }

  /**
   * Test menu_set_item().
   */
  function testMenuSetItem() {
    $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');

    // Modify the path for the item then save it.
    $item['path'] = 'test-page-test';
    $item['href'] = 'test-page-test';
    menu_set_item('test-page', $item);
    $compare_item = menu_get_item('test-page');
    $this
      ->assertEqual($compare_item, $item, 'Modified menu item is equal to newly retrieved menu item.', 'menu');
  }

  /**
   * Test menu maintenance hooks.
   */
  function testMenuItemHooks() {

    // 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');

    // Update the item.
    menu_link_maintain('menu_test', 'update', 'menu_test_maintain/4', 'Menu link updated');
    $this
      ->assertEqual(menu_test_static_variable(), 'update', 'hook_menu_link_update() fired correctly');

    // Delete the item.
    menu_link_maintain('menu_test', 'delete', 'menu_test_maintain/4', '');
    $this
      ->assertEqual(menu_test_static_variable(), 'delete', 'hook_menu_link_delete() fired correctly');
  }

  /**
   * Test menu link 'options' storage and rendering.
   */
  function testMenuLinkOptions() {

    // Create a menu link with options.
    $menu_link = array(
      'link_title' => 'Menu link options test',
      'link_path' => 'test-page',
      'module' => 'menu_test',
      'options' => array(
        'attributes' => array(
          'title' => 'Test title attribute',
        ),
        'query' => array(
          'testparam' => 'testvalue',
        ),
      ),
    );
    menu_link_save($menu_link);

    // Load front page.
    $this
      ->drupalGet('test-page');
    $this
      ->assertRaw('title="Test title attribute"', 'Title attribute of a menu link renders.');
    $this
      ->assertRaw('testparam=testvalue', 'Query parameter added to menu link.');
  }

  /**
   * Tests the possible ways to set the title for menu items.
   * Also tests that menu item titles work with string overrides.
   */
  function testMenuItemTitlesCases() {

    // Build array with string overrides.
    $test_data = array(
      1 => array(
        'Example title - Case 1' => 'Alternative example title - Case 1',
      ),
      2 => array(
        'Example @sub1 - Case @op2' => 'Alternative example @sub1 - Case @op2',
      ),
      3 => array(
        'Example title' => 'Alternative example title',
      ),
      4 => array(
        'Example title' => 'Alternative example title',
      ),
    );
    foreach ($test_data as $case_no => $override) {
      $this
        ->menuItemTitlesCasesHelper($case_no);
      variable_set('locale_custom_strings_en', array(
        '' => $override,
      ));
      $this
        ->menuItemTitlesCasesHelper($case_no, TRUE);
      variable_set('locale_custom_strings_en', array());
    }
  }

  /**
   * 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) {
    $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;
    $this
      ->assertTitle($asserted_title . ' | Drupal', format_string('Menu title is: %title.', array(
      '%title' => $asserted_title,
    )), 'Menu');
  }

  /**
   * Load the router for a given path.
   */
  protected function menuLoadRouter($router_path) {
    return db_query('SELECT * FROM {menu_router} WHERE path = :path', array(
      ':path' => $router_path,
    ))
      ->fetchAssoc();
  }

  /**
   * Tests inheritance of 'load arguments'.
   */
  function testMenuLoadArgumentsInheritance() {
    $expected = array(
      'menu-test/arguments/%/%' => array(
        2 => array(
          'menu_test_argument_load' => array(
            3,
          ),
        ),
        3 => NULL,
      ),
      // Arguments are inherited to normal children.
      'menu-test/arguments/%/%/default' => array(
        2 => array(
          'menu_test_argument_load' => array(
            3,
          ),
        ),
        3 => NULL,
      ),
      // Arguments are inherited to tab children.
      'menu-test/arguments/%/%/task' => array(
        2 => array(
          'menu_test_argument_load' => array(
            3,
          ),
        ),
        3 => NULL,
      ),
      // Arguments are only inherited to the same loader functions.
      'menu-test/arguments/%/%/common-loader' => array(
        2 => array(
          'menu_test_argument_load' => array(
            3,
          ),
        ),
        3 => 'menu_test_other_argument_load',
      ),
      // Arguments are not inherited to children not using the same loader
      // function.
      'menu-test/arguments/%/%/different-loaders-1' => array(
        2 => NULL,
        3 => 'menu_test_argument_load',
      ),
      'menu-test/arguments/%/%/different-loaders-2' => array(
        2 => 'menu_test_other_argument_load',
        3 => NULL,
      ),
      'menu-test/arguments/%/%/different-loaders-3' => array(
        2 => NULL,
        3 => NULL,
      ),
      // Explicit loader arguments should not be overriden by parent.
      'menu-test/arguments/%/%/explicit-arguments' => array(
        2 => array(
          'menu_test_argument_load' => array(),
        ),
        3 => NULL,
      ),
    );
    foreach ($expected as $router_path => $load_functions) {
      $router_item = $this
        ->menuLoadRouter($router_path);
      $this
        ->assertIdentical(unserialize($router_item['load_functions']), $load_functions, format_string('Expected load functions for router %router_path', array(
        '%router_path' => $router_path,
      )));
    }
  }

}

Classes

Namesort descending Description
RouterTest Tests menu router and hook_menu() functionality.