public function MetatagCoreNodeTest::testEntityCreationWorkflow in Metatag 7
Tests creation of a standard entity.
File
- tests/
MetatagCoreNodeTest.test, line 28 - Tests for the Metatag module and node entities.
Class
- MetatagCoreNodeTest
- Tests for the Metatag module and node entities.
Code
public function testEntityCreationWorkflow() {
$content_type = 'metatag_test';
$content_type_path = str_replace('_', '-', $content_type);
$label = 'Test';
// Create a content type.
$this
->createContentType($content_type, $label);
// Create an admin user and log them in.
$perms = array(
// Needed for the content type.
'create ' . $content_type . ' content',
'delete any ' . $content_type . ' content',
'edit any ' . $content_type . ' content',
// Used later for revision handling.
'view revisions',
'revert revisions',
'delete revisions',
// This permission is required in order to create new revisions.
'administer nodes',
);
$this->adminUser = $this
->createAdminUser($perms);
// Log in the admin user.
$this
->drupalLogin($this->adminUser);
// Assign default values for the new content type.
// Load the "add default configuration" page.
$this
->drupalGet('admin/config/search/metatags/config/add');
$this
->assertResponse(200);
// Verify the page loaded correct.
$this
->assertText(t('Select the type of default meta tags you would like to add.'));
// Submit the initial form to select an entity bundle.
$this
->drupalPost(NULL, array(
'instance' => 'node:' . $content_type,
), t('Add and configure'));
$this
->assertResponse(200);
// Verify the page loaded correct.
$this
->assertText('Node: ' . $label);
// Submit the form with some values.
$this
->drupalPost(NULL, array(
'metatags[und][abstract][value]' => '[node:title]',
), t('Save'));
$this
->assertResponse(200);
// Verify the page loaded correct.
$this
->assertText(strip_tags(t('The meta tag defaults for @label have been saved.', array(
'@label' => 'Node: ' . $label,
))));
// Verify that the user was redirected to the settings page again.
$this
->assertEqual($this
->getUrl(), url('admin/config/search/metatags', array(
'absolute' => TRUE,
)));
// Create a test node.
// Load the node form.
$this
->drupalGet('node/add/' . $content_type_path);
$this
->assertResponse(200);
// Verify the page loaded correctly.
// @todo Update this to extract the page title.
$this
->assertText(strip_tags(t('Create @name', array(
'@name' => $label,
))));
// Verify that it's possible to submit values to the form.
module_load_include('inc', 'devel_generate');
$body = devel_create_para(200);
$this
->drupalPost(NULL, array(
'metatags[und][abstract][value]' => '[node:title] ponies',
'title' => 'Who likes magic',
'body[und][0][value]' => $body,
), t('Save'));
$this
->assertResponse(200);
// The meta tags that will be checked for.
$expected = array(
'und' => array(
'abstract' => array(
'value' => '[node:title] ponies',
),
),
);
// Verify that the node saved correctly.
// @code
// $xpath = $this->xpath("//h1");
// @endcode
$t_args = array(
'@type' => 'Test',
'%title' => 'Who likes magic',
);
// This doesn't work for some reason, it seems the HTML is stripped off
// during output so the %title's standard Drupal wrappers don't match.
// @code
// $this->assertText(t('@type %title has been created.', $t_args));
// @endcode
// .. so this has to be done instead.
$this
->assertText(strip_tags(t('@type %title has been created.', $t_args)));
// Verify the node data saved correctly.
$matches = array();
$nid = 0;
if (preg_match('@node/(\\d+)$@', $this
->getUrl(), $matches)) {
$nid = end($matches);
$node = node_load($nid);
$this
->verbose($node, 'node_load(' . $nid . ')');
// Only the non-default values are stored.
$this
->assertEqual($expected, $node->metatags);
// Confirm the APIs can load the data for this node.
$metatags = metatag_metatags_load('node', $node->nid);
$this
->verbose($metatags, 'metatag_metatags_load("node", ' . $node->nid . ')');
$this
->assertEqual($expected, $metatags);
$metatags = metatag_metatags_load_multiple('node', array(
$node->nid,
));
$this
->verbose($metatags, 'metatag_metatags_load_multiple("node", array(' . $node->nid . '))');
$this
->assertEqual(array(
$node->nid => array(
$node->vid => $expected,
),
), $metatags);
// Confirm the APIs can load the data for this node revision.
$metatags = metatag_metatags_load('node', $node->nid, $node->vid);
$this
->verbose($metatags, 'metatag_metatags_load("node", ' . $node->nid . ', ' . $node->vid . ')');
$this
->assertEqual($expected, $metatags);
$metatags = metatag_metatags_load_multiple('node', array(
$node->nid,
), array(
$node->vid,
));
$this
->verbose($metatags, 'metatag_metatags_load_multiple("node", array(' . $node->nid . '), array(' . $node->vid . '))');
$this
->assertEqual(array(
$node->nid => array(
$node->vid => $expected,
),
), $metatags);
}
else {
$this
->fail(t('Could not determine the ID for the created node.'));
}
// Verify the title is using the custom default for this content type.
$xpath = $this
->xpath("//meta[@name='abstract']");
$this
->assertEqual(count($xpath), 1, 'Exactly one abstract meta tag found.');
$this
->assertEqual($xpath[0]['content'], 'Who likes magic ponies');
// Verify the node summary is being used correctly.
$xpath = $this
->xpath("//meta[@name='description']");
$this
->assertEqual(count($xpath), 1);
$this
->assertEqual($xpath[0]['content'], DrupalDefaultMetaTag::textSummary($body, 380));
// Verify the maxlength functionality is working correctly.
$maxlength = 10;
variable_set('metatag_maxlength_description', $maxlength);
metatag_config_cache_clear();
$this
->drupalGet('node/' . $nid);
$xpath = $this
->xpath("//meta[@name='description']");
$this
->assertEqual(count($xpath), 1);
$this
->assertEqual($xpath[0]['content'], trim(substr($xpath[0]['content'], 0, $maxlength)));
// Delete the variable so it goes back to the default.
variable_del('metatag_maxlength_description');
metatag_config_cache_clear();
// Core's canonical tag is a relative URL, whereas Metatag outputs an
// absolute URL.
$old_canonical = url('node/' . $node->nid);
$new_canonical = url('node/' . $node->nid, array(
'absolute' => TRUE,
));
// Confirm that the canonical tag is in the correct format.
$xpath = $this
->xpath("//link[@rel='canonical']");
$this
->assertEqual(count($xpath), 1, 'Exactly one canonical meta tag found.');
$this
->assertEqual($xpath[0]['href'], $new_canonical);
$this
->assertNotEqual($xpath[0]['href'], $old_canonical);
// Try loading the node revisions page.
$this
->drupalGet('node/' . $node->nid . '/revisions');
// Verify the page did not load correctly. This is because the revisions
// page can't be loaded if there's only one revision.
$this
->assertResponse(403);
// Try creating a revision of the node.
$old_title = $node->title;
$old_vid = $node->vid;
$new_title = 'Who still likes magic';
// Load the node-edit page.
$this
->drupalGet('node/' . $node->nid . '/edit');
// Verify the page loaded correctly.
$this
->assertResponse(200);
// Try submitting text to the page.
$args = array(
'metatags[und][abstract][value]' => '[node:title] kittens',
'title' => $new_title,
'revision' => 1,
'log' => 'Creating a new revision',
);
$this
->drupalPost(NULL, $args, t('Save'));
// Verify the page submission loaded correctly.
$this
->assertResponse(200);
// A new version of the expected results.
$expected_updated = array(
'und' => array(
'abstract' => array(
'value' => '[node:title] kittens',
),
),
);
// Verify that the node saved correctly.
// @code
// $xpath = $this->xpath("//h1");
// @endcode
$t_args = array(
'@type' => 'Test',
'%title' => $new_title,
);
// This doesn't work for some reason, it seems the HTML is stripped off
// during output so the %title's standard Drupal wrappers don't match.
// @code
// $this->assertText(t('@type %title has been updated.', $t_args));
// @endcode
// .. so this has to be done instead.
$this
->assertText(strip_tags(t('@type %title has been updated.', $t_args)));
// Verify the title is still using the custom default for this content type.
$xpath = $this
->xpath("//meta[@name='abstract']");
$this
->assertEqual(count($xpath), 1, 'Exactly one abstract meta tag found.');
$this
->assertNotEqual($xpath[0]['content'], $old_title . ' ponies', 'Did not find the new abstract meta tag.');
$this
->assertEqual($xpath[0]['content'], $new_title . ' kittens', 'Found the old abstract meta tag.');
// Load the node revisions page.
$this
->drupalGet('node/' . $node->nid . '/revisions');
// Verify the page loaded correctly.
$this
->assertResponse(200, 'Loaded the revisions page for this node.');
// Confirm there are two revisions.
$xpath = $this
->xpath("//body//div[@class='content']//table//tbody//tr");
$this
->assertEqual(count($xpath), 2, 'There are two revisions of this node.');
// Load the previous revision.
$this
->drupalGet('node/' . $node->nid . '/revisions/' . $old_vid . '/view');
// Verify the page loaded correctly.
$this
->assertResponse(200, 'Loaded the original revision of this node.');
$xpath = $this
->xpath("//meta[@name='abstract']");
$this
->assertEqual(count($xpath), 1, 'Exactly one abstract meta tag found.');
$this
->assertNotEqual($xpath[0]['content'], $new_title . ' kittens', 'Did not find the new abstract meta tag.');
$this
->assertEqual($xpath[0]['content'], $old_title . ' ponies', 'Found the old abstract meta tag.');
// Load the updated node; force-load it to make sure it's loaded properly.
$updated_node = node_load($node->nid, NULL, TRUE);
$updated_vid = $updated_node->vid;
$this
->verbose($updated_node, 'node_load(' . $node->nid . ', NULL, TRUE)');
// Confirm the APIs can load the data for this node.
$metatags = metatag_metatags_load('node', $updated_node->nid);
$this
->verbose($metatags, 'metatag_metatags_load("node", ' . $updated_node->nid . ')');
$this
->assertEqual($expected_updated, $metatags);
$this
->assertNotEqual($expected, $metatags);
// This one is complicated. If only the entity id is passed in it will load
// the {metatag} records for *all* of the entity's revisions.
$metatags = metatag_metatags_load_multiple('node', array(
$updated_node->nid,
));
$this
->verbose($metatags, 'metatag_metatags_load_multiple("node", array(' . $updated_node->nid . '))');
$this
->assertEqual(array(
$updated_node->nid => array(
$node->vid => $expected,
$updated_node->vid => $expected_updated,
),
), $metatags);
// Confirm the APIs can load the data for this node revision.
$metatags = metatag_metatags_load('node', $updated_node->nid, $updated_vid);
$this
->verbose($metatags, 'metatag_metatags_load("node", ' . $updated_node->nid . ', ' . $updated_node->vid . ')');
$this
->assertEqual($expected_updated, $metatags);
$this
->assertNotEqual($expected, $metatags);
$metatags = metatag_metatags_load_multiple('node', array(
$updated_node->nid,
), array(
$updated_node->vid,
));
$this
->verbose($metatags, 'metatag_metatags_load_multiple("node", array(' . $updated_node->nid . '), array(' . $updated_node->vid . '))');
$this
->assertEqual(array(
$updated_node->nid => array(
$updated_node->vid => $expected_updated,
),
), $metatags);
// Load the current revision again.
$this
->drupalGet('node/' . $node->nid);
$this
->assertResponse(200, 'Loaded the current revision of this node.');
$xpath = $this
->xpath("//meta[@name='abstract']");
$this
->assertEqual(count($xpath), 1, 'Exactly one abstract meta tag found.');
$this
->assertNotEqual($xpath[0]['content'], $old_title . ' ponies', 'Did not find the old abstract meta tag.');
$this
->assertEqual($xpath[0]['content'], $new_title . ' kittens', 'Found the new abstract meta tag.');
// Revert to the original revision.
$this
->drupalGet('node/' . $node->nid . '/revisions/' . $old_vid . '/revert');
// Verify the page loaded correctly.
$this
->assertResponse(200, 'Loaded the form to revert to the original revision of this node.');
// Try submitting the form.
$this
->drupalPost(NULL, array(), t('Revert'));
// Verify the page submission loaded correctly.
$this
->assertResponse(200);
// Confirm there are now three revisions.
$xpath = $this
->xpath("//body//div[@class='content']//table//tbody//tr");
$this
->assertEqual(count($xpath), 3, 'There are now three revisions of this node.');
// Load the current revision, which will now have the old meta tags.
$this
->drupalGet('node/' . $node->nid);
$this
->assertResponse(200, 'Loaded the current revision of this node.');
$xpath = $this
->xpath("//meta[@name='abstract']");
$this
->assertEqual(count($xpath), 1, 'Exactly one abstract meta tag found.');
$this
->assertNotEqual($xpath[0]['content'], $new_title . ' kittens', 'Did not find the new abstract meta tag.');
$this
->assertEqual($xpath[0]['content'], $old_title . ' ponies', 'Found the old abstract meta tag again.');
// Delete the original revision.
$this
->drupalGet('node/' . $node->nid . '/revisions/' . $old_vid . '/delete');
// Verify the page loaded correctly.
$this
->assertResponse(200, 'Loaded the form to delete the original revision of this node.');
// Try submitting the form.
$this
->drupalPost(NULL, array(), t('Delete'));
// Verify the page submission loaded correctly.
$this
->assertResponse(200);
// Confirm there are now two revisions again.
$xpath = $this
->xpath("//body//div[@class='content']//table//tbody//tr");
$this
->assertEqual(count($xpath), 2, 'There are two revisions of this node again.');
// Clear the caches and then load the current revision, just to confirm
// that the page is still loading correctly.
metatag_config_cache_clear();
$this
->drupalGet('node/' . $node->nid);
$this
->assertResponse(200, 'Loaded the current revision of this node again.');
$xpath = $this
->xpath("//meta[@name='abstract']");
$this
->assertEqual(count($xpath), 1, 'Exactly one abstract meta tag found.');
$this
->assertNotEqual($xpath[0]['content'], $new_title . ' kittens', 'Did not find the new abstract meta tag.');
$this
->assertEqual($xpath[0]['content'], $old_title . ' ponies', 'Found the old abstract meta tag again.');
// Delete the second revision.
$this
->drupalGet('node/' . $node->nid . '/revisions/' . $updated_vid . '/delete');
// Verify the page loaded correctly.
$this
->assertResponse(200, 'Loaded the form to delete the second revision of this node.');
// Try submitting the form.
$this
->drupalPost(NULL, array(), t('Delete'));
$this
->assertResponse(200);
// Verify that the revisions page no longer loads because there's only one
// revision now.
$this
->drupalGet('node/' . $node->nid . '/revisions');
$this
->assertResponse(403, 'No longer able to load the node revisions page.');
// Clear the caches and then load the current revision, just to confirm
// that the page is still loading correctly.
metatag_config_cache_clear();
$this
->drupalGet('node/' . $node->nid);
$this
->assertResponse(200, 'Loaded the current revision of this node again.');
$xpath = $this
->xpath("//meta[@name='abstract']");
$this
->assertEqual(count($xpath), 1, 'Exactly one abstract meta tag found.');
$this
->assertNotEqual($xpath[0]['content'], $new_title . ' kittens', 'Did not find the new abstract meta tag.');
$this
->assertEqual($xpath[0]['content'], $old_title . ' ponies', 'Found the old abstract meta tag again.');
}