Next major version 2 with PHP 8.1, Symfony 6, Tabler UI, 2FA ... (#2902)
This commit is contained in:
@@ -16,19 +16,26 @@ use App\Tests\DataFixtures\TeamFixtures;
|
||||
use App\Tests\DataFixtures\TimesheetFixtures;
|
||||
use Symfony\Component\DomCrawler\Field\ChoiceFormField;
|
||||
use Symfony\Component\HttpKernel\HttpKernelBrowser;
|
||||
use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface;
|
||||
use Symfony\Component\PasswordHasher\Hasher\PasswordHasherFactoryInterface;
|
||||
|
||||
/**
|
||||
* @group integration
|
||||
*/
|
||||
class ProfileControllerTest extends ControllerBaseTest
|
||||
{
|
||||
public function testIsSecure()
|
||||
public function testIsSecure(): void
|
||||
{
|
||||
$this->assertUrlIsSecured('/profile/' . UserFixtures::USERNAME_USER);
|
||||
}
|
||||
|
||||
public function testIndexActionWithoutData()
|
||||
public function testMyProfileActionRedirects(): void
|
||||
{
|
||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_USER);
|
||||
$this->request($client, '/profile/');
|
||||
$this->assertIsRedirect($client, '/en/profile/' . UserFixtures::USERNAME_USER);
|
||||
}
|
||||
|
||||
public function testIndexActionWithoutData(): void
|
||||
{
|
||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_USER);
|
||||
$this->request($client, '/profile/' . UserFixtures::USERNAME_USER);
|
||||
@@ -39,12 +46,12 @@ class ProfileControllerTest extends ControllerBaseTest
|
||||
|
||||
$content = $client->getResponse()->getContent();
|
||||
$year = (new \DateTime())->format('Y');
|
||||
$this->assertStringContainsString('<h3 class="box-title">' . $year . '</h3>', $content);
|
||||
$this->assertStringContainsString('<h3 class="card-title">' . $year, $content);
|
||||
$this->assertStringContainsString('new Chart(', $content);
|
||||
$this->assertStringContainsString('<canvas id="userProfileChart' . $year . '"', $content);
|
||||
}
|
||||
|
||||
public function testIndexAction()
|
||||
public function testIndexAction(): void
|
||||
{
|
||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_USER);
|
||||
|
||||
@@ -67,7 +74,7 @@ class ProfileControllerTest extends ControllerBaseTest
|
||||
|
||||
foreach ($dates as $start) {
|
||||
$year = $start->format('Y');
|
||||
$this->assertStringContainsString('<h3 class="box-title">' . $year . '</h3>', $content);
|
||||
$this->assertStringContainsString('<h3 class="card-title">' . $year, $content);
|
||||
$this->assertStringContainsString('<canvas id="userProfileChart' . $year . '"', $content);
|
||||
}
|
||||
|
||||
@@ -75,25 +82,22 @@ class ProfileControllerTest extends ControllerBaseTest
|
||||
$this->assertHasAboutMeBox($client, UserFixtures::USERNAME_USER);
|
||||
}
|
||||
|
||||
protected function assertHasProfileBox(HttpKernelBrowser $client, string $username)
|
||||
protected function assertHasProfileBox(HttpKernelBrowser $client, string $username): void
|
||||
{
|
||||
$profileBox = $client->getCrawler()->filter('div.box-user-profile');
|
||||
$this->assertEquals(1, $profileBox->count());
|
||||
$profileAvatar = $profileBox->filter('span.avatar');
|
||||
$this->assertEquals(1, $profileAvatar->count());
|
||||
$alt = $profileAvatar->attr('title');
|
||||
|
||||
$this->assertEquals($username, $alt);
|
||||
}
|
||||
|
||||
protected function assertHasAboutMeBox(HttpKernelBrowser $client, string $username)
|
||||
protected function assertHasAboutMeBox(HttpKernelBrowser $client, string $username): void
|
||||
{
|
||||
$content = $client->getResponse()->getContent();
|
||||
|
||||
$this->assertStringContainsString('About me', $content);
|
||||
$this->assertStringContainsString('<div class="datagrid-content">' . $username . '</div>', $content);
|
||||
}
|
||||
|
||||
public function getTabTestData()
|
||||
public function getTabTestData(): array
|
||||
{
|
||||
return [
|
||||
[User::ROLE_USER, UserFixtures::USERNAME_USER],
|
||||
@@ -104,21 +108,21 @@ class ProfileControllerTest extends ControllerBaseTest
|
||||
/**
|
||||
* @dataProvider getTabTestData
|
||||
*/
|
||||
public function testEditActionTabs($role, $username)
|
||||
public function testEditActionTabs($role, $username): void
|
||||
{
|
||||
$client = $this->getClientForAuthenticatedUser($role);
|
||||
$this->request($client, '/profile/' . $username . '/edit');
|
||||
$this->assertTrue($client->getResponse()->isSuccessful());
|
||||
}
|
||||
|
||||
public function testIndexActionWithDifferentUsername()
|
||||
public function testIndexActionWithDifferentUsername(): void
|
||||
{
|
||||
$client = $this->getClientForAuthenticatedUser();
|
||||
$this->request($client, '/profile/' . UserFixtures::USERNAME_TEAMLEAD);
|
||||
$this->assertFalse($client->getResponse()->isSuccessful());
|
||||
}
|
||||
|
||||
public function testEditAction()
|
||||
public function testEditAction(): void
|
||||
{
|
||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_USER);
|
||||
$this->request($client, '/profile/' . UserFixtures::USERNAME_USER . '/edit');
|
||||
@@ -126,7 +130,7 @@ class ProfileControllerTest extends ControllerBaseTest
|
||||
/** @var User $user */
|
||||
$user = $this->getUserByRole(User::ROLE_USER);
|
||||
|
||||
$this->assertEquals(UserFixtures::USERNAME_USER, $user->getUsername());
|
||||
$this->assertEquals(UserFixtures::USERNAME_USER, $user->getUserIdentifier());
|
||||
$this->assertEquals('John Doe', $user->getAlias());
|
||||
$this->assertEquals('Developer', $user->getTitle());
|
||||
$this->assertEquals('john_user@example.com', $user->getEmail());
|
||||
@@ -149,14 +153,14 @@ class ProfileControllerTest extends ControllerBaseTest
|
||||
|
||||
$user = $this->getUserByRole(User::ROLE_USER);
|
||||
|
||||
$this->assertEquals(UserFixtures::USERNAME_USER, $user->getUsername());
|
||||
$this->assertEquals(UserFixtures::USERNAME_USER, $user->getUserIdentifier());
|
||||
$this->assertEquals('Johnny', $user->getAlias());
|
||||
$this->assertEquals('Code Monkey', $user->getTitle());
|
||||
$this->assertEquals('updated@example.com', $user->getEmail());
|
||||
$this->assertTrue($user->isEnabled());
|
||||
}
|
||||
|
||||
public function testEditActionWithActiveFlag()
|
||||
public function testEditActionWithActiveFlag(): void
|
||||
{
|
||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_SUPER_ADMIN);
|
||||
$this->request($client, '/profile/' . UserFixtures::USERNAME_USER . '/edit');
|
||||
@@ -179,14 +183,14 @@ class ProfileControllerTest extends ControllerBaseTest
|
||||
|
||||
$user = $this->getUserByRole(User::ROLE_USER);
|
||||
|
||||
$this->assertEquals(UserFixtures::USERNAME_USER, $user->getUsername());
|
||||
$this->assertEquals(UserFixtures::USERNAME_USER, $user->getUserIdentifier());
|
||||
$this->assertEquals('Johnny', $user->getAlias());
|
||||
$this->assertEquals('Code Monkey', $user->getTitle());
|
||||
$this->assertEquals('updated@example.com', $user->getEmail());
|
||||
$this->assertFalse($user->isEnabled());
|
||||
}
|
||||
|
||||
public function testPasswordAction()
|
||||
public function testPasswordAction(): void
|
||||
{
|
||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_USER);
|
||||
$this->request($client, '/profile/' . UserFixtures::USERNAME_USER . '/password');
|
||||
@@ -194,12 +198,12 @@ class ProfileControllerTest extends ControllerBaseTest
|
||||
/** @var User $user */
|
||||
$user = $this->getUserByRole(User::ROLE_USER);
|
||||
|
||||
/** @var EncoderFactoryInterface $passwordEncoder */
|
||||
$passwordEncoder = static::$kernel->getContainer()->get('test.PasswordEncoder');
|
||||
/** @var PasswordHasherFactoryInterface $passwordEncoder */
|
||||
$passwordEncoder = self::getContainer()->get('security.password_hasher_factory');
|
||||
|
||||
$this->assertTrue($passwordEncoder->getEncoder($user)->isPasswordValid($user->getPassword(), UserFixtures::DEFAULT_PASSWORD, $user->getSalt()));
|
||||
$this->assertFalse($passwordEncoder->getEncoder($user)->isPasswordValid($user->getPassword(), 'test123', $user->getSalt()));
|
||||
$this->assertEquals(UserFixtures::USERNAME_USER, $user->getUsername());
|
||||
$this->assertTrue($passwordEncoder->getPasswordHasher($user)->verify($user->getPassword(), UserFixtures::DEFAULT_PASSWORD));
|
||||
$this->assertFalse($passwordEncoder->getPasswordHasher($user)->verify($user->getPassword(), 'test123'));
|
||||
$this->assertEquals(UserFixtures::USERNAME_USER, $user->getUserIdentifier());
|
||||
|
||||
$form = $client->getCrawler()->filter('form[name=user_password]')->form();
|
||||
$client->submit($form, [
|
||||
@@ -212,18 +216,24 @@ class ProfileControllerTest extends ControllerBaseTest
|
||||
]);
|
||||
|
||||
$this->assertIsRedirect($client, $this->createUrl('/profile/' . urlencode(UserFixtures::USERNAME_USER) . '/password'));
|
||||
$client->followRedirect();
|
||||
$this->assertTrue($client->getResponse()->isSuccessful());
|
||||
// cannot follow redirect here, because the password was changed and the user/password registered in the client
|
||||
// are the old ones, so following the redirect would fail with "Unauthorized".
|
||||
|
||||
$this->assertHasFlashSuccess($client);
|
||||
$this->tearDown();
|
||||
$client = self::createClient([], [
|
||||
'PHP_AUTH_USER' => UserFixtures::USERNAME_USER,
|
||||
'PHP_AUTH_PW' => 'test1234',
|
||||
]);
|
||||
$this->request($client, '/profile/' . UserFixtures::USERNAME_USER . '/password');
|
||||
$this->assertTrue($client->getResponse()->isSuccessful());
|
||||
|
||||
$user = $this->getUserByRole(User::ROLE_USER);
|
||||
|
||||
$this->assertFalse($passwordEncoder->getEncoder($user)->isPasswordValid($user->getPassword(), UserFixtures::DEFAULT_PASSWORD, $user->getSalt()));
|
||||
$this->assertTrue($passwordEncoder->getEncoder($user)->isPasswordValid($user->getPassword(), 'test1234', $user->getSalt()));
|
||||
$this->assertFalse($passwordEncoder->getPasswordHasher($user)->verify($user->getPassword(), UserFixtures::DEFAULT_PASSWORD));
|
||||
$this->assertTrue($passwordEncoder->getPasswordHasher($user)->verify($user->getPassword(), 'test1234'));
|
||||
}
|
||||
|
||||
public function testPasswordActionFailsIfPasswordLengthToShort()
|
||||
public function testPasswordActionFailsIfPasswordLengthToShort(): void
|
||||
{
|
||||
$this->assertFormHasValidationError(
|
||||
User::ROLE_USER,
|
||||
@@ -241,19 +251,19 @@ class ProfileControllerTest extends ControllerBaseTest
|
||||
);
|
||||
}
|
||||
|
||||
public function testApiTokenAction()
|
||||
public function testApiTokenAction(): void
|
||||
{
|
||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_USER);
|
||||
$this->request($client, '/profile/' . UserFixtures::USERNAME_USER . '/api-token');
|
||||
|
||||
/** @var User $user */
|
||||
$user = $this->getUserByRole(User::ROLE_USER);
|
||||
/** @var EncoderFactoryInterface $passwordEncoder */
|
||||
$passwordEncoder = static::$kernel->getContainer()->get('test.PasswordEncoder');
|
||||
/** @var PasswordHasherFactoryInterface $passwordEncoder */
|
||||
$passwordEncoder = self::getContainer()->get('security.password_hasher_factory');
|
||||
|
||||
$this->assertTrue($passwordEncoder->getEncoder($user)->isPasswordValid($user->getApiToken(), UserFixtures::DEFAULT_API_TOKEN, $user->getSalt()));
|
||||
$this->assertFalse($passwordEncoder->getEncoder($user)->isPasswordValid($user->getApiToken(), 'test1234', $user->getSalt()));
|
||||
$this->assertEquals(UserFixtures::USERNAME_USER, $user->getUsername());
|
||||
$this->assertTrue($passwordEncoder->getPasswordHasher($user)->verify($user->getApiToken(), UserFixtures::DEFAULT_API_TOKEN));
|
||||
$this->assertFalse($passwordEncoder->getPasswordHasher($user)->verify($user->getApiToken(), 'test1234'));
|
||||
$this->assertEquals(UserFixtures::USERNAME_USER, $user->getUserIdentifier());
|
||||
|
||||
$form = $client->getCrawler()->filter('form[name=user_api_token]')->form();
|
||||
$client->submit($form, [
|
||||
@@ -273,11 +283,11 @@ class ProfileControllerTest extends ControllerBaseTest
|
||||
|
||||
$user = $this->getUserByRole(User::ROLE_USER);
|
||||
|
||||
$this->assertFalse($passwordEncoder->getEncoder($user)->isPasswordValid($user->getApiToken(), UserFixtures::DEFAULT_API_TOKEN, $user->getSalt()));
|
||||
$this->assertTrue($passwordEncoder->getEncoder($user)->isPasswordValid($user->getApiToken(), 'test1234', $user->getSalt()));
|
||||
$this->assertFalse($passwordEncoder->getPasswordHasher($user)->verify($user->getApiToken(), UserFixtures::DEFAULT_API_TOKEN));
|
||||
$this->assertTrue($passwordEncoder->getPasswordHasher($user)->verify($user->getApiToken(), 'test1234'));
|
||||
}
|
||||
|
||||
public function testApiTokenActionFailsIfPasswordLengthToShort()
|
||||
public function testApiTokenActionFailsIfPasswordLengthToShort(): void
|
||||
{
|
||||
$this->assertFormHasValidationError(
|
||||
User::ROLE_USER,
|
||||
@@ -295,14 +305,14 @@ class ProfileControllerTest extends ControllerBaseTest
|
||||
);
|
||||
}
|
||||
|
||||
public function testRolesActionIsSecured()
|
||||
public function testRolesActionIsSecured(): void
|
||||
{
|
||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_TEAMLEAD);
|
||||
$this->request($client, '/profile/' . UserFixtures::USERNAME_USER . '/roles');
|
||||
$this->assertFalse($client->getResponse()->isSuccessful());
|
||||
}
|
||||
|
||||
public function testRolesAction()
|
||||
public function testRolesAction(): void
|
||||
{
|
||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_SUPER_ADMIN);
|
||||
$this->request($client, '/profile/' . UserFixtures::USERNAME_USER . '/roles');
|
||||
@@ -331,17 +341,17 @@ class ProfileControllerTest extends ControllerBaseTest
|
||||
$this->assertEquals(['ROLE_TEAMLEAD', 'ROLE_SUPER_ADMIN', 'ROLE_USER'], $user->getRoles());
|
||||
}
|
||||
|
||||
public function testTeamsActionIsSecured()
|
||||
public function testTeamsActionIsSecured(): void
|
||||
{
|
||||
$this->assertUrlIsSecured('/profile/' . UserFixtures::USERNAME_USER . '/teams');
|
||||
}
|
||||
|
||||
public function testTeamsActionIsSecuredForRole()
|
||||
public function testTeamsActionIsSecuredForRole(): void
|
||||
{
|
||||
$this->assertUrlIsSecuredForRole(User::ROLE_TEAMLEAD, '/profile/' . UserFixtures::USERNAME_USER . '/teams');
|
||||
}
|
||||
|
||||
public function testTeamsAction()
|
||||
public function testTeamsAction(): void
|
||||
{
|
||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_SUPER_ADMIN);
|
||||
|
||||
@@ -379,26 +389,26 @@ class ProfileControllerTest extends ControllerBaseTest
|
||||
$this->assertCount(1, $user->getTeams());
|
||||
}
|
||||
|
||||
public function getPreferencesTestData()
|
||||
public function getPreferencesTestData(): array
|
||||
{
|
||||
return [
|
||||
// assert that the user doesn't have the "hourly-rate_own_profile" permission
|
||||
[User::ROLE_USER, UserFixtures::USERNAME_USER, 82, 82, 'ar', null],
|
||||
[User::ROLE_USER, UserFixtures::USERNAME_USER, 82, 82, 'ar', null, false],
|
||||
// teamleads are allowed to update their own hourly rate, but not other peoples hourly rate
|
||||
[User::ROLE_TEAMLEAD, UserFixtures::USERNAME_TEAMLEAD, 35, 37.5, 'ar', 19.54],
|
||||
[User::ROLE_TEAMLEAD, UserFixtures::USERNAME_TEAMLEAD, 35, 37.5, 'ar', 19.54, true],
|
||||
// admins are allowed to update their own hourly rate, but not other peoples hourly rate
|
||||
[User::ROLE_ADMIN, UserFixtures::USERNAME_ADMIN, 81, 37.5, 'ar', 19.54],
|
||||
[User::ROLE_ADMIN, UserFixtures::USERNAME_ADMIN, 81, 37.5, 'ar', 19.54, true],
|
||||
// super-admins are allowed to update other peoples hourly rate
|
||||
[User::ROLE_SUPER_ADMIN, UserFixtures::USERNAME_ADMIN, 81, 37.5, 'en', 19.54],
|
||||
[User::ROLE_SUPER_ADMIN, UserFixtures::USERNAME_ADMIN, 81, 37.5, 'en', 19.54, true],
|
||||
// super-admins are allowed to update their own hourly rate
|
||||
[User::ROLE_SUPER_ADMIN, UserFixtures::USERNAME_SUPER_ADMIN, 46, 37.5, 'ar', 19.54],
|
||||
[User::ROLE_SUPER_ADMIN, UserFixtures::USERNAME_SUPER_ADMIN, 46, 37.5, 'ar', 19.54, true],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getPreferencesTestData
|
||||
*/
|
||||
public function testPreferencesAction($role, $username, $hourlyRateOriginal, $hourlyRate, $expectedLocale, $expectedInternalRate)
|
||||
public function testPreferencesAction($role, $username, $hourlyRateOriginal, $hourlyRate, string $expectedLocale, float|null $expectedInternalRate, bool $withRateSettings): void
|
||||
{
|
||||
$client = $this->getClientForAuthenticatedUser($role);
|
||||
$this->request($client, '/profile/' . $username . '/prefs');
|
||||
@@ -408,19 +418,24 @@ class ProfileControllerTest extends ControllerBaseTest
|
||||
|
||||
$this->assertEquals($hourlyRateOriginal, $user->getPreferenceValue(UserPreference::HOURLY_RATE));
|
||||
$this->assertNull($user->getPreferenceValue(UserPreference::INTERNAL_RATE));
|
||||
$this->assertNull($user->getPreferenceValue(UserPreference::SKIN));
|
||||
$this->assertEquals('default', $user->getPreferenceValue(UserPreference::SKIN));
|
||||
|
||||
$data = [
|
||||
UserPreference::TIMEZONE => ['value' => 'America/Creston'],
|
||||
UserPreference::LOCALE => ['value' => 'ar'],
|
||||
UserPreference::FIRST_WEEKDAY => ['value' => 'sunday'],
|
||||
UserPreference::SKIN => ['value' => 'dark'],
|
||||
];
|
||||
|
||||
if ($withRateSettings) {
|
||||
$data[UserPreference::HOURLY_RATE] = ['value' => 37.5];
|
||||
$data[UserPreference::INTERNAL_RATE] = ['value' => 19.54];
|
||||
}
|
||||
|
||||
$form = $client->getCrawler()->filter('form[name=user_preferences_form]')->form();
|
||||
$client->submit($form, [
|
||||
'user_preferences_form' => [
|
||||
'preferences' => [
|
||||
0 => ['name' => UserPreference::HOURLY_RATE, 'value' => 37.5],
|
||||
1 => ['name' => UserPreference::INTERNAL_RATE, 'value' => 19.54],
|
||||
2 => ['name' => UserPreference::TIMEZONE, 'value' => 'America/Creston'],
|
||||
3 => ['name' => UserPreference::LOCALE, 'value' => 'ar'],
|
||||
4 => ['name' => UserPreference::FIRST_WEEKDAY, 'value' => 'sunday'],
|
||||
6 => ['name' => UserPreference::SKIN, 'value' => 'blue'],
|
||||
]
|
||||
'preferences' => $data
|
||||
]
|
||||
]);
|
||||
|
||||
@@ -441,8 +456,98 @@ class ProfileControllerTest extends ControllerBaseTest
|
||||
$this->assertEquals('ar', $user->getPreferenceValue(UserPreference::LOCALE));
|
||||
$this->assertEquals('ar', $user->getLanguage());
|
||||
$this->assertEquals('ar', $user->getLocale());
|
||||
$this->assertEquals('blue', $user->getPreferenceValue(UserPreference::SKIN));
|
||||
$this->assertEquals('dark', $user->getPreferenceValue(UserPreference::SKIN));
|
||||
$this->assertEquals('sunday', $user->getPreferenceValue(UserPreference::FIRST_WEEKDAY));
|
||||
$this->assertEquals('sunday', $user->getFirstDayOfWeek());
|
||||
}
|
||||
|
||||
public function testIsTwoFactorSecure(): void
|
||||
{
|
||||
$this->assertUrlIsSecured('/profile/' . UserFixtures::USERNAME_USER . '/2fa');
|
||||
}
|
||||
|
||||
public function testTwoFactor(): void
|
||||
{
|
||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_USER);
|
||||
|
||||
$user = $this->getUserByName(UserFixtures::USERNAME_USER);
|
||||
self::assertFalse($user->hasTotpSecret());
|
||||
|
||||
$this->request($client, '/profile/' . UserFixtures::USERNAME_USER . '/2fa');
|
||||
|
||||
$user = $this->getUserByName(UserFixtures::USERNAME_USER);
|
||||
self::assertTrue($user->hasTotpSecret());
|
||||
|
||||
$content = $client->getResponse()->getContent();
|
||||
self::assertNotFalse($content);
|
||||
|
||||
$imgUrl = $this->createUrl('/profile/' . UserFixtures::USERNAME_USER . '/totp.png');
|
||||
$this->assertStringContainsString('<img src="' . $imgUrl . '" alt="TOTP QR Code" style="max-width: 200px; max-height: 200px;" />', $content);
|
||||
|
||||
$formUrl = $this->createUrl('/profile/' . UserFixtures::USERNAME_USER . '/2fa');
|
||||
$this->assertStringContainsString('<form name="user_two_factor" method="post" action="' . $formUrl . '" id="user_two_factor_form">', $content);
|
||||
}
|
||||
|
||||
public function testActivateTwoFactorWithEmptyToken(): void
|
||||
{
|
||||
$this->assertFormHasValidationError(
|
||||
User::ROLE_USER,
|
||||
'/profile/' . UserFixtures::USERNAME_USER . '/2fa',
|
||||
'form[name=user_two_factor]',
|
||||
[
|
||||
'user_two_factor' => [
|
||||
'code' => ''
|
||||
]
|
||||
],
|
||||
['#user_two_factor_code']
|
||||
);
|
||||
}
|
||||
|
||||
public function testActivateTwoFactorWithWrongToken(): void
|
||||
{
|
||||
$this->assertFormHasValidationError(
|
||||
User::ROLE_USER,
|
||||
'/profile/' . UserFixtures::USERNAME_USER . '/2fa',
|
||||
'form[name=user_two_factor]',
|
||||
[
|
||||
'user_two_factor' => [
|
||||
'code' => '1234567890oikjhb'
|
||||
]
|
||||
],
|
||||
['#user_two_factor_code']
|
||||
);
|
||||
}
|
||||
|
||||
public function testIsTwoFactorDeactivateSecure(): void
|
||||
{
|
||||
$this->assertUrlIsSecured('/profile/' . UserFixtures::USERNAME_USER . '/2fa_deactivate', 'POST');
|
||||
}
|
||||
|
||||
public function testIsTwoFactorImageSecure(): void
|
||||
{
|
||||
$this->assertUrlIsSecured('/profile/' . UserFixtures::USERNAME_USER . '/totp.png');
|
||||
}
|
||||
|
||||
public function testTwoFactorImageFailsOnMissingSecret(): void
|
||||
{
|
||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_USER);
|
||||
|
||||
$this->request($client, '/profile/' . UserFixtures::USERNAME_USER . '/totp.png');
|
||||
$this->assertRouteNotFound($client);
|
||||
}
|
||||
|
||||
public function testTwoFactorImage(): void
|
||||
{
|
||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_USER);
|
||||
|
||||
$user = $this->getUserByName(UserFixtures::USERNAME_USER);
|
||||
self::assertFalse($user->hasTotpSecret());
|
||||
|
||||
// this is required, so the totp secret is stored in the user entity
|
||||
$this->request($client, '/profile/' . UserFixtures::USERNAME_USER . '/2fa');
|
||||
|
||||
$this->request($client, '/profile/' . UserFixtures::USERNAME_USER . '/totp.png');
|
||||
self::assertTrue($client->getResponse()->isSuccessful());
|
||||
self::assertEquals('image/png', $client->getResponse()->headers->get('Content-Type'));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user