1 layout.test LayoutInterfaceTest::testLayoutMenuItems()

Tests conditions and menu item navigation.

File

core/modules/layout/tests/layout.test, line 1477
Tests for the Layout module.

Class

LayoutInterfaceTest
Tests the interface for adding, removing, and moving blocks.

Code

function testLayoutMenuItems() {
  $layout_name = strtolower($this->randomName());
  $layout_path = $layout_name . '/' . strtolower($this->randomName());
  $edit = array(
    'name' => $layout_name,
    'title' => $layout_name,
    'path' => $layout_path,
    'layout_template' => 'moscone_flipped',
  );
  $this->backdropPost('admin/structure/layouts/add', $edit, t('Create layout'));

  $edit = array(
    'title_display' => LAYOUT_TITLE_CUSTOM,
    'title' => 'Menu item test',
  );
  $this->backdropPost('admin/structure/layouts/manage/' . $layout_name . '/edit-title/editor/title', $edit, t('Save configuration'));
  $this->backdropPost('admin/structure/layouts/manage/' . $layout_name, array(), t('Save layout'));
  $this->backdropGet($layout_path);
  $this->assertResponse(200, 'Layout displayed at the given path.');

  // At this point there should only be a single custom path, so there should
  // only be a single "Menu settings" link on the listing page. If other
  // layouts are added in tests in this class, be sure they are deleted at the
  // end of the test.
  $this->backdropGet('admin/structure/layouts');
  $this->clickLink(t('Menu settings'));
  $this->assertUrl('admin/structure/layouts/menu/' . $layout_name, array(), 'Menu settings link goes to the correct layout menu item settings.');

  // Set as a normal menu item.
  $menu_title = $this->randomName();
  $edit = array(
    'menu[type]' => 'normal',
    'menu[title]' => $menu_title,
    'menu[weight]' => 1,
  );
  $this->backdropPost(NULL, $edit, t('Save menu settings'));

  // Check that the link is available on the homepage (via the main menu).
  $this->backdropGet('<front>');
  $this->assertLink($menu_title, 0, 'Menu link shown on the homepage.');

  $this->backdropPost('admin/structure/layouts/menu/' . $layout_name, array(), t('Add condition'));
  $edit = array(
    'condition' => 'path',
  );
  $this->backdropPost(NULL, $edit, t('Load condition'));

  // This condition will make the menu item available on the home page, and
  // on the layout path itself. Note that the "layout_name" is the first part
  // of the path, so we allow access on it and its children paths.
  $edit = array(
    'paths' => "<front>\n$layout_name*\n",
  );
  $this->backdropPost(NULL, $edit, t('Add condition'));
  $this->backdropPost(NULL, array(), t('Save menu settings'));
  $vc_text = 'Current path is one of "' . str_replace("\n", ', ', $edit['paths']);
  $vc = $this->xpath('//tr[contains(@class,"layout-group")]//ul//li[contains(., :vc_text)]', array(
    ':vc_text' => $vc_text,
  ));
  $this->assertEqual(count($vc), 1, 'The visibility condition shows up properly.');

  $this->backdropGet('<front>');
  $this->assertLink($menu_title, 0, 'Menu link found on the homepage.');
  $this->backdropGet('node/' . $this->test_node1->nid);
  $this->assertNoLink($menu_title, 'Menu link not shown when conditions prevent it.');
  $this->backdropGet($layout_path);
  $this->assertLink($menu_title, 0, 'Menu link shown on the layout page itself.');

  // Change the menu item to a default local tab.
  $menu_tab_title = $this->randomName();
  $edit = array(
    'menu[type]' => 'default tab',
    'menu[title]' => $menu_tab_title,
    'menu[weight]' => 1,
    'menu[parent][type]' => 'normal',
    'menu[parent][title]' => $menu_title,
  );
  $this->backdropPost('admin/structure/layouts/menu/' . $layout_name, $edit, t('Save menu settings'));

  // Ensure that the parent item link still shows up.
  $this->backdropGet('<front>');
  $this->assertLink($menu_title, 0, 'Menu link found on the homepage when registered as a parent menu item link.');
  $this->clickLink($menu_title);
  $this->assertUrl($layout_name, array(), 'Menu link uses the parent path, without the default tab portion of the path.');

  // Create another layout to use as a second tab.
  $tab_layout_name = strtolower($this->randomName());
  $tab_layout_path = $layout_name . '/' . strtolower($this->randomName());
  $edit = array(
    'name' => $tab_layout_name,
    'title' => $tab_layout_name,
    'path' => $tab_layout_path,
    'layout_template' => 'moscone_flipped',
  );
  $this->backdropPost('admin/structure/layouts/add', $edit, t('Create layout'));

  $tab_layout_title = $this->randomName();
  $edit = array(
    'menu[type]' => 'tab',
    'menu[title]' => $tab_layout_title,
    'menu[weight]' => 1,
  );
  $this->backdropPost('admin/structure/layouts/menu/' . $tab_layout_name, $edit, t('Save menu settings'));

  // On the "parent" path, we should now see the default tab and this new tab.
  $this->backdropGet($layout_name);
  $active_tab = $this->xpath('//ul[contains(@class,"tabs")]/li[contains(@class,"active")]/a[@href=:path]', array(
    ':path' => url($layout_name),
  ));
  $this->assertEqual(count($active_tab), 1, 'The menu default tab for a layout shows up properly.');
  $second_tab = $this->xpath('//ul[contains(@class,"tabs")]/li/a[@href=:path]', array(
    ':path' => url($tab_layout_path),
  ));
  $this->assertEqual(count($second_tab), 1, 'The normal menu tab for a layout shows up properly.');

  // Make a 3rd layout at a yet deeper path, creating another tab via its parent.
  $subtab_layout_name = strtolower($this->randomName());
  $subtab_layout_path = $tab_layout_path . '/' . strtolower($this->randomName());
  $subtab_layout_path_last = $subtab_layout_path . '/' . strtolower($this->randomName());
  $edit = array(
    'name' => $subtab_layout_name,
    'title' => $subtab_layout_name,
    'path' => $subtab_layout_path_last,
    'layout_template' => 'moscone_flipped',
  );
  $this->backdropPost('admin/structure/layouts/add', $edit, t('Create layout'));

  $subtab_layout_title = $this->randomName();
  $sub_subtab_layout_title = $this->randomName();
  $edit = array(
    'menu[type]' => 'default tab',
    'menu[title]' => $sub_subtab_layout_title,
    'menu[weight]' => 0,
    'menu[parent][type]' => 'tab',
    'menu[parent][title]' => $subtab_layout_title,
  );
  $this->backdropPost('admin/structure/layouts/menu/' . $subtab_layout_name, $edit, t('Save menu settings'));

  // Reuse the "tab" item to be a child of the subtab.
  $subtab_layout_path_last = $subtab_layout_path . '/' . strtolower($this->randomName());
  $edit = array(
    'path' => $subtab_layout_path_last,
  );
  $this->backdropPost('admin/structure/layouts/manage/' . $tab_layout_name . '/configure', $edit, t('Save layout'));

  // Now we should have an active tab with subtabs, the first one is active.
  $this->backdropGet($subtab_layout_path);
  $active_tab = $this->xpath('//ul[contains(@class,"tabs")][contains(@class,"secondary")]/li[contains(@class,"active")]/a[@href=:path]', array(
    ':path' => url($subtab_layout_path),
  ));
  $this->assertEqual(count($active_tab), 1, 'The sub-tab default menu item for a layout shows up properly.');
  $second_tab = $this->xpath('//ul[contains(@class,"tabs")][contains(@class,"secondary")]/li/a[@href=:path]', array(
    ':path' => url($subtab_layout_path_last),
  ));
  $this->assertEqual(count($second_tab), 1, 'The sub-tab menu item for a layout shows up properly.');

  // Delete all the generated layouts.
  $this->backdropPost('admin/structure/layouts/manage/' . $layout_name . '/delete', array(), t('Delete layout'));
  $this->backdropPost('admin/structure/layouts/manage/' . $tab_layout_name . '/delete', array(), t('Delete layout'));
  $this->backdropPost('admin/structure/layouts/manage/' . $subtab_layout_name . '/delete', array(), t('Delete layout'));

  // Check that both layouts and menu items are deleted.
  layout_reset_caches();
  $this->assertFalse(layout_load($layout_name), 'Base layout deleted.');
  $this->assertFalse(layout_load($tab_layout_name), 'Tab layout deleted.');
  $this->assertFalse(layout_load($subtab_layout_name), 'Sub-tab layout deleted.');
  $this->assertFalse(layout_menu_item_load($layout_name), 'Base menu item deleted.');
  $this->assertFalse(layout_menu_item_load($tab_layout_name), 'Tab menu item deleted.');
  $this->assertFalse(layout_menu_item_load($subtab_layout_name), 'Sub-tab menu item deleted.');
}