menu_import.test in Menu Export/Import 7
Test file for menu_import module.
File
menu_import.testView source
<?php
/**
* @file
* Test file for menu_import module.
*/
/**
* Functionality tests for menu_import module.
*/
class MenuImportTestCase extends DrupalWebTestCase {
private $validate_hidden;
private $validate_expanded;
public static function getInfo() {
return array(
'name' => '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 = '<tbody>
<tr class="odd"><td><span title="Test description">Page 1</span></td><td>No</td><td> - </td><td> - </td><td>1</td> </tr>
<tr class="even"><td><span title=""><div class="indentation"> </div>Page 12</span></td><td>No</td><td>admin/structure/menu/import</td><td>admin/structure/menu/import</td><td>0</td> </tr>
<tr class="odd"><td><span title=""><div class="indentation"> </div>Page 13</span></td><td>No</td><td>admin/structure/menu/export?arg=val</td><td>admin/structure/menu/export</td><td>1</td> </tr>
<tr class="even"><td><span title=""><div class="indentation"> </div><div class="indentation"> </div>Page 131</span></td><td>No</td><td> - </td><td> - </td><td>0</td> </tr>
<tr class="odd"><td><span title="">Page 2</span></td><td>No</td><td> - </td><td> - </td><td>2</td> </tr>
<tr class="even"><td><span title=""><div class="indentation"> </div>Page 21</span></td><td>No</td><td> - </td><td> - </td><td>0</td> </tr>
<tr class="odd"><td><span title=""><div class="indentation"> </div><div class="indentation"> </div>Page 211</span></td><td>No</td><td> - </td><td> - </td><td>0</td> </tr>
</tbody>';
$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":"<front>","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 = '<tbody>
<tr class="odd"><td><span title="">Page 12</span></td><td>No</td><td> - </td><td> - </td><td>3</td> </tr>
<tr class="even"><td><span title=""><div class="indentation"> </div>Page 1</span></td><td>Yes</td><td> - </td><td>node/' . array_search('1', $node_ids) . '</td><td>0</td> </tr>
<tr class="odd"><td><span title=""><div class="indentation"> </div>Page 131</span></td><td>Yes</td><td> - </td><td>node/' . array_search('131', $node_ids) . '</td><td>1</td> </tr>
<tr class="even"><td><span title=""><div class="indentation"> </div><div class="indentation"> </div>Page 13</span></td><td>No</td><td> - </td><td> - </td><td>0</td> </tr>
<tr class="odd"><td><span title="">Page 211</span></td><td>Yes</td><td> - </td><td>node/' . array_search('211', $node_ids) . '</td><td>4</td> </tr>
<tr class="even"><td><span title=""><div class="indentation"> </div>Page 21</span></td><td>Yes</td><td> - </td><td>node/' . array_search('21', $node_ids) . '</td><td>0</td> </tr>
<tr class="odd"><td><span title=""><div class="indentation"> </div><div class="indentation"> </div>Page 2</span></td><td>Yes</td><td> - </td><td>node/' . array_search('2', $node_ids) . '</td><td>0</td> </tr>
</tbody>';
$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']);
}
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;
}
}
Classes
Name | Description |
---|---|
MenuImportTestCase | Functionality tests for menu_import module. |