You are here

readmorecontrol.test in Read More Control 7

File

readmorecontrol.test
View source
<?php

/**
 * @file
 * Tests for readmorecontrol.module.
 */

/**
 * Tests for number field types.
 */
class ReadMoreControlTestCase extends DrupalWebTestCase {
  protected $field;
  protected $instance;
  protected $webUser;

  /**
   * Implements DrupalWebTestCase::getInfo().
   */
  public static function getInfo() {
    return array(
      'name' => 'Base tests',
      'description' => 'Test the creation of a number of fields and the responses found when looking for the Read more link on node entities.',
      'group' => 'Read More Control',
    );
  }

  /**
   * Implements DrupalWebTestCase::setUp().
   */
  function setUp() {
    parent::setUp(array(
      'field_test',
      'readmorecontrol',
    ));
    $this->webUser = $this
      ->drupalCreateUser(array(
      'access field_test content',
      'administer field_test content',
      'administer content types',
      'administer nodes',
      'bypass node access',
    ));
    $this
      ->drupalLogin($this->webUser);
  }

  /**
   * Test that settings are saved against the node entity type and that these
   * are updated if the content type is renamed.
   */
  function testNodeTypeSettings() {

    // See if our option shows up on the edit pages.
    $this
      ->drupalGet('admin/structure/types/manage/page');
    $this
      ->assertFieldChecked('edit-readmorecontrol-node-default');
    $this
      ->assertNoFieldChecked('edit-readmorecontrol-node-when-required');
    $this
      ->assertNoFieldChecked('edit-readmorecontrol-node-never');
    $edit = array(
      'readmorecontrol_behaviour__node_' => 'when_required',
    );
    $this
      ->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
    $this
      ->assertRaw(t('The content type %type has been updated.', array(
      '%type' => 'Basic page',
    )));

    // Check that there is no strange interaction with other types.
    $this
      ->drupalGet('admin/structure/types/manage/article');
    $this
      ->assertFieldChecked('edit-readmorecontrol-node-default');
    $this
      ->drupalGet('admin/structure/types/manage/page');
    $this
      ->assertFieldChecked('edit-readmorecontrol-node-when-required');

    // Change type and test.
    $edit = array(
      'type' => 'pp',
    );
    $this
      ->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
    $this
      ->assertRaw(t('The content type %type has been updated.', array(
      '%type' => 'Basic page',
    )));
    $this
      ->drupalGet('admin/structure/types/manage/pp');
    $this
      ->assertFieldChecked('edit-readmorecontrol-node-when-required');

    // Check that there is no strange interaction with other types.
    $this
      ->drupalGet('admin/structure/types/manage/article');
    $this
      ->assertFieldChecked('edit-readmorecontrol-node-default');
    $edit = array(
      'readmorecontrol_behaviour__node_' => 'never',
    );
    $this
      ->drupalPost('admin/structure/types/manage/pp', $edit, t('Save content type'));
    $this
      ->assertRaw(t('The content type %type has been updated.', array(
      '%type' => 'Basic page',
    )));
    $this
      ->drupalGet('admin/structure/types/manage/pp');
    $this
      ->assertFieldChecked('edit-readmorecontrol-node-never');

    // Revert type settings and test.
    $edit = array(
      'type' => 'page',
    );
    $this
      ->drupalPost('admin/structure/types/manage/pp', $edit, t('Save content type'));
    $this
      ->assertRaw(t('The content type %type has been updated.', array(
      '%type' => 'Basic page',
    )));
    $this
      ->drupalGet('admin/structure/types/manage/page');
    $this
      ->assertFieldChecked('edit-readmorecontrol-node-never');
    $this
      ->drupalGet('admin/structure/types/manage/article');
    $this
      ->assertFieldChecked('edit-readmorecontrol-node-default');
  }

  /**
   * Tests three node content types and fields.
   *
   * The node bundles used are:
   *   - page
   *   - article
   *   - test
   *
   * We add one content type, test, and add fields to each:
   *   - long_text: A long text field with summary. (@todo)
   *   - number: An integer field.
   *   - short_text: An inline text field. (@todo)
   *   - options: A list field. (@todo)
   */
  function testNodeEntities() {

    // Add the third content type 'test'.
    $this
      ->drupalGet('admin/structure/types/add');
    $edit = array(
      'name' => 'Test',
      'type' => 'test',
    );
    $this
      ->drupalPost(NULL, $edit, t('Save and add fields'));

    // Configure the settings for each type.
    // Set the article type to always display.
    $edit = array(
      'readmorecontrol_behaviour__node_' => 'always',
    );
    $this
      ->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
    $this
      ->assertRaw(t('The content type %type has been updated.', array(
      '%type' => 'Basic page',
    )));

    // Set the article type to never display.
    $edit = array(
      'readmorecontrol_behaviour__node_' => 'never',
    );
    $this
      ->drupalPost('admin/structure/types/manage/article', $edit, t('Save content type'));
    $this
      ->assertRaw(t('The content type %type has been updated.', array(
      '%type' => 'Article',
    )));

    // Set the test type to conditionally display.
    $edit = array(
      'readmorecontrol_behaviour__node_' => 'when_required',
    );
    $this
      ->drupalPost('admin/structure/types/manage/test', $edit, t('Save content type'));
    $this
      ->assertRaw(t('The content type %type has been updated.', array(
      '%type' => 'Test',
    )));

    // Creates the number field 'field_number' with display set to
    // 'number_unformatted'.
    $this
      ->addNumberIntegerField('node', 'page');
    $this
      ->addNumberIntegerField('node', 'article');
    $this
      ->addNumberIntegerField('node', 'test');

    // Normalise the defaults formatter settings to be equal.
    // Update all teaser displays to have the same settings as the full display.
    $edit = array(
      'fields[body][type]' => 'text_default',
      'fields[field_number][type]' => 'number_integer',
    );
    $this
      ->drupalPost('admin/structure/types/manage/page/display', $edit, t('Save'));
    $this
      ->drupalPost('admin/structure/types/manage/test/display', $edit, t('Save'));
    $this
      ->drupalPost('admin/structure/types/manage/page/display/teaser', $edit, t('Save'));
    $this
      ->drupalPost('admin/structure/types/manage/test/display/teaser', $edit, t('Save'));

    // Article has tags and image too.
    $edit = array(
      'fields[body][type]' => 'text_default',
      'fields[field_number][type]' => 'number_integer',
      'fields[field_tags][type]' => 'taxonomy_term_reference_link',
      'fields[field_image][type]' => 'hidden',
    );
    $this
      ->drupalPost('admin/structure/types/manage/article/display', $edit, t('Save'));
    $this
      ->drupalPost('admin/structure/types/manage/article/display/teaser', $edit, t('Save'));

    // Test empty fields. If all fields are empty, no read more should appear.
    $langcode = LANGUAGE_NONE;
    $edit = array();
    $edit['status'] = 1;
    $edit['promote'] = 1;
    $node_page = $this
      ->createNode('page', $edit);
    $page_more_link = t('Read more<span class="element-invisible"> about @title</span>', array(
      '@title' => strip_tags($node_page->title),
    ));
    $node_article = $this
      ->createNode('article', $edit);
    $article_more_link = t('Read more<span class="element-invisible"> about @title</span>', array(
      '@title' => strip_tags($node_article->title),
    ));
    $node_test = $this
      ->createNode('test', $edit);
    $test_more_link = t('Read more<span class="element-invisible"> about @title</span>', array(
      '@title' => strip_tags($node_test->title),
    ));

    // Page always displays, article never does and test is conditional.
    $this
      ->drupalGet('node');
    $this
      ->assertText($node_page->title);
    $this
      ->assertText($node_article->title);
    $this
      ->assertText($node_test->title);
    $this
      ->assertRaw($page_more_link);
    $this
      ->assertNoRaw($article_more_link);

    // The empty fields should never trigger a read more link.
    $this
      ->assertNoRaw($test_more_link);

    // Create a large text chunk.
    $text = $this
      ->randomName(10000);
    $node_page->body[$langcode][0]['value'] = $text;
    node_save($node_page);
    $node_article->body[$langcode][0]['value'] = $text;
    node_save($node_article);
    $node_test->body[$langcode][0]['value'] = $text;
    node_save($node_test);
    $this
      ->drupalGet('node');
    $this
      ->assertText($node_page->title);
    $this
      ->assertText($node_article->title);
    $this
      ->assertText($node_test->title);
    $this
      ->assertRaw($page_more_link);
    $this
      ->assertNoRaw($article_more_link);

    // The body field shouldn't trigger a read more link as the displays are
    // now the same.
    $this
      ->assertNoRaw($test_more_link);

    // Update all teaser displays to show reduced size, 600 by default.
    $edit = array(
      'fields[body][type]' => 'text_summary_or_trimmed',
    );
    $this
      ->drupalPost('admin/structure/types/manage/page/display/teaser', $edit, t('Save'));
    $this
      ->drupalPost('admin/structure/types/manage/test/display/teaser', $edit, t('Save'));
    $this
      ->drupalPost('admin/structure/types/manage/article/display/teaser', $edit, t('Save'));

    // The body field should trigger a read more link.
    $this
      ->drupalGet('node');
    $this
      ->assertText($node_page->title);
    $this
      ->assertText($node_article->title);
    $this
      ->assertText($node_test->title);
    $this
      ->assertRaw($page_more_link);
    $this
      ->assertNoRaw($article_more_link);
    $this
      ->assertRaw($test_more_link);

    // Short text should not trigger it.
    $text = $this
      ->randomName(10);
    $node_page->body[$langcode][0]['value'] = $text;
    node_save($node_page);
    $node_article->body[$langcode][0]['value'] = $text;
    node_save($node_article);
    $node_test->body[$langcode][0]['value'] = $text;
    node_save($node_test);
    $this
      ->drupalGet('node');
    $this
      ->assertRaw($page_more_link);
    $this
      ->assertNoRaw($article_more_link);
    $this
      ->assertNoRaw($test_more_link);

    // Set an integer value.
    $node_page->field_number[$langcode][0]['value'] = 123;
    $node_page->body[$langcode][0]['value'] = '';
    node_save($node_page);
    $node_article->body[$langcode][0]['value'] = '';
    $node_article->field_number[$langcode][0]['value'] = 123;
    node_save($node_article);
    $node_test->body[$langcode][0]['value'] = '';
    $node_test->field_number[$langcode][0]['value'] = 123;
    node_save($node_test);
    $this
      ->drupalGet('node');
    $this
      ->assertRaw($page_more_link);
    $this
      ->assertNoRaw($article_more_link);
    $this
      ->assertNoRaw($test_more_link);

    // Update all teaser displays to have the same settings as the full display.
    $edit = array(
      'fields[field_number][type]' => 'hidden',
    );
    $this
      ->drupalPost('admin/structure/types/manage/page/display/teaser', $edit, t('Save'));
    $this
      ->drupalPost('admin/structure/types/manage/test/display/teaser', $edit, t('Save'));
    $this
      ->drupalPost('admin/structure/types/manage/article/display/teaser', $edit, t('Save'));
    $this
      ->drupalGet('node');
    $this
      ->assertRaw($page_more_link);
    $this
      ->assertNoRaw($article_more_link);
    $this
      ->assertRaw($test_more_link);

    // A different display will trigger a read-more link.
    $edit = array(
      'fields[field_number][type]' => 'number_unformatted',
    );
    $this
      ->drupalPost('admin/structure/types/manage/page/display/teaser', $edit, t('Save'));
    $this
      ->drupalPost('admin/structure/types/manage/test/display/teaser', $edit, t('Save'));
    $this
      ->drupalPost('admin/structure/types/manage/article/display/teaser', $edit, t('Save'));
    $this
      ->drupalGet('node');
    $this
      ->assertRaw($page_more_link);
    $this
      ->assertNoRaw($article_more_link);
    $this
      ->assertRaw($test_more_link);

    // The same display will not trigger a read-more link.
    $edit = array(
      'fields[field_number][type]' => 'number_integer',
    );
    $this
      ->drupalPost('admin/structure/types/manage/article/display/teaser', $edit, t('Save'));
    $this
      ->drupalGet('node');

    // Conditional.
    $this
      ->assertRaw($test_more_link);
  }

  /**
   * Adds a number_integer field and sets the default formatter options.
   */
  function addNumberIntegerField($entity_type, $entity_bundle, $field_name = 'field_number', $display = 'number_unformatted') {

    // Create a field with settings to validate.
    $field = field_info_field($field_name);
    if (empty($field)) {
      $field = array(
        'field_name' => $field_name,
        'type' => 'number_integer',
        'settings' => array(),
      );
      field_create_field($field);
    }
    $instance = field_info_instance($entity_type, $field_name, $entity_bundle);
    if (!$instance) {
      $instance = array(
        'field_name' => $field_name,
        'entity_type' => $entity_type,
        'bundle' => $entity_bundle,
        'widget' => array(
          'type' => 'number',
        ),
        'display' => array(
          'default' => array(
            'type' => $display,
          ),
        ),
      );
      field_create_instance($instance);
    }
    else {

      // Updates the formatter if required.
      $this
        ->setNodeFieldDisplay($entity_type, $field_name, $display);
    }
  }

  /**
   * Helper method to set a node field display.
   */
  function setNodeFieldDisplay($entity_type, $field_name, $display) {
    $this
      ->drupalGet("admin/structure/types/manage/{$entity_type}/display");
    $edit = array(
      "fields[{$field_name}][type]" => $display,
    );
    $this
      ->drupalPost(NULL, $edit, t('Save'));
  }

  /**
   * Helper method to create a new node.
   */
  function createNode($bundle, $edit = array()) {
    $edit['title'] = $this
      ->randomName(8);
    $this
      ->drupalPost("node/add/{$bundle}", $edit, t('Save'));

    // Check that the node exists in the database.
    return $this
      ->drupalGetNodeByTitle($edit['title']);
  }

  /**
   * Helper method to load a node from a title.
   */
  function drupalGetNodeByTitle($title, $reset = FALSE) {

    // Load the first node returned from the database.
    $nodes = node_load_multiple(array(), array(
      'title' => $title,
    ), $reset);
    $node = reset($nodes);
    return $node;
  }

}

Classes

Namesort descending Description
ReadMoreControlTestCase Tests for number field types.