129 lines
3.6 KiB
PHP
129 lines
3.6 KiB
PHP
<?php
|
|
|
|
use App\Models\User;
|
|
use Illuminate\Support\Facades\RateLimiter;
|
|
use Laravel\Fortify\Features;
|
|
|
|
test('login screen can be rendered', function () {
|
|
$response = $this->get(route('login'));
|
|
|
|
$response->assertStatus(200);
|
|
});
|
|
|
|
test('login screen can be rendered with an intended destination in session', function () {
|
|
$response = $this
|
|
->withSession(['url.intended' => route('dashboard')])
|
|
->get(route('login'));
|
|
|
|
$response->assertSuccessful();
|
|
});
|
|
|
|
test('login screen stays available for returning users with an intended destination', function () {
|
|
$response = $this
|
|
->withCookie('whisper_money_returning_user', '1')
|
|
->withSession(['url.intended' => route('dashboard')])
|
|
->get(route('login'));
|
|
|
|
$response->assertSuccessful();
|
|
});
|
|
|
|
test('users can authenticate using the login screen', function () {
|
|
$user = User::factory()->withoutTwoFactor()->create();
|
|
|
|
$response = $this->post(route('login.store'), [
|
|
'email' => $user->email,
|
|
'password' => 'password',
|
|
]);
|
|
|
|
$this->assertAuthenticated();
|
|
$response
|
|
->assertRedirect(route('dashboard', absolute: false))
|
|
->assertCookie('whisper_money_returning_user');
|
|
});
|
|
|
|
test('logging in records the last logged in date', function () {
|
|
$user = User::factory()->withoutTwoFactor()->create(['last_logged_in_at' => null]);
|
|
|
|
$this->post(route('login.store'), [
|
|
'email' => $user->email,
|
|
'password' => 'password',
|
|
]);
|
|
|
|
$this->assertAuthenticated();
|
|
expect($user->fresh()->last_logged_in_at)->not->toBeNull();
|
|
});
|
|
|
|
test('users with two factor enabled are redirected to two factor challenge', function () {
|
|
if (! Features::canManageTwoFactorAuthentication()) {
|
|
$this->markTestSkipped('Two-factor authentication is not enabled.');
|
|
}
|
|
|
|
Features::twoFactorAuthentication([
|
|
'confirm' => true,
|
|
'confirmPassword' => true,
|
|
]);
|
|
|
|
$user = User::factory()->create();
|
|
|
|
$user->forceFill([
|
|
'two_factor_secret' => encrypt('test-secret'),
|
|
'two_factor_recovery_codes' => encrypt(json_encode(['code1', 'code2'])),
|
|
'two_factor_confirmed_at' => now(),
|
|
])->save();
|
|
|
|
$response = $this->post(route('login'), [
|
|
'email' => $user->email,
|
|
'password' => 'password',
|
|
]);
|
|
|
|
$response->assertRedirect(route('two-factor.login'));
|
|
$response->assertSessionHas('login.id', $user->id);
|
|
$this->assertGuest();
|
|
});
|
|
|
|
test('users can not authenticate with invalid password', function () {
|
|
$user = User::factory()->create();
|
|
|
|
$this->post(route('login.store'), [
|
|
'email' => $user->email,
|
|
'password' => 'wrong-password',
|
|
]);
|
|
|
|
$this->assertGuest();
|
|
});
|
|
|
|
test('deleted users can not authenticate', function () {
|
|
$user = User::factory()->withoutTwoFactor()->create();
|
|
$user->delete();
|
|
|
|
$response = $this->post(route('login.store'), [
|
|
'email' => $user->email,
|
|
'password' => 'password',
|
|
]);
|
|
|
|
$response->assertSessionHasErrors('email');
|
|
$this->assertGuest();
|
|
});
|
|
|
|
test('users can logout', function () {
|
|
$user = User::factory()->create();
|
|
|
|
$response = $this->actingAs($user)->post(route('logout'));
|
|
|
|
$this->assertGuest();
|
|
$response->assertRedirect(route('home'));
|
|
});
|
|
|
|
test('users are rate limited', function () {
|
|
$user = User::factory()->create();
|
|
|
|
RateLimiter::increment(md5('login'.implode('|', [$user->email, '127.0.0.1'])), amount: 5);
|
|
|
|
$response = $this->post(route('login.store'), [
|
|
'email' => $user->email,
|
|
'password' => 'wrong-password',
|
|
]);
|
|
|
|
$response->assertTooManyRequests();
|
|
});
|