You are here

public function RulesTriggerTestCase::testRecursionOnDifferentArguments in Rules 7.2

Same name and namespace in other branches
  1. 8.3 d7-tests/rules_test_trigger_case.test \RulesTriggerTestCase::testRecursionOnDifferentArguments()

Tests recursion prevention with altered arguments.

Ensure the recursion prevention still allows the rule to trigger again during evaluation of the same event set, if the event isn't caused by the rule itself - thus we won't run in an infinite loop.

File

tests/rules.test, line 1278
Rules tests.

Class

RulesTriggerTestCase
Test triggering rules.

Code

public function testRecursionOnDifferentArguments() {

  // Create rule1 - which might recurse.
  $rule = $this
    ->createTestRule(FALSE, 'node_update');
  $rule
    ->action('rules_node_make_sticky_action');
  $rule->label = 'rule 1';
  $rule
    ->integrityCheck()
    ->save();

  // Create rule2 - which triggers rule1 on another node.
  $node2 = $this
    ->drupalCreateNode(array(
    'type' => 'page',
    'sticky' => 0,
    'status' => 0,
  ));
  $rule2 = $this
    ->createTestRule(FALSE, 'node_update');
  $rule2
    ->action('rules_action_load_node', array(
    'nid' => $node2->nid,
  ))
    ->action('rules_node_make_sticky_action', array(
    'node:select' => 'node_loaded',
  ));
  $rule2->label = 'rule 2';
  $rule2
    ->save();

  // Now trigger both rules by generating the event.
  $node = $this
    ->drupalCreateNode(array(
    'type' => 'page',
    'sticky' => 0,
    'status' => 0,
  ));
  node_save($node);

  // debug(RulesLog::logger()->render());
  $text = RulesLog::logger()
    ->render();
  $pos = strpos($text, RulesTestCase::t('Evaluating conditions of rule %rule 1', array(
    'rule 1',
  )));
  $pos = $pos !== FALSE ? strpos($text, RulesTestCase::t('Evaluating conditions of rule %rule 2', array(
    'rule 2',
  )), $pos) : FALSE;
  $pos = $pos !== FALSE ? strpos($text, RulesTestCase::t('Saved %node_loaded of type %node.', array(
    'node_loaded',
    'node',
  )), $pos) : FALSE;
  $pos = $pos !== FALSE ? strpos($text, RulesTestCase::t('Evaluating conditions of rule %rule 1', array(
    'rule 1',
  )), $pos) : FALSE;
  $pos = $pos !== FALSE ? strpos($text, RulesTestCase::t('Not evaluating reaction rule %rule 2 to prevent recursion', array(
    'rule 2',
  )), $pos) : FALSE;
  $this
    ->assertTrue($pos !== FALSE, 'Rule1 was triggered on the event caused by Rule2.');
}