'Menu export/import', 'description' => 'Perform various tests on menu_import module.', 'group' => 'Menu', ); } function setUp() { parent::setUp('menu_import'); $this->privileged_user = $this->drupalCreateUser(array( 'administer menu', 'import or export menu', )); $this->drupalLogin($this->privileged_user); } /** * Verifies basic functionality by running two imports - the first creates * menu links and new nodes referenced by them, the other one reorders existing menu items * searching for existing content by title. */ function testBasicFeatures() { /** * SUBTEST #1: import. */ $file = DRUPAL_ROOT . '/' . drupal_get_path('module', 'menu_import') . '/tests/nolinks_3levels.txt'; $validate_structure = array( '1' => array('12', '13' => array('131')), '2' => array('21' => array('211')), ); $this->validate_hidden = array('12'); $this->validate_expanded = array('2'); $items_total = 7; $content_items = 5; // 2 items are links $menu_machine_name = 'main-menu'; $menu_title = 'Main menu'; $post_url = 'admin/structure/menu/import'; // End of test file settings. $post_data = array( 'menu_name' => 'main-menu', 'files[upload]' => $file, 'create_content' => TRUE, 'link_to_content' => TRUE, 'node_type' => 'page', 'node_body' => 'Some test content', 'node_author' => $this->privileged_user->uid, 'node_status' => TRUE, ); $this->drupalPost($post_url, $post_data, t('Upload & preview')); // Assert options are ok, and empty line was skipped. $this->assertText(t('Empty lines skipped: @lines.', array('@lines' => 1))); $this->assertText( t('Import @count items into "@menu_title" menu (@menu_name)', array( '@count' => $items_total, '@menu_title' => $menu_title, '@menu_name' => $menu_machine_name ))); $this->assertText('Link to existing content if found'); $this->assertText(t('Initial content of type "@type" will be created', array('@type' => 'page'))); $this->assertText(t('Content status: @status', array('@status' => 'published'))); $this->assertText(t('Content author: @author', array('@author' => $this->privileged_user->name))); $this->assertText(t('Path aliases will be created.')); $this->assertText(t('Language: not defined')); // Assert menu is parsed correctly. // Drupal may change this structure. $expected_menu = ' Page 1No - - 1
 
Page 12
Noadmin/structure/menu/importadmin/structure/menu/import0
 
Page 13
Noadmin/structure/menu/export?arg=valadmin/structure/menu/export1
 
 
Page 131
No - - 0 Page 2No - - 2
 
Page 21
No - - 0
 
 
Page 211
No - - 0 '; $this->assertRaw($expected_menu, 'Menu structure has been parsed.'); // Get hidden form fields for post. $post_data = $this->getFormHiddenFields(); // Post to the same page. $this->drupalPost(NULL, $post_data, t('Import')); // Check report. $this->assertText(t('Items imported: @items.', array('@items' => $items_total))); $this->assertText(t('New content created: @count items.', array('@count' => $content_items))); // Validate menu structure and generated content. $menu_tree = menu_build_tree($menu_machine_name); array_shift($menu_tree); // Remove "Home" link, Drupal may change this structure! $this->validateMenu($validate_structure, $menu_tree); /** * SUBTEST #2: export. */ $post_data = array( 'menu_name' => 'main-menu', 'line_ending' => 'unix', 'options' => 1, ); $export_url = 'admin/structure/menu/export'; $this->drupalPost($export_url, $post_data, t('Export')); $exported_menu = $this->drupalGetContent(); $expected_exported_menu = 'Home {"url":"","weight":"0"} Page 1 {"url":"node\/1","description":"Test description","weight":"1"} -Page 12 {"url":"admin\/structure\/menu\/import","hidden":true,"weight":"0"} -Page 13 {"url":"admin\/structure\/menu\/export","options":{"query":{"arg":"val"}},"weight":"1"} --Page 131 {"url":"node\/3","weight":"0"} Page 2 {"url":"node\/2","expanded":true,"weight":"2"} -Page 21 {"url":"node\/4","weight":"0"} --Page 211 {"url":"node\/5","weight":"0"} '; $this->assertEqual($exported_menu, $expected_exported_menu, 'Exported menu ok.'); /** * SUBTEST #3: import with match by title. */ // Test file settings to validate against. $file = DRUPAL_ROOT . '/' . drupal_get_path('module', 'menu_import') . '/tests/nolinks_3levels_reordered.txt'; $validate_structure = array( '12' => array('1', '131' => array('13')), '211' => array('21' => array('2')), ); // Element's index is the id of the node referenced by menu item. $node_ids = array(0, '1', '2', '131', '21', '211'); $post_data = array( 'menu_name' => 'main-menu', 'files[upload]' => $file, 'create_content' => FALSE, 'link_to_content' => TRUE, ); $this->drupalPost($post_url, $post_data, t('Upload & preview')); // Assert options are ok. $this->assertText( t('Import @count items into "@menu_title" menu (@menu_name)', array( '@count' => $items_total, '@menu_title' => $menu_title, '@menu_name' => $menu_machine_name ))); $this->assertText('Link to existing content if found'); $this->assertText(t('Language: not defined')); // Assert menu is parsed correctly. // Drupal may change this structure. $expected_menu = ' Page 12No - - 3
 
Page 1
Yes - node/' . array_search('1', $node_ids) . '0
 
Page 131
Yes - node/' . array_search('131', $node_ids) . '1
 
 
Page 13
No - - 0 Page 211Yes - node/' . array_search('211', $node_ids) . '4
 
Page 21
Yes - node/' . array_search('21', $node_ids) . '0
 
 
Page 2
Yes - node/' . array_search('2', $node_ids) . '0 '; $this->assertRaw($expected_menu, 'Menu structure has been parsed.'); // Get hidden form fields for post. $post_data = $this->getFormHiddenFields(); // Post to the same page. $this->drupalPost(NULL, $post_data, t('Import')); // Check report. $this->assertText(t('Items imported: @items.', array('@items' => $items_total))); $this->assertText(t('External URLs: 0 items.')); $this->assertText(t('Content not found: 2 items.')); $this->assertText(t('Existing content matched: @cnt items.', array('@cnt' => $content_items))); $this->assertText(t('New content created: 0 items.')); $this->assertText(t('Menu items deleted: 0.')); // Validate menu structure and generated content. // Cache clear is required since some items are not updated (a bug?) menu_cache_clear($menu_machine_name); $menu_tree = menu_build_tree($menu_machine_name); // Remove "Home" and two orphanes links that appeared after reorder Drupal may change this structure! $menu_tree = array_slice($menu_tree, 3); $this->validate_expanded = array(); $this->validate_hidden = array(); $this->validateMenu($validate_structure, $menu_tree); } function validateMenu($reference, &$actual) { //global $reference, $hidden foreach ($actual as $id => $menu_item) { list($some_id, $page, $page_id, $mlid) = explode(' ', $id); $this->assertEqual($menu_item['link']['link_title'], "$page $page_id"); $this->assertEqual(strpos($menu_item['link']['link_path'], 'node/'), 0); // Root page if (isset($reference[$page_id])) { $this->assertEqual(count($menu_item['below']), count($reference[$page_id])); $this->validateMenu($reference[$page_id], $menu_item['below']); } // Menu item not found. elseif (!in_array($page_id, $reference)) { $this->fail('Imported structure doesn\'t match the expected one.'); return; } // Test if hidden. if (in_array($page_id, $this->validate_hidden)) { $this->assertEqual($menu_item['link']['hidden'], 1); } // Test if expanded. if (in_array($page_id, $this->validate_expanded)) { $this->assertEqual($menu_item['link']['expanded'], 1); } } } function getFormHiddenFields() { $fields = array(); $elements = $this->xpath("//input[@type='hidden']"); foreach ($elements as $element) { $attrs = $element->attributes(); $name = $value = ''; foreach ($attrs as $aname => $avalue) { if ($aname == 'name') { $name = $avalue; } if ($aname == 'value') { $value = $avalue; } } $fields["$name"] = "$value"; } return $fields; } }