'Rules integration',
'description' => 'Test the Rules integration.',
'group' => 'Mime Mail',
);
}
public function setUp() {
parent::setUp('mailsystem', 'locale', 'entity', 'entity_token', 'rules', 'mimemail');
// Create and login user.
$this->adminUser = $this->drupalCreateUser(array(
'access administration pages',
'edit mimemail user settings',
'administer languages',
'administer rules',
'bypass rules access',
'access rules debug',
));
$this->drupalLogin($this->adminUser);
// Enable another language too.
foreach (array('de', 'it') as $langcode) {
$edit = array();
$edit['langcode'] = $langcode;
$this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
}
// Make sure we are not using a stale list.
drupal_static_reset('language_list');
}
/**
* Create rule with "mimemail" action and fire it.
*/
public function testMailToUserAction() {
$settings = array(
'key' => 'mail-key-' . $this->randomName(),
'to' => $this->randomName() . '@example.com',
'from' => $this->randomName() . '@example.com',
'subject' => $this->randomName(),
'body' => $this->randomName(60) . '
',
'plaintext' => $this->randomName(30) . '
',
);
// Set no language for the mail and check if the system default is used.
$rule = rule();
$rule->action('mimemail', array(
'key' => $settings['key'],
'to' => $settings['to'],
'from_mail' => $settings['from'],
'subject' => $settings['subject'],
'body' => $settings['body'],
'plaintext' => $settings['plaintext'],
'language' => '',
))->save();
$rule->execute();
$mails = $this->drupalGetMails(array('key' => $settings['key']));
$this->assertEqual(count($mails), 1);
$mail = reset($mails);
$this->assertEqual($mail['to'], $settings['to']);
$this->assertEqual($mail['from'], $settings['from']);
$this->assertEqual($mail['subject'], $settings['subject']);
$this->assertEqual($mail['params']['context']['body'], $settings['body']);
$this->assertEqual($mail['params']['plaintext'], $settings['plaintext']);
$this->assertEqual($mail['language']->language, language_default('language'));
// Explicitly set another language for the mail.
$rule_action = $rule->elementMap()->lookup(3);
unset($rule_action->settings['language:select']);
$rule_action->settings['language'] = 'de';
$rule_action->settings['key'] = $settings['key'];
$rule->save();
$rule->execute();
$mails = $this->drupalGetMails(array('key' => $settings['key']));
$this->assertEqual(count($mails), 2);
$mail = end($mails);
$this->assertEqual($mail['language']->language, 'de');
}
/**
* Create rule with "mimemail_to_users_of_role" action and fire it.
*/
public function testMailToUsersOfRoleAction() {
$languages = language_list();
// Add more users and roles.
$users = array(
$this->randomName() . '@example.com' => 'en',
$this->randomName() . '@example.com' => 'de',
$this->randomName() . '@example.com' => 'it',
$this->randomName() . '@example.com' => '',
$this->randomName() . '@example.com' => 'invalid',
);
$mimemail_role = $this->drupalCreateRole(array());
foreach ($users as $email => $language) {
$user = $this->drupalCreateUser(array(
'access administration pages',
));
$user->language = $language;
$user->mail = $email;
$user->roles[$mimemail_role] = $mimemail_role;
user_save($user);
}
$settings = array(
'key' => 'mail-key-' . $this->randomName(),
'from' => $this->randomName() . '@example.com',
'subject' => $this->randomName(),
'body' => $this->randomName(60) . '
',
'plaintext' => $this->randomName(30) . '
',
);
// Rest the collected mails.
variable_set('drupal_test_email_collector', array());
// Send mails to all users of a role and respect the language of the users.
// Don't enforce a specific language as fallback use the system default.
$rule = rule();
$rule->action('mimemail_to_users_of_role', array(
'key' => $settings['key'],
'from_mail' => $settings['from'],
'subject' => $settings['subject'],
'body' => $settings['body'],
'plaintext' => $settings['plaintext'],
'roles' => array($mimemail_role => $mimemail_role),
'active' => TRUE,
'language_user' => TRUE,
'language' => '',
));
$rule->save();
$rule->execute();
$mails = $this->drupalGetMails(array('key' => $settings['key']));
$this->assertEqual(count($mails), count($users));
$mail = reset($mails);
$this->assertEqual($mail['from'], $settings['from']);
$this->assertEqual($mail['subject'], $settings['subject']);
$this->assertEqual($mail['params']['context']['body'], $settings['body']);
$this->assertEqual($mail['params']['plaintext'], $settings['plaintext']);
foreach ($mails as $mail) {
// If the user hasn't a proper language the system default has to be used
// if the rules action doesn't provide a language to use.
$user_language = (!empty($languages[$users[$mail['to']]])) ? $users[$mail['to']] : language_default('language');
$this->assertEqual($mail['language']->language, $user_language);
}
// Rest the collected mails.
variable_set('drupal_test_email_collector', array());
// Send mails to all users of a role and respect the language of the users.
// Enforce German as fallback language if an user doesn't have a language.
$rule->elementMap()->lookup(3)->settings['language'] = 'de';
$rule->save();
$rule->execute();
$mails = $this->drupalGetMails(array('key' => $settings['key']));
$this->assertEqual(count($mails), count($users));
foreach ($mails as $mail) {
// If the user hasn't a proper language the language set in the rules
// action has to be used.
$user_language = (!empty($languages[$users[$mail['to']]])) ? $users[$mail['to']] : 'de';
$this->assertEqual($mail['language']->language, $user_language);
}
// Rest the collected mails.
variable_set('drupal_test_email_collector', array());
// Send mails to all users of a role but use the same language for all.
$rule->elementMap()->lookup(3)->settings['language_user'] = FALSE;
$rule->elementMap()->lookup(3)->settings['language'] = 'it';
$rule->save();
$rule->execute();
$mails = $this->drupalGetMails(array('key' => $settings['key']));
foreach ($mails as $mail) {
$this->assertEqual($mail['language']->language, 'it');
}
// Rest the collected mails.
variable_set('drupal_test_email_collector', array());
// Send mails to all users of a role except deactivated users.
// Disable one of the users.
reset($users);
$user = user_load_by_mail(key($users));
$user->status = 0;
user_save($user);
$rule->execute();
$mails = $this->drupalGetMails(array('key' => $settings['key']));
$this->assertEqual(count($mails), count($users) - 1);
// Rest the collected mails.
variable_set('drupal_test_email_collector', array());
// Send mails to all users, also to deactivated ones.
$rule->elementMap()->lookup(3)->settings['active'] = FALSE;
$rule->save();
$rule->execute();
$mails = $this->drupalGetMails(array('key' => $settings['key']));
// One user is disabled but it should be ignored.
$this->assertEqual(count($mails), count($users));
}
}