function RulesIntegrationTestCase::testDataIntegration

Same name in other branches
  1. 8.x-3.x d7-tests/rules_integration_test_case.test \RulesIntegrationTestCase::testDataIntegration()

Tests data integration.

File

tests/rules.test, line 1413

Class

RulesIntegrationTestCase
Tests provided module integration.

Code

public function testDataIntegration() {
    // Test data_create action.
    $action = rules_action('data_create', array(
        'type' => 'log_entry',
        'param_type' => 'rules_test',
        'param_message' => 'Rules test log message',
        'param_severity' => WATCHDOG_WARNING,
        'param_request_uri' => 'http://example.com',
        'param_link' => '',
    ));
    $action->access();
    $action->execute();
    $text = RulesLog::logger()->render();
    $pos = strpos($text, RulesTestCase::t('Added the provided variable %data_created of type %log_entry', array(
        'data_created',
        'log_entry',
    )));
    $this->assertTrue($pos !== FALSE, 'Data of type log entry has been created.');
    // Test variable_add action.
    $action = rules_action('variable_add', array(
        'type' => 'text_formatted',
        'value' => array(
            'value' => 'test text',
            'format' => 1,
        ),
    ));
    $action->access();
    $action->execute();
    $text = RulesLog::logger()->render();
    $pos = strpos($text, RulesTestCase::t('Added the provided variable %variable_added of type %text_formatted', array(
        'variable_added',
        'text_formatted',
    )));
    $this->assertTrue($pos !== FALSE, 'Data of type text formatted has been created.');
    // Test using the list actions.
    $rule = rule(array(
        'list' => array(
            'type' => 'list<text>',
            'label' => 'A list of text',
        ),
    ));
    $rule->action('list_add', array(
        'list:select' => 'list',
        'item' => 'bar2',
    ));
    $rule->action('list_add', array(
        'list:select' => 'list',
        'item' => 'bar',
        'pos' => 'start',
    ));
    $rule->action('list_add', array(
        'list:select' => 'list',
        'item' => 'bar',
        'unique' => TRUE,
    ));
    $rule->action('list_remove', array(
        'list:select' => 'list',
        'item' => 'bar2',
    ));
    $list = entity_metadata_wrapper('list', array(
        'foo',
        'foo2',
    ));
    $rule->execute($list);
    RulesLog::logger()->checkLog();
    $this->assertEqual($list->value(), array(
        'bar',
        'foo',
        'foo2',
    ), 'List items removed and added.');
    $this->assertFalse(rules_condition('list_contains')->execute($list, 'foo-bar'), 'Condition "List item contains" evaluates to FALSE');
    $this->assertTrue(rules_condition('list_contains')->execute($list, 'foo'), 'Condition "List item contains" evaluates to TRUE');
    // debug(RulesLog::logger()->render());
    // Test data_is condition with IN operation.
    $rule = rule(array(
        'node' => array(
            'type' => 'node',
        ),
    ));
    $rule->condition('data_is', array(
        'data:select' => 'node:title',
        'op' => 'IN',
        'value' => array(
            'foo',
            'bar',
        ),
    ));
    $rule->action('data_set', array(
        'data:select' => 'node:title',
        'value' => 'bar',
    ));
    $rule->integrityCheck();
    $node = $this->drupalCreateNode(array(
        'title' => 'foo',
    ));
    $rule->execute($node);
    $this->assertEqual($node->title, 'bar', "Data comparison using IN operation evaluates to TRUE.");
    // Test Condition: Data is empty.
    $rule = rule(array(
        'node' => array(
            'type' => 'node',
        ),
    ));
    $rule->condition('data_is_empty', array(
        'data:select' => 'node:title',
    ));
    $rule->action('data_set', array(
        'data:select' => 'node:title',
        'value' => 'bar',
    ));
    $rule->integrityCheck();
    // Data is empty condition evaluates to TRUE
    // for node with empty title, action sets title to 'bar'.
    $node = $this->drupalCreateNode(array(
        'title' => '',
        'type' => 'article',
    ));
    $rule->execute($node);
    $this->assertEqual($node->title, 'bar', "Data is empty condition evaluates to TRUE for node with empty title, action sets title to 'bar'.");
    // Data is empty condition evaluates to FALSE
    // for node with title 'foo', action is not executed.
    $node = $this->drupalCreateNode(array(
        'title' => 'foo',
        'type' => 'article',
    ));
    $rule->execute($node);
    $this->assertEqual($node->title, 'foo', "Data is empty condition evaluates to FALSE for node with title 'foo', action is not executed.");
    // Data is empty condition evaluates to TRUE for the parent of a
    // not existing term in the tags field of the node.
    $rule = rule(array(
        'node' => array(
            'type' => 'node',
        ),
    ));
    $rule->condition('node_is_of_type', array(
        'type' => array(
            'article',
        ),
    ));
    $rule->condition('data_is_empty', array(
        'data:select' => 'node:field-tags:0:parent',
    ));
    $rule->action('data_set', array(
        'data:select' => 'node:title',
        'value' => 'bar',
    ));
    $rule->integrityCheck();
    $node = $this->drupalCreateNode(array(
        'title' => 'foo',
        'type' => 'article',
    ));
    $rule->execute($node);
    $this->assertEqual($node->title, 'bar', "Data is empty condition evaluates to TRUE for not existing data structures");
    // Test Action: Calculate a value.
    $rule = rule(array(
        'node' => array(
            'type' => 'node',
        ),
    ));
    $rule->action('data_calc', array(
        'input_1:select' => 'node:nid',
        'op' => '*',
        'input_2' => 2,
    ));
    $rule->action('data_set', array(
        'data:select' => 'node:title',
        'value:select' => 'result',
    ));
    $rule->integrityCheck();
    $rule->execute($node);
    $this->assertEqual($node->title, $node->nid * 2, "Value has been calculated.");
    // Test moving a date.
    $action_set = rules_action_set(array(
        'date' => array(
            'type' => 'date',
        ),
    ), array(
        'date',
    ));
    $action_set->action('data_calc', array(
        'input_1:select' => 'date',
        'op' => '+',
        'input_2' => 3600,
    ))
        ->action('data_set', array(
        'data:select' => 'date',
        'value:select' => 'result',
    ));
    $action_set->integrityCheck();
    list($result) = $action_set->execute(REQUEST_TIME);
    $this->assertEqual($result, REQUEST_TIME + 3600, 'Used data calculation action to move a date by an hour.');
    // Test data type conversion action.
    $set = rules_action_set(array(
        'result' => array(
            'type' => 'text',
            'parameter' => FALSE,
        ),
    ), array(
        'result',
    ));
    $set->action('data_convert', array(
        'type' => 'text',
        'value:select' => 'site:login-url',
    ));
    $set->action('data_set', array(
        'data:select' => 'result',
        'value:select' => 'conversion_result',
    ));
    list($result) = $set->execute();
    $set->integrityCheck();
    $this->assertEqual($result, url('user', array(
        'absolute' => TRUE,
    )), 'Converted URI to text.');
    $set = rules_action_set(array(
        'result' => array(
            'type' => 'integer',
            'parameter' => FALSE,
        ),
        'source' => array(
            'type' => 'text',
        ),
    ), array(
        'result',
    ));
    $set->action('data_convert', array(
        'type' => 'integer',
        'value:select' => 'source',
    ));
    $set->action('data_set', array(
        'data:select' => 'result',
        'value:select' => 'conversion_result',
    ));
    list($result) = $set->execute('9.4');
    $this->assertEqual($result, 9, 'Converted decimal to integer using rounding.');
    $set = rules_action_set(array(
        'result' => array(
            'type' => 'integer',
            'parameter' => FALSE,
        ),
        'source' => array(
            'type' => 'text',
        ),
    ), array(
        'result',
    ));
    $set->action('data_convert', array(
        'type' => 'integer',
        'value:select' => 'source',
        'rounding_behavior' => 'down',
    ));
    $set->action('data_set', array(
        'data:select' => 'result',
        'value:select' => 'conversion_result',
    ));
    list($result) = $set->execute('9.6');
    $this->assertEqual($result, 9, 'Converted decimal to integer using rounding behavior down.');
    $set = rules_action_set(array(
        'result' => array(
            'type' => 'integer',
            'parameter' => FALSE,
        ),
        'source' => array(
            'type' => 'text',
        ),
    ), array(
        'result',
    ));
    $set->action('data_convert', array(
        'type' => 'integer',
        'value:select' => 'source',
        'rounding_behavior' => 'up',
    ));
    $set->action('data_set', array(
        'data:select' => 'result',
        'value:select' => 'conversion_result',
    ));
    list($result) = $set->execute('9.4');
    $this->assertEqual($result, 10, 'Converted decimal to integer using rounding behavior up.');
    // Test text matching condition.
    $result = rules_condition('text_matches')->execute('my-text', 'text', 'contains');
    $result2 = rules_condition('text_matches')->execute('my-text', 'tex2t', 'contains');
    $this->assertTrue($result && !$result2, 'Text matching condition using operation contain evaluated.');
    $result = rules_condition('text_matches')->execute('my-text', 'my', 'starts');
    $result2 = rules_condition('text_matches')->execute('my-text', 'text', 'starts');
    $this->assertTrue($result && !$result2, 'Text matching condition using operation starts evaluated.');
    $result = rules_condition('text_matches')->execute('my-text', 'text', 'ends');
    $result2 = rules_condition('text_matches')->execute('my-text', 'my', 'ends');
    $this->assertTrue($result && !$result2, 'Text matching condition using operation ends evaluated.');
    $result = rules_condition('text_matches')->execute('my-text', 'me?y-texx?t', 'regex');
    $result2 = rules_condition('text_matches')->execute('my-text', 'me+y-texx?t', 'regex');
    $this->assertTrue($result && !$result2, 'Text matching condition using operation regex evaluated.');
}