You are here

public function SessionTest::testSessionWrite in Drupal 10

Same name and namespace in other branches
  1. 8 core/modules/system/tests/src/Functional/Session/SessionTest.php \Drupal\Tests\system\Functional\Session\SessionTest::testSessionWrite()
  2. 9 core/modules/system/tests/src/Functional/Session/SessionTest.php \Drupal\Tests\system\Functional\Session\SessionTest::testSessionWrite()

Tests that sessions are only saved when necessary.

File

core/modules/system/tests/src/Functional/Session/SessionTest.php, line 246

Class

SessionTest
Drupal session handling tests.

Namespace

Drupal\Tests\system\Functional\Session

Code

public function testSessionWrite() {
  $user = $this
    ->drupalCreateUser([]);
  $this
    ->drupalLogin($user);
  $connection = Database::getConnection();
  $query = $connection
    ->select('users_field_data', 'u');
  $query
    ->innerJoin('sessions', 's', '[u].[uid] = [s].[uid]');
  $query
    ->fields('u', [
    'access',
  ])
    ->fields('s', [
    'timestamp',
  ])
    ->condition('u.uid', $user
    ->id());
  $times1 = $query
    ->execute()
    ->fetchObject();

  // Before every request we sleep one second to make sure that if the session
  // is saved, its timestamp will change.
  // Modify the session.
  sleep(1);
  $this
    ->drupalGet('session-test/set/foo');
  $times2 = $query
    ->execute()
    ->fetchObject();
  $this
    ->assertEquals($times1->access, $times2->access, 'Users table was not updated.');
  $this
    ->assertNotEquals($times1->timestamp, $times2->timestamp, 'Sessions table was updated.');

  // Write the same value again, i.e. do not modify the session.
  sleep(1);
  $this
    ->drupalGet('session-test/set/foo');
  $times3 = $query
    ->execute()
    ->fetchObject();
  $this
    ->assertEquals($times1->access, $times3->access, 'Users table was not updated.');
  $this
    ->assertEquals($times2->timestamp, $times3->timestamp, 'Sessions table was not updated.');

  // Do not change the session.
  sleep(1);
  $this
    ->drupalGet('');
  $times4 = $query
    ->execute()
    ->fetchObject();
  $this
    ->assertEquals($times3->access, $times4->access, 'Users table was not updated.');
  $this
    ->assertEquals($times3->timestamp, $times4->timestamp, 'Sessions table was not updated.');

  // Force updating of users and sessions table once per second.
  $settings['settings']['session_write_interval'] = (object) [
    'value' => 0,
    'required' => TRUE,
  ];
  $this
    ->writeSettings($settings);
  $this
    ->drupalGet('');
  $times5 = $query
    ->execute()
    ->fetchObject();
  $this
    ->assertNotEquals($times4->access, $times5->access, 'Users table was updated.');
  $this
    ->assertNotEquals($times4->timestamp, $times5->timestamp, 'Sessions table was updated.');
}