You are here

public function RulesTestCase::testLoops in Rules 7.2

Same name and namespace in other branches
  1. 8.3 d7-tests/rules_test_case.test \RulesTestCase::testLoops()

Tests using loops.

File

tests/rules.test, line 700
Rules tests.

Class

RulesTestCase
Rules test cases.

Code

public function testLoops() {

  // Test passing the list parameter as argument to ensure that is working
  // generally for plugin container too.
  drupal_get_messages(NULL, TRUE);
  $loop = rules_loop();
  $loop
    ->action('drupal_message', array(
    'message' => 'test',
  ));
  $arg_info = $loop
    ->parameterInfo();
  $this
    ->assert($arg_info['list']['type'] == 'list', 'Argument info contains list.');
  $loop
    ->execute(array(
    1,
    2,
  ));

  // Ensure the action has been executed twice, once for each list item.
  $msg = drupal_get_messages();
  $this
    ->assert($msg['status'][0] == 'test' && $msg['status'][1], 'Loop has been properly executed');

  // Now test looping over nodes.
  $node1 = $this
    ->drupalCreateNode(array(
    'type' => 'page',
    'sticky' => 0,
  ));
  $node2 = $this
    ->drupalCreateNode(array(
    'type' => 'page',
    'sticky' => 0,
  ));
  $node3 = $this
    ->drupalCreateNode(array(
    'type' => 'page',
    'sticky' => 0,
  ));
  $rule = rule(array(
    'list' => array(
      'type' => 'list<node>',
      'label' => 'A list of nodes',
    ),
  ));
  $loop = rules_loop(array(
    'list:select' => 'list',
    'item:var' => 'node',
  ));
  $loop
    ->action('data_set', array(
    'data:select' => 'node:sticky',
    'value' => TRUE,
  ));
  $rule
    ->action($loop);

  // Test using a list with data selectors, just output the last nodes type.
  $rule
    ->action('drupal_message', array(
    'message:select' => 'list:2:type',
  ));
  $rule
    ->execute(array(
    $node1->nid,
    $node2->nid,
    $node3->nid,
  ));
  $text = RulesLog::logger()
    ->render();
  $save_msg = RulesTestCase::t('Saved %node of type %node.', array(
    'node',
    'node',
  ));
  $this
    ->assertTrue(substr_count($text, $save_msg) == 3, 'List item variables have been saved.');
  RulesLog::logger()
    ->checkLog();
}