You are here

node_reference.test in References 7.2

Initial node_reference tests.

File

node_reference/node_reference.test
View source
<?php

/**
 * @file
 * Initial node_reference tests.
 */

/**
 * Unit tests for referenceability of node types in entity forms.
 */
class NodeReferenceFormTest extends FieldTestCase {

  /**
   * Get Info.
   */
  public static function getInfo() {
    return array(
      'name' => 'Node reference',
      'description' => 'Make sure nodes are referenceable in entity forms.',
      'group' => 'References',
    );
  }

  /**
   * Setup.
   */
  public function setUp() {
    parent::setUp(array(
      'node_reference',
      'field_test',
    ));
    $this->langcode = LANGUAGE_NONE;
    $this->field_name = 'test_node_reference';
    $this->field = array(
      'field_name' => $this->field_name,
      'type' => 'node_reference',
      'cardinality' => 1,
      'settings' => array(
        'referenceable_types' => array_keys(node_type_get_names()),
      ),
    );
    $this->field = field_create_field($this->field);
    $this->instance = array(
      'field_name' => $this->field_name,
      'entity_type' => 'test_entity',
      'bundle' => 'test_bundle',
      'widget' => array(
        'type' => 'options_buttons',
      ),
    );
    $this->instance = field_create_instance($this->instance);
    $this->nodes = array();
    foreach (node_type_get_names() as $type_name => $type_title) {
      $this->nodes[$type_name] = $this
        ->drupalCreateNode(array(
        'type' => $type_name,
        'title' => $this
          ->randomName(8),
      ));
      $this
        ->pass(t('Created %type node %nid: %title', array(
        '%type' => $type_name,
        '%nid' => $this->nodes[$type_name]->nid,
        '%title' => $this->nodes[$type_name]->title,
      )), 'destination creation');
    }
  }

  /**
   * Function to run Referenceable Node Test.
   */
  public function runReferenceableNodeTest($allowed, $group) {
    field_update_field(array(
      'field_name' => $this->field_name,
      'settings' => array(
        'referenceable_types' => array_keys($allowed),
      ),
    ));
    $entity = field_test_create_stub_entity();
    $form = drupal_get_form('field_test_entity_form', $entity);
    $options = $form[$this->field_name][$this->langcode]['#options'];
    $this
      ->assertTrue(isset($options['_none']), t('Empty choice offered for reference'), $group);
    unset($options['_none']);
    foreach ($this->nodes as $node) {
      if (isset($allowed[$node->type])) {
        $this
          ->assertTrue(isset($options[$node->nid]), t('Node of type @type is referenceable', array(
          '@type' => $node->type,
        )), $group);
      }
      else {
        $this
          ->assertFalse(isset($options[$node->nid]), t('Node of type @type is not referenceable', array(
          '@type' => $node->type,
        )), $group);
      }
      unset($options[$node->nid]);
    }
    $this
      ->assertTrue(empty($options), t('No extra choice is referenceable'), $group);
  }

  /**
   * Test unlimited referencing.
   */
  public function testReferenceableNodeTypesAll() {
    $allowed = node_type_get_names();
    $this
      ->runReferenceableNodeTest($allowed, t('Unimited referencing'));
  }

  /**
   * Test referencing a limited list of node types.
   */
  public function testReferenceableNodeTypesOne() {
    $allowed = array_slice(node_type_get_names(), 0, 1, TRUE);
    $this
      ->runReferenceableNodeTest($allowed, t('Limited referencing'));
  }

  /**
   * Test autocomplete widget.
   */
  public function testLongNodeReferenceWidget() {

    // Create regular test user.
    $web_user = $this
      ->drupalCreateUser(array(
      'create article content',
      'access content',
    ));
    $this
      ->drupalLogin($web_user);

    // Create test field instance on article node type.
    $instance = array(
      'field_name' => $this->field_name,
      'entity_type' => 'node',
      'bundle' => 'article',
      'widget' => array(
        'type' => 'node_reference_autocomplete',
      ),
    );
    $instance = field_create_instance($instance);

    // Create a node with a short title and a node with a title longer than
    // 128 characters.
    $node_short_title = $this
      ->drupalCreateNode(array(
      'type' => 'page',
      'title' => $this
        ->randomName(8),
    ));
    $node_long_title = $this
      ->drupalCreateNode(array(
      'type' => 'page',
      'title' => $this
        ->randomName(200),
    ));

    // Display node creation form.
    $langcode = LANGUAGE_NONE;
    $this
      ->drupalGet('node/add/article');
    $this
      ->assertFieldByName("{$this->field_name}[{$langcode}][0][nid]", '', t('Widget is displayed'));

    // Submit node form with autocomplete value for short title.
    $edit = array(
      'title' => $this
        ->randomName(8),
      "{$this->field_name}[{$langcode}][0][nid]" => $node_short_title->title . ' [nid:' . $node_short_title->nid . ']',
    );
    $this
      ->drupalPost('node/add/article', $edit, t('Save'));
    $this
      ->assertRaw(t('!post %title has been created.', array(
      '!post' => 'Article',
      '%title' => $edit["title"],
    )), t('Article created.'));
    $this
      ->assertText($node_short_title->title, t('Referenced node title is displayed.'));

    // Submit node form with autocomplete value for long title.
    $edit = array(
      'title' => $this
        ->randomName(8),
      "{$this->field_name}[{$langcode}][0][nid]" => $node_long_title->title . ' [nid:' . $node_long_title->nid . ']',
    );
    $this
      ->drupalPost('node/add/article', $edit, t('Save'));
    $this
      ->assertRaw(t('!post %title has been created.', array(
      '!post' => 'Article',
      '%title' => $edit["title"],
    )), t('Article created.'));
    $this
      ->assertText($node_long_title->title, t('Referenced node title is displayed.'));
  }

}

Classes

Namesort descending Description
NodeReferenceFormTest Unit tests for referenceability of node types in entity forms.