You are here

autologout.test in Automated Logout 6.4

Same filename and directory in other branches
  1. 7.4 tests/autologout.test

Simpletest tests for autologout.

File

tests/autologout.test
View source
<?php

/**
 * @file
 * Simpletest tests for autologout.
 */

/**
 * Tests the autologout's features.
 */
class AutologoutTestCase extends DrupalWebTestCase {

  /**
   * User with admin rights.
   */
  protected $privileged_user;

  /**
   * getInfo() returns properties that are displayed in the test selection form.
   */
  public static function getInfo() {
    return array(
      'name' => 'Autologout Tests',
      'description' => 'Ensure that the autologout module functions as expected',
      'group' => 'Autologout',
    );
  }

  /**
   * setUp() performs any pre-requisite tasks that need to happen.
   */
  public function setUp() {

    // Enable any modules required for the test.
    parent::setUp('autologout');

    // Create and log in our privileged user.
    $this->privileged_user = $this
      ->drupalCreateUser(array(
      'access content',
      'administer content types',
      'administer nodes',
      'access administration pages',
      'access site reports',
      'administer autologout',
      'change own logout threshold',
      'administer site configuration',
    ));
    $this
      ->drupalLogin($this->privileged_user);

    // For the purposes of the test, set the timeout periods to 10 seconds.
    variable_set('autologout_timeout', 10);
    variable_set('autologout_padding', 10);
  }

  /**
   * Test the precedence of the timeouts.
   *
   * This tests the following function:
   * _autologout_get_user_timeout();
   */
  public function testAutologoutTimeoutPrecedence() {
    $uid = $this->privileged_user->uid;

    // Default used if no role is specified.
    variable_set('autologout_timeout', 100);
    variable_set('autologout_role_logout', FALSE);
    variable_set('autologout_role_2', FALSE);
    variable_set('autologout_role_2_timeout', 200);
    $this
      ->assertAutotimeout($uid, 100, t('User timeout uses default if no other option set'));

    // Default used if role selected but no user's role is selected.
    variable_set('autologout_role_logout', TRUE);
    variable_set('autologout_role_2', FALSE);
    variable_set('autologout_role_2_timeout', 200);
    $this
      ->assertAutotimeout($uid, 100, t('User timeout uses default if  role timeouts are used but not one of the current user.'));

    // Role timeout is used if user's role is selected.
    variable_set('autologout_role_logout', TRUE);
    variable_set('autologout_role_2', TRUE);
    variable_set('autologout_role_2_timeout', 200);
    $this
      ->assertAutotimeout($uid, 200, t('User timeout uses role value'));

    // Role timeout is used if user's role is selected.
    variable_set('autologout_role_logout', TRUE);
    variable_set('autologout_role_2', TRUE);
    variable_set('autologout_role_2_timeout', 0);
    $this
      ->assertAutotimeout($uid, 0, t('User timeout uses role value of 0 if set for one of the user roles.'));

    // Role timeout used if personal timeout is empty string.
    variable_set('autologout_role_logout', TRUE);
    variable_set('autologout_role_2', TRUE);
    variable_set('autologout_role_2_timeout', 200);
    variable_set('autologout_user_' . $uid, '');
    $this
      ->assertAutotimeout($uid, 200, t('User timeout uses role value if personal value is the empty string.'));

    // Default timeout used if personal timeout is empty string.
    variable_set('autologout_role_logout', TRUE);
    variable_set('autologout_role_2', FALSE);
    variable_set('autologout_role_2_timeout', 200);
    variable_set('autologout_user_' . $uid, '');
    $this
      ->assertAutotimeout($uid, 100, t('User timeout uses default value if personal value is the empty string and no role timeout is specified.'));

    // Personal timeout used if set.
    variable_set('autologout_role_logout', TRUE);
    variable_set('autologout_role_2', TRUE);
    variable_set('autologout_role_2_timeout', 200);
    variable_set('autologout_user_' . $uid, 300);
    $this
      ->assertAutotimeout($uid, 300, t('User timeout uses default value if personal value is the empty string and no role timeout is specified.'));
  }

  /**
   * Test a user is logged out after the default timeout period.
   */
  public function testAutologoutDefaultTimeout() {

    // Check that the user can access the page after login.
    $this
      ->drupalGet('node');
    $this
      ->assertResponse(200, t('Homepage is accessible'));
    $this
      ->assertText(t('Log out'), t('User is still logged in.'));

    // Wait for timeout period to elapse.
    sleep(20);

    // Check we are now logged out.
    $this
      ->drupalGet('node');
    $this
      ->assertResponse(200, t('Homepage is accessible'));
    $this
      ->assertNoText(t('Log out'), t('User is no longer logged in.'));
    $this
      ->assertText(t('You have been logged out due to inactivity.'), t('User sees inactivity message.'));
  }

  /**
   * Test a user is not logged out within the default timeout period.
   */
  public function testAutologoutNoLogoutInsideTimeout() {

    // Check that the user can access the page after login.
    $this
      ->drupalGet('node');
    $this
      ->assertResponse(200, t('Homepage is accessible'));
    $this
      ->assertText(t('Log out'), t('User is still logged in.'));

    // Wait within the timeout period.
    sleep(10);

    // Check we are still logged in.
    $this
      ->drupalGet('node');
    $this
      ->assertResponse(200, t('Homepage is accessible'));
    $this
      ->assertText(t('Log out'), t('User is still logged in.'));
    $this
      ->assertNoText(t('You have been logged out due to inactivity.'), t('User does not see inactivity message.'));
  }

  /**
   * Test the behaviour of the settings for submission.
   */
  public function testAutologoutSettingsForm() {
    $edit = array();

    // Set an initial (low) value of max_timeout.
    variable_set('autologout_max_timeout', 1000);

    // Test that it is possible to set a value above the max_timeout threshold.
    $edit['autologout_timeout'] = 1500;
    $edit['autologout_max_timeout'] = 2000;
    $edit['autologout_padding'] = 60;
    $edit['autologout_role_logout'] = TRUE;
    $edit['autologout_role_2'] = TRUE;
    $edit['autologout_role_2_timeout'] = 1200;
    $edit['autologout_role_3'] = TRUE;
    $edit['autologout_role_3_timeout'] = 1200;
    $edit['autologout_redirect_url'] = TRUE;
    $this
      ->drupalPost('admin/settings/autologout', $edit, t('Save configuration'));
    $this
      ->assertText(t('The configuration options have been saved.'), t('Unable to save autologout config when modifying the max timeout.'));

    // Test that out of range values are picked up.
    $edit['autologout_timeout'] = 2500;
    $edit['autologout_max_timeout'] = 2000;
    $edit['autologout_padding'] = 60;
    $edit['autologout_role_logout'] = TRUE;
    $edit['autologout_role_2'] = TRUE;
    $edit['autologout_role_2_timeout'] = 1200;
    $edit['autologout_role_3'] = TRUE;
    $edit['autologout_role_3_timeout'] = 1200;
    $edit['autologout_redirect_url'] = TRUE;
    $this
      ->drupalPost('admin/settings/autologout', $edit, t('Save configuration'));
    $this
      ->assertNoText(t('The configuration options have been saved.'), t('Saved configuration despite the autologout_timeout being too large.'));

    // Test that out of range values are picked up.
    $edit['autologout_timeout'] = 1500;
    $edit['autologout_max_timeout'] = 2000;
    $edit['autologout_padding'] = 60;
    $edit['autologout_role_logout'] = TRUE;
    $edit['autologout_role_2'] = TRUE;
    $edit['autologout_role_2_timeout'] = 2500;
    $edit['autologout_role_3'] = TRUE;
    $edit['autologout_role_3_timeout'] = 1200;
    $edit['autologout_redirect_url'] = TRUE;
    $this
      ->drupalPost('admin/settings/autologout', $edit, t('Save configuration'));
    $this
      ->assertNoText(t('The configuration options have been saved.'), t('Saved configuration despite a role timeout being too large.'));

    // Test that role timeouts are not validated for disabled roles.
    $edit['autologout_timeout'] = 1500;
    $edit['autologout_max_timeout'] = 2000;
    $edit['autologout_padding'] = 60;
    $edit['autologout_role_logout'] = TRUE;
    $edit['autologout_role_2'] = FALSE;
    $edit['autologout_role_2_timeout'] = 4000;
    $edit['autologout_role_3'] = TRUE;
    $edit['autologout_role_3_timeout'] = 1200;
    $edit['autologout_redirect_url'] = TRUE;
    $this
      ->drupalPost('admin/settings/autologout', $edit, t('Save configuration'));
    $this
      ->assertText(t('The configuration options have been saved.'), t('Unable to save autologout due to out of range role timeout for a role which is not enabled.'));
  }

  /**
   * Test enforce logout on admin page settings.
   */
  public function testAutlogoutOfAdminPages() {

    // Set an admin page path.
    $_GET['q'] = 'admin';

    // Check if user will be kept logged in on admin paths with enforce dsabled.
    variable_set('autologout_enforce_admin', FALSE);
    $this
      ->assertEqual(autologout_autologout_refresh_only(), TRUE, t('Autologout does logout of admin pages without enforce on admin checked.'));

    // Check if user will not be kept logged in on admin paths if
    // enforce enabled.
    variable_set('autologout_enforce_admin', TRUE);
    $this
      ->assertEqual(autologout_autologout_refresh_only(), FALSE, t('Autologout does not logout of admin pages with enforce on admin not checked.'));

    // Set a non admin page path.
    $_GET['q'] = 'node';
    variable_set('autologout_enforce_admin', FALSE);
    $this
      ->assertEqual(autologout_autologout_refresh_only(), FALSE, t('autologout_autologout_refresh_only() returns FALSE on non admin page when enforce is disabled.'));
    variable_set('autologout_enforce_admin', TRUE);
    $this
      ->assertEqual(autologout_autologout_refresh_only(), FALSE, t('autologout_autologout_refresh_only() returns FALSE on non admin page when enforce is enabled.'));

    // Check behaviour of autologout on node edit pages depending
    // on their admin page status.
    variable_set('node_admin_theme', '0');
    $_GET['q'] = 'node/add/page';

    // Check if user will be logged out of node edit pages if they
    // are not considered admin pages.
    variable_set('autologout_enforce_admin', FALSE);
    $this
      ->assertEqual(autologout_autologout_refresh_only(), FALSE, t('autologout_autologout_refresh_only() returns FALSE on node edit pages when they are not considered admin pages.'));
    variable_set('autologout_enforce_admin', TRUE);
    $this
      ->assertEqual(autologout_autologout_refresh_only(), FALSE, t('autologout_autologout_refresh_only() returns FALSE on node edit pages when they are not considered admin pages.'));

    // Consider node edit pages as admin pages.
    variable_set('node_admin_theme', '1');
    $_GET['q'] = 'node/add/page';

    // Check if user will be kept logged into node edit pages if they
    // are considered admin when enforce is disabled.
    variable_set('autologout_enforce_admin', FALSE);
    $this
      ->assertEqual(autologout_autologout_refresh_only(), TRUE, t('User will be kept logged into node edit pages if they are considered admin when enforce is disabled.'));

    // Check if user will not be kept logged into node edit pages if
    // they are considered admin wehn enforce is enabled.
    variable_set('autologout_enforce_admin', TRUE);
    $this
      ->assertEqual(autologout_autologout_refresh_only(), FALSE, t('User will not be kept logged into node edit pages if they are considered admin when enforce is enabled.'));
  }

  /**
   * Test a user is logged out and denied access to admin pages.
   */
  public function testAutologoutDefaultTimeoutAccessDeniedToAdmin() {

    // Enforce auto logout of admin pages.
    variable_set('autologout_enforce_admin', TRUE);

    // Check that the user can access the page after login.
    $this
      ->drupalGet('admin/reports/status');
    $this
      ->assertResponse(200, t('Admin page is accessible'));
    $this
      ->assertText(t('Log out'), t('User is still logged in.'));
    $this
      ->assertText(t("Here you can find a short overview of your site's parameters as well as any problems detected with your installation."), t('User can access elements of the admin page.'));

    // Wait for timeout period to elapse.
    sleep(20);

    // Check we are now logged out.
    $this
      ->drupalGet('admin/reports/status');
    $this
      ->assertResponse(403, t('Admin page returns 403 access denied.'));
    $this
      ->assertNoText(t('Log out'), t('User is no longer logged in.'));
    $this
      ->assertNoText(t("Here you can find a short overview of your site's parameters as well as any problems detected with your installation."), t('User cannot access elements of the admin page.'));
    $this
      ->assertText(t('You have been logged out due to inactivity.'), t('User sees inactivity message.'));
  }

  /**
   * Test integration with the remember me module.
   *
   * Users who checked remember_me on login should never be logged out.
   */
  public function testNoAutologoutWithRememberMe() {

    // Set the remember_me module data bit to TRUE.
    $this->privileged_user = user_save($this->privileged_user, array(
      'remember_me' => 1,
    ), 'remember-me');

    // Check that the user can access the page after login.
    $this
      ->drupalGet('node');
    $this
      ->assertResponse(200, t('Homepage is accessible'));
    $this
      ->assertText(t('Log out'), t('User is still logged in.'));

    // Wait for timeout period to elapse.
    sleep(20);

    // Check we are still logged in.
    $this
      ->drupalGet('node');
    $this
      ->assertResponse(200, t('Homepage is accessible'));
    $this
      ->assertText(t('Log out'), t('User is still logged in after timeout with remember_me on.'));
  }

  /**
   * Assert the timeout for a particular user.
   *
   * @param int $uid
   *   User uid to assert the timeout for.
   * @param int $expected_timeout
   *   The expected timeout.
   * @param string $message
   *   The test message
   * @param string $group
   *   The test grouping
   */
  public function assertAutotimeout($uid, $expected_timeout, $message = '', $group = '') {
    return $this
      ->assertEqual(_autologout_get_user_timeout($uid), $expected_timeout, $message, $group);
  }

}

/**
 * Test the Autologout ajax endpoints.
 */
class AutologoutAjaxTestCase extends DrupalWebTestCase {

  /**
   * User with admin rights.
   */
  protected $privileged_user;

  /**
   * getInfo() returns properties that are displayed in the test selection form.
   */
  public static function getInfo() {
    return array(
      'name' => 'Autologout Ajax Tests',
      'description' => 'Ensure the AJAX endpoints work as expected',
      'group' => 'Autologout',
    );
  }

  /**
   * setUp() performs any pre-requisite tasks that need to happen.
   */
  public function setUp() {

    // Enable any modules required for the test.
    parent::setUp('autologout');

    // Create and log in our privileged user.
    $this->privileged_user = $this
      ->drupalCreateUser(array(
      'access content',
      'administer content types',
      'administer nodes',
      'access administration pages',
      'access site reports',
      'administer autologout',
      'change own logout threshold',
      'administer site configuration',
    ));
    $this
      ->drupalLogin($this->privileged_user);
  }

  /**
   * Test ajax logout callbacks work as expected.
   */
  public function testAutologoutByAjax() {
    variable_set('autologout_timeout', 100);
    variable_set('autologout_padding', 10);

    // Check that the user can access the page after login.
    $this
      ->drupalGet('node');
    $this
      ->assertResponse(200, t('Homepage is accessible'));
    $this
      ->assertText(t('Log out'), t('User is still logged in.'));

    // Test the time remaining callback works as expected.
    $this
      ->drupalGet('autologout_ajax_get_time_left');
    $this
      ->assertResponse(200, t('autologout_ajax_get_time_left is accessible when logged in'));

    // Test that ajax logout works as expected.
    $this
      ->drupalGet('autologout_ahah_logout');
    $this
      ->assertResponse(200, t('autologout_ahah_logout is accessible when logged in'));

    // Check we are now logged out.
    $this
      ->drupalGet('node');
    $this
      ->assertResponse(200, t('Homepage is accessible'));
    $this
      ->assertNoText(t('Log out'), t('User is no longer logged in.'));

    // Check further get time remaining requests return access denied.
    $this
      ->drupalGet('autologout_ajax_get_time_left');
    $this
      ->assertResponse(403, t('autologout_ajax_get_time_left is not accessible when logged out.'));

    // Check further logout requests result in access denied.
    $this
      ->drupalGet('autologout_ahah_logout');
    $this
      ->assertResponse(403, t('autologout_ahah logout is not accessible when logged out.'));
  }

  /**
   * Test ajax stay logged in callbacks work as expected.
   */
  public function testStayloggedInByAjax() {
    variable_set('autologout_timeout', 20);
    variable_set('autologout_padding', 5);

    // Check that the user can access the page after login.
    $this
      ->drupalGet('node');
    $this
      ->assertResponse(200, t('Homepage is accessible'));
    $this
      ->assertText(t('Log out'), t('User is still logged in.'));

    // Sleep for half the timeout.
    sleep(14);

    // Test that ajax stay logged in works.
    $this
      ->drupalGet('autologout_ahah_set_last');
    $this
      ->assertResponse(200, t('autologout_ahah_set_last is accessible when logged in.'));

    // Sleep for half the timeout again.
    sleep(14);

    // Check we are still logged in.
    $this
      ->drupalGet('node');
    $this
      ->assertResponse(200, t('Homepage is accessible'));
    $this
      ->assertText(t('Log out'), t('User is still logged in.'));

    // Logout.
    $this
      ->drupalGet('autologout_ahah_logout');
    $this
      ->assertResponse(200, t('autologout_ahah_logout is accessible when logged in.'));

    // Check further requests to set last result in 403.
    $this
      ->drupalGet('autologout_ahah_set_last');
    $this
      ->assertResponse(403, t('autologout_ahah_set_last is not accessible when logged out.'));
  }

}

Classes

Namesort descending Description
AutologoutAjaxTestCase Test the Autologout ajax endpoints.
AutologoutTestCase Tests the autologout's features.