You are here

relation.rules.test in Relation 7

Tests for Rules support.

File

tests/relation.rules.test
View source
<?php

/**
 * @file
 * Tests for Rules support.
 */

/**
 * Functional test of Relation's integration with Rules.
 */
class RelationRulesTestCase extends RelationTestCase {
  public static function getInfo() {
    return array(
      'name' => 'Relation Rules integration test',
      'description' => 'Test the Rules integration.',
      'group' => 'Relation',
    );
  }
  function setUp() {
    parent::setUp('relation', 'rules');
  }

  /**
   * Test to create a relation in different ways by executing a rule.
   */
  function testRelationCreateRelation() {
    $node = $this
      ->drupalCreateNode(array(
      'type' => 'article',
    ));
    $user = $this
      ->drupalCreateUser();
    $endpoints = array(
      entity_metadata_wrapper('node', $node),
      entity_metadata_wrapper('user', $user),
    );

    // Test to create a relation by setting two endpoints and saving it. This
    // primarily tests the endpoint property set callback.
    $rule = rule();
    $rule
      ->action('entity_create', array(
      'type' => 'relation',
      'param_relation_type' => $this->relation_types['symmetric']['relation_type'],
      'param_author:select' => 'site:current-user',
      'param_endpoints' => $endpoints,
      'entity_created:var' => 'relation',
    ));
    $rule
      ->execute();

    // There is no way for the rule to return the created relation. So get the
    // last inserted id, which should be the relation we are looking for.
    $rid = db_query('SELECT MAX(rid) FROM {relation}')
      ->fetchField();

    // If all went well, we should now have a relation with correct endpoints.
    $relation = relation_load($rid);
    $correct = $relation->endpoints[LANGUAGE_NONE][0]['entity_id'] == $node->nid && $relation->endpoints[LANGUAGE_NONE][1]['entity_id'] == $user->uid;
    $this
      ->assertTrue($correct, 'Relation was created by setting two endpoints from rule context and saving it.');

    // Test to create a relation by first fetching the endpoints from the
    // last relation and then settings them in a new one. This primarily tests
    // the endpoint property get callback.
    $rule = rule();

    // This will load a relation into the context of the rule.
    $rule
      ->action('entity_fetch', array(
      'type' => 'relation',
      'id' => $rid,
    ));
    $rule
      ->action('entity_create', array(
      'type' => 'relation',
      'param_relation_type' => $this->relation_types['symmetric']['relation_type'],
      'param_author:select' => 'site:current-user',
      // Now, load the endpoints from the fetched relation, into a new relation.
      'param_endpoints:select' => 'entity-fetched:endpoints',
      'entity_created:var' => 'relation',
    ));
    $rule
      ->execute();

    // There is no way for the rule to return the created relation. So get the
    // last inserted id, which should be the relation we are looking for.
    $rid = db_query('SELECT MAX(rid) FROM {relation}')
      ->fetchField();
    $relation = relation_load($rid);

    // The $node and the $user should be the the same as in the last test, since
    // we fetched the endpoits from that relation.
    $correct = $relation->endpoints[LANGUAGE_NONE][0]['entity_id'] == $node->nid && $relation->endpoints[LANGUAGE_NONE][1]['entity_id'] == $user->uid;
    $this
      ->assertTrue($correct, 'Relation was created by fetching endpoints from another relation and saving it.');
  }

  /**
   * Test that relation options are available in rules admin UIs.
   */
  function testRelationInRulesAdmin() {

    // Tests that relation properties are available in rules. So create a new
    // rule with relation action, and check that the text is available among the
    // "Data selectors" list.
    // Enables UI module for rules.
    module_enable(array(
      'rules_admin',
    ));

    // Resets permissions, because module_enable() doesn't clear static cache.
    $this
      ->checkPermissions(array(), TRUE);

    // Creates new user.
    $user = $this
      ->drupalCreateUser(array(
      'administer rules',
    ));
    $this
      ->drupalLogin($user);

    // Cleares the cache, becaues UI module's menu items don't exists.
    drupal_flush_all_caches();

    // Creates rule.
    $this
      ->drupalGet('admin/config/workflow/rules/reaction/add');
    $post = array(
      'settings[label]' => 'Similar',
      'settings[name]' => 'similar',
      'event' => 'node_view',
    );
    $this
      ->drupalPost(NULL, $post, t('Save'));

    // Adds action.
    // Temporary workaround, with taxonomy module enabled this Add action click
    // link triggers:
    //   Exception Notice   Trying to get property of non-object
    //     callbacks.inc      827 entity_metadata_taxonomy_access()
    module_disable(array(
      'taxonomy',
    ));
    $this
      ->clickLink(t('Add action'));
    $post = array(
      'element_name' => 'relation_rules_load_related',
    );
    $this
      ->drupalPost(NULL, $post, t('Continue'));
    $this
      ->assertText('node:relation-directional-node-reverse:0', t('The created relation porperties\' are found.'));
  }
  function testRelationLoadRelatedRules() {
    $nid = $this->node1->nid;
    variable_set('relation_rules_test_nid', $nid);
    module_enable(array(
      'relation_rules_test',
    ));
    $this->node6 = $this
      ->drupalCreateNode(array(
      'type' => 'article',
    ));
    for ($i = 1; $i <= 6; $i++) {
      $property = "node{$i}";
      $node = $this->{$property};
      if ($node->nid == $nid) {
        $this
          ->assertFalse((bool) db_query_range('SELECT * FROM {node} WHERE nid = :nid', 0, 1, array(
          ':nid' => $nid,
        ))
          ->fetchField(), t('The correct node was deleted'));
      }
      else {
        $nids[] = $node->nid;
      }
    }
    $count = count($nids);
    $this
      ->assertEqual($count, db_query('SELECT COUNT(*) FROM {node} WHERE nid IN (:nids)', array(
      ':nids' => $nids,
    ))
      ->fetchField(), t('@count other nodes were found', array(
      '@count' => $count,
    )));
  }

}

Classes

Namesort descending Description
RelationRulesTestCase Functional test of Relation's integration with Rules.