function InactiveUserTest::testInactiveUserBlocking in Inactive User 6
Same name and namespace in other branches
- 7 inactive_user.test \InactiveUserTest::testInactiveUserBlocking()
Check inactive user blocking and notifications are working
File
- ./inactive_user.test, line 110 
- Test the basic functions of the Inactive User module.
Class
- InactiveUserTest
- Inactive user module testcase.
Code
function testInactiveUserBlocking() {
  // Change user and admin blocking options:
  // Notify user about being blocked after one week of inactivity.
  // Block user after two weeks of inactivity.
  // Notify both about blocking: user and admin
  $settings = array(
    'inactive_user_admin_email' => 'test@email.com',
    'inactive_user_auto_block_warn' => '604800',
    'inactive_user_auto_block' => '1209600',
    'inactive_user_notify_block' => '1',
    'inactive_user_notify_block_admin' => '1',
  );
  $this
    ->inactiveUserSettings($settings);
  // Create an inactive user for more than a week.
  $inactive = $this
    ->drupalCreateInactiveUser(604800 + 3600);
  // Perform inactive validations
  $this
    ->checkInactiveAccounts();
  // One email should have been sent to the inactive user about being blocked.
  $emails = $this
    ->drupalGetMails();
  $this
    ->assertEqual(count($emails), 1, t('Only one email has been sent for this inactivity validation.'));
  // Get the last email, and verify it was sent to user's email address
  $notification = array_pop($emails);
  $this
    ->assertEqual($notification['to'], $inactive->mail, t('User has been notified that its accout will be blocked.'));
  // Create an inactive user for more than two weeks
  $inactive = $this
    ->drupalCreateInactiveUser(1209600 + 3600);
  // Perform inactive validations
  $this
    ->checkInactiveAccounts();
  // One more email should have been sent, notifying the user its account will
  // be blocked, but blocking operation will not happen because the user was
  // notified at the time of 'notify'. The notification period should last for
  // a whole week before the account is blocked.
  $emails = $this
    ->drupalGetMails();
  $this
    ->assertEqual(count($emails), 2, t('One new email have been sent for this inactivity validation.'));
  // Get the last email, and verify it was sent to user's email address
  $notification = array_pop($emails);
  $this
    ->assertEqual($notification['to'], $inactive->mail, t('User has been notified that its accout will be blocked.'));
  // Inactive_user keeps the time of blocking notification in a separate table
  // as the timestamp of the operation, need to be moved back in time. We are
  // modifying the notification period so on next validation the account will
  // be blocked.
  db_query("UPDATE {inactive_users} SET warned_user_block_timestamp = %d WHERE uid = %d", 604800 + 3600, $inactive->uid);
  // Perform inactive validations again
  $this
    ->checkInactiveAccounts();
  // Now, two more emails have been sent.
  $emails = $this
    ->drupalGetMails();
  $this
    ->assertEqual(count($emails), 4, t('Two new emails have been sent for this inactivity validation.'));
  // Get the other email, and verify it was sent to admin's email address
  $notification = array_pop($emails);
  $this
    ->assertEqual($notification['to'], $settings['inactive_user_admin_email'], t('Administrator has been notified of blocked accounts.'));
  // Admin has been notified that its account has been blocked.
  $notification = array_pop($emails);
  $this
    ->assertEqual($notification['to'], $inactive->mail, t('User has been notified of its blocked account.'));
  // Verify the user has been blocked. user_load does not work with blocked
  // accounts.
  $status = db_result(db_query('SELECT status FROM {users} WHERE uid = %d', $inactive->uid));
  $this
    ->assertEqual($status, 0, t('Inactive user %name has been blocked.', array(
    '%name' => $inactive->name,
  )));
}