function SessionTest::testDataPersistence

Same name in other branches
  1. 9 core/modules/system/tests/src/Functional/Session/SessionTest.php \Drupal\Tests\system\Functional\Session\SessionTest::testDataPersistence()
  2. 10 core/modules/system/tests/src/Functional/Session/SessionTest.php \Drupal\Tests\system\Functional\Session\SessionTest::testDataPersistence()
  3. 11.x core/modules/system/tests/src/Functional/Session/SessionTest.php \Drupal\Tests\system\Functional\Session\SessionTest::testDataPersistence()

Test data persistence via the session_test module callbacks.

File

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

Class

SessionTest
Drupal session handling tests.

Namespace

Drupal\Tests\system\Functional\Session

Code

public function testDataPersistence() {
    $user = $this->drupalCreateUser([]);
    // Enable sessions.
    $this->sessionReset($user->id());
    $this->drupalLogin($user);
    $value_1 = $this->randomMachineName();
    $this->drupalGet('session-test/set/' . $value_1);
    $this->assertText($value_1, 'The session value was stored.', 'Session');
    $this->drupalGet('session-test/get');
    $this->assertText($value_1, 'Session correctly returned the stored data for an authenticated user.', 'Session');
    // Attempt to write over val_1. If drupal_save_session(FALSE) is working.
    // properly, val_1 will still be set.
    $value_2 = $this->randomMachineName();
    $this->drupalGet('session-test/no-set/' . $value_2);
    $session = $this->getSession();
    $this->assertText($value_2, 'The session value was correctly passed to session-test/no-set.', 'Session');
    $this->drupalGet('session-test/get');
    $this->assertText($value_1, 'Session data is not saved for drupal_save_session(FALSE).', 'Session');
    // Switch browser cookie to anonymous user, then back to user 1.
    $session_cookie_name = $this->getSessionName();
    $session_cookie_value = $session->getCookie($session_cookie_name);
    $session->restart();
    $this->initFrontPage();
    // Session restart always resets all the cookies by design, so we need to
    // add the old session cookie again.
    $session->setCookie($session_cookie_name, $session_cookie_value);
    $this->drupalGet('session-test/get');
    $this->assertText($value_1, 'Session data persists through browser close.', 'Session');
    $this->mink
        ->setDefaultSessionName('default');
    // Logout the user and make sure the stored value no longer persists.
    $this->drupalLogout();
    $this->sessionReset();
    $this->drupalGet('session-test/get');
    $this->assertNoText($value_1, "After logout, previous user's session data is not available.", 'Session');
    // Now try to store some data as an anonymous user.
    $value_3 = $this->randomMachineName();
    $this->drupalGet('session-test/set/' . $value_3);
    $this->assertText($value_3, 'Session data stored for anonymous user.', 'Session');
    $this->drupalGet('session-test/get');
    $this->assertText($value_3, 'Session correctly returned the stored data for an anonymous user.', 'Session');
    // Try to store data when drupal_save_session(FALSE).
    $value_4 = $this->randomMachineName();
    $this->drupalGet('session-test/no-set/' . $value_4);
    $this->assertText($value_4, 'The session value was correctly passed to session-test/no-set.', 'Session');
    $this->drupalGet('session-test/get');
    $this->assertText($value_3, 'Session data is not saved for drupal_save_session(FALSE).', 'Session');
    // Login, the data should persist.
    $this->drupalLogin($user);
    $this->sessionReset($user->id());
    $this->drupalGet('session-test/get');
    $this->assertNoText($value_1, 'Session has persisted for an authenticated user after logging out and then back in.', 'Session');
    // Change session and create another user.
    $user2 = $this->drupalCreateUser([]);
    $this->sessionReset($user2->id());
    $this->drupalLogin($user2);
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.