function SessionTest::testSessionWrite
Same name in other branches
- 9 core/modules/system/tests/src/Functional/Session/SessionTest.php \Drupal\Tests\system\Functional\Session\SessionTest::testSessionWrite()
- 8.9.x core/modules/system/tests/src/Functional/Session/SessionTest.php \Drupal\Tests\system\Functional\Session\SessionTest::testSessionWrite()
- 10 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 249
Class
- SessionTest
- Drupal session handling tests.
Namespace
Drupal\Tests\system\Functional\SessionCode
public function testSessionWrite() : void {
$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.');
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.