You are here

public function RulesSchedulerTestCase::testRecursionPrevention in Rules 7.2

Makes sure recursion prevention is working fine for scheduled rule sets.

File

rules_scheduler/tests/rules_scheduler.test, line 74
Rules Scheduler tests.

Class

RulesSchedulerTestCase
Test cases for the Rules Scheduler module.

Code

public function testRecursionPrevention() {
  $set = rules_rule_set(array(
    'node1' => array(
      'type' => 'node',
      'label' => 'node',
    ),
  ));
  $set
    ->rule(rule()
    ->condition('node_is_published', array(
    'node:select' => 'node1',
  ))
    ->action('node_unpublish', array(
    'node:select' => 'node1',
  )));
  $set
    ->integrityCheck()
    ->save('rules_test_set_2');

  // Add an reaction rule that is triggered upon a node save. The scheduled
  // component changes the node, thus it would be scheduled again and run in
  // an endless loop.
  $rule = rules_reaction_rule();
  $rule
    ->event('node_insert');
  $rule
    ->event('node_update');
  $rule
    ->action('schedule', array(
    'component' => 'rules_test_set_2',
    'identifier' => 'test_recursion_prevention',
    'date' => 'now',
    'param_node1:select' => 'node',
  ));
  $rule
    ->save();

  // Create a node, what triggers the rule.
  $node = $this
    ->drupalCreateNode(array(
    'title' => 'The title.',
    'status' => 1,
  ));

  // Run cron to let the rules scheduler do its work.
  $this
    ->cronRun();
  $node = node_load($node->nid, NULL, TRUE);
  $this
    ->assertFalse($node->status, 'The component has been properly scheduled.');

  // Create a simple user account with permission to see the dblog.
  $user = $this
    ->drupalCreateUser(array(
    'access site reports',
  ));
  $this
    ->drupalLogin($user);

  // View the database log.
  $this
    ->drupalGet('admin/reports/dblog');

  // Can't use
  // $this->clickLink('Rules debug information: " Scheduled evaluation...')
  // because xpath doesn't allow : or " in the string.
  // So instead, use our own xpath to figure out the href of the second link
  // on the page (the first link is the most recent log entry, which is the
  // log entry for the user login, above.)
  // All links.
  $links = $this
    ->xpath('//a[contains(@href, :href)]', array(
    ':href' => 'admin/reports/event/',
  ));

  // Strip off /?q= from href.
  $href = explode('=', $links[1]['href']);

  // Click the link for the RulesLog entry.
  $this
    ->drupalGet($href[1]);
  $this
    ->assertRaw(RulesTestCase::t('Not evaluating reaction rule %unlabeled to prevent recursion.', array(
    'unlabeled' => $rule->name,
  )), "Scheduled recursion prevented.");
  RulesLog::logger()
    ->checkLog();
}