You are here

public function RulesIntegrationTestCase::testSystemIntegration in Rules 7.2

Same name and namespace in other branches
  1. 8.3 d7-tests/rules_integration_test_case.test \RulesIntegrationTestCase::testSystemIntegration()

Tests site/system integration.

File

tests/rules.test, line 2012
Rules tests.

Class

RulesIntegrationTestCase
Tests provided module integration.

Code

public function testSystemIntegration() {

  // Test using the 'site' variable.
  $condition = rules_condition('data_is', array(
    'data:select' => 'site:current-user:name',
    'value' => $GLOBALS['user']->name,
  ));
  $this
    ->assertTrue($condition
    ->execute(), 'Retrieved the current user\'s name.');

  // Another test using a token replacement.
  $condition = rules_condition('data_is', array(
    'data:select' => 'site:current-user:name',
    'value' => '[site:current-user:name]',
  ));
  $this
    ->assertTrue($condition
    ->execute(), 'Replaced the token for the current user\'s name.');

  // Test breadcrumbs and drupal set message.
  $rule = rules_reaction_rule();
  $rule
    ->event('init')
    ->action('breadcrumb_set', array(
    'titles' => array(
      'foo',
    ),
    'paths' => array(
      'bar',
    ),
  ))
    ->action('drupal_message', array(
    'message' => 'A message.',
  ));
  $rule
    ->save('test');
  $this
    ->drupalGet('node');
  $this
    ->assertLink('foo', 0, 'Breadcrumb has been set.');
  $this
    ->assertText('A message.', 'Drupal message has been shown.');

  // Test the page redirect.
  $node = $this
    ->drupalCreateNode();
  $rule = rules_reaction_rule();
  $rule
    ->event('node_view')
    ->action('redirect', array(
    'url' => 'user',
  ));
  $rule
    ->save('test2');
  $this
    ->drupalGet('node/' . $node->nid);
  $this
    ->assertEqual($this
    ->getUrl(), url('user', array(
    'absolute' => TRUE,
  )), 'Redirect has been issued.');

  // Also test using a url including a fragment.
  $actions = $rule
    ->actions();
  $actions[0]->settings['url'] = 'user#fragment';
  $rule
    ->save();
  $this
    ->drupalGet('node/' . $node->nid);
  $this
    ->assertEqual($this
    ->getUrl(), url('user', array(
    'absolute' => TRUE,
    'fragment' => 'fragment',
  )), 'Redirect has been issued.');

  // Test sending mail.
  $settings = array(
    'to' => 'mail@example.com',
    'subject' => 'subject',
    'message' => 'hello.',
  );
  rules_action('mail', $settings)
    ->execute();
  $this
    ->assertMail('to', 'mail@example.com', 'Mail has been sent.');
  $this
    ->assertMail('from', variable_get('site_mail', ini_get('sendmail_from')), 'Default from address has been used');
  rules_action('mail', $settings + array(
    'from' => 'sender@example.com',
  ))
    ->execute();
  $this
    ->assertMail('from', 'sender@example.com', 'Specified from address has been used');

  // Test sending mail to all users of a role. First clear the mail
  // collector to remove the mail sent in the previous line of code.
  variable_set('drupal_test_email_collector', array());

  // Now make sure there is a custom role and two users with that role.
  $user1 = $this
    ->drupalCreateUser(array(
    'administer nodes',
  ));
  $roles = $user1->roles;

  // Remove the authenticated role so we only use the new role created by
  // drupalCreateUser().
  unset($roles[DRUPAL_AUTHENTICATED_RID]);

  // Now create a second user with the same role.
  $user2 = $this
    ->drupalCreateUser();
  user_save($user2, array(
    'roles' => $roles,
  ));

  // Now create a third user without the same role - this user should NOT
  // receive the role email.
  $user3 = $this
    ->drupalCreateUser(array(
    'administer blocks',
  ));
  $additional_roles = $user3->roles;
  unset($additional_roles[DRUPAL_AUTHENTICATED_RID]);

  // Execute action and check that only two mails were sent.
  rules_action('mail_to_users_of_role', $settings + array(
    'roles' => array_keys($roles),
  ))
    ->execute();
  $mails = $this
    ->drupalGetMails();
  $this
    ->assertEqual(count($mails), 2, '2 e-mails were sent to users of a role.');

  // Check each mail to ensure that only $user1 and $user2 got the mail.
  $mail = array_pop($mails);
  $this
    ->assertTrue($mail['to'] == $user2->mail, 'Mail to user of a role has been sent.');
  $mail = array_pop($mails);
  $this
    ->assertTrue($mail['to'] == $user1->mail, 'Mail to user of a role has been sent.');

  // Execute action again, this time to send mail to both roles.
  // This time check that three mails were sent - one for each user..
  variable_set('drupal_test_email_collector', array());
  rules_action('mail_to_users_of_role', $settings + array(
    'roles' => array_keys($roles + $additional_roles),
  ))
    ->execute();
  $mails = $this
    ->drupalGetMails();
  $this
    ->assertEqual(count($mails), 3, '3 e-mails were sent to users of multiple roles.');

  // Test reacting on new log entries and make sure the log entry is usable.
  $rule = rules_reaction_rule();
  $rule
    ->event('watchdog');
  $rule
    ->action('drupal_message', array(
    'message:select' => 'log_entry:message',
  ));
  $rule
    ->integrityCheck()
    ->save('test_watchdog');
  watchdog('php', 'test %message', array(
    '%message' => 'message',
  ));
  $msg = drupal_get_messages();
  $this
    ->assertEqual(array_pop($msg['status']), t('test %message', array(
    '%message' => 'message',
  )), 'Watchdog event occurred and log entry properties can be used.');
}