You are here

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.');
}