Как сохранить сессию между тестами на аутентификацию в Symfony?Php

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как сохранить сессию между тестами на аутентификацию в Symfony?

Сообщение Anonymous »

Я пишу функциональные тесты в Symfony и пытаюсь сохранить сеанс между тестами, чтобы мне не приходилось повторять процесс аутентификации в каждом тесте. Однако я столкнулся с проблемой:
Каждый раз, когда вызывает новый тест, идентификатор сеанса меняется, и, соответственно, аутентификация снова требуется. < /P>
Что я пробовал: < /< / p>
Using MockFileSessionStorage, but it only works within a single test and does not persist between tests.

Disabling client reboot with $this->client->disableReboot();, but the session is still not carried over to the next test.

Manually setting and retrieving session data in logIn(), including setting cookies:
< /code>
protected function setUp(): void
{
parent::setUp();

$this->client = static::createClient([ 'environment' => 'test'], array(
'PHP_AUTH_USER' => 'Tanya',
'PHP_AUTH_PW' => 'N7jKuXn97ReDK',
));

$this->client->disableReboot();
$this->client->setServerParameter('HTTP_HOST', '172.19.0.1');

$this->entityManager = self::$kernel->getContainer()->get('doctrine')->getManager();
$this->entityManager->beginTransaction();
$this->entityManager->getConnection()->setAutoCommit(false);

foreach (self::getFixtures() as $fixture) {
$fixture->load($this->entityManager);
}

$this->logIn();
}
< /code>
protected function logIn(): void
{
$session = self::$container->get('session');

$userProvider = self::$container->get('security.user.provider.concrete.fos_userbundle');
$user = $userProvider->loadUserByUsername('Tanya');
$roles = (array) $user->getRoles();

$token = new UsernamePasswordToken($user, null, 'admin', $roles);
$session->set('_security_admin', serialize($token));
$session->save();

$cookie = new Cookie($session->getName(), $session->getId());
$this->client->getCookieJar()->set($cookie);
}
< /code>
But even with these attempts, each test seems to start with a fresh session.
Question:
Is there a way to persist the session between tests in Symfony so that I don't have to log in repeatedly? Or is logging in at the beginning of each test the only reliable option?
I am using Symfony 4.4 with functional tests in a test environment.
Any suggestions or best practices would be appreciated!
My Tests
public function testAdminLoginForm()
{
$session = self::$container->get('session');
$sessionIdBefore = $session->getId();
var_dump("Session ID before login:", $sessionIdBefore);

$crawler = $this->client->request('GET', '/admin/login');

$csrfToken = $crawler->filter('input[name="_csrf_token"]')->attr('value');
$form = $crawler->selectButton('Log in')->form([
'_csrf_token' => $csrfToken,
'_username' => 'Tanya',
'_password' => 'N7jKuXn97ReDK',
]);

$this->client->submit($form);

var_dump("Session ID before redirect:", $session->getId());

$cookieJar = $this->client->getCookieJar();
var_dump($cookieJar->all());

$this->client->followRedirect();
$this->client->request('GET', '/admin');

var_dump($cookieJar->all());

$session = $this->client->getRequest()->getSession();
$sessionIdAfterRedirect = $session ? $session->getId() : null;
var_dump("Session ID after redirect:", $sessionIdAfterRedirect);

$tokenStorage = self::$container->get('security.token_storage');
$token = $tokenStorage->getToken();

$this->assertNotNull($token, "User should be authenticated");
$user = $token->getUser();
$this->assertSame('Tanya', $user->getUsername());
}
< /code>
The next test should pick up the session and not require re-authentication
/**
* @test
*/
public function testCaridBrandListPage()
{
$crawler = $this->client->request('GET', '/admin/login');
$csrfToken = $crawler->filter('input[name="_csrf_token"]')->attr('value');
$form = $crawler->selectButton('Log in')->form([
'_csrf_token' => $csrfToken,
'_username' => 'Tanya',
'_password' => 'N7jKuXn97ReDK',
]);

$this->client->submit($form);

$this->client->followRedirect();

$crawler = $this->client->request('GET', '/admin/carid/amazon/marketplace-entities-caridbrand/list');

$tokenStorage = self::$container->get('security.token_storage');
$token = $tokenStorage->getToken();

if ($token) {
$user = $token->getUser();
var_dump("Authenticated user:", $user);
} else {
var_dump("No authenticated user!");
}

$this->assertNotNull($token, "User should be authenticated after login");
$response = $this->client->getResponse();
$this->assertEquals(200, $response->getStatusCode());

$this->assertSelectorTextContains('li.active', 'Carid Brand List');

if ($crawler->filter('.info-box-text')->count() > 0) {
$this->assertEmpty($crawler->filter('.list-unstyled > li'), "List should be empty when 'No result' is shown.");
} else {
$this->assertNotEmpty($crawler->filter('.list-unstyled > li'), "List should not be empty when 'No result' is not shown.");
}
}



Подробнее здесь: https://stackoverflow.com/questions/794 ... in-symfony
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»