feat(test): membuat testing untuk module forgot dan reset password

This commit is contained in:
Yoga Pangestu 2025-12-03 20:55:11 +07:00
parent eca3a7cd7b
commit 40681b4347
2 changed files with 180 additions and 0 deletions

View File

@ -0,0 +1,78 @@
<?php
use App\Livewire\Auth\ForgotPassword;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Password;
use Livewire\Livewire;
uses(RefreshDatabase::class);
/*
|--------------------------------------------------------------------------
| Helpers
|--------------------------------------------------------------------------
*/
function attemptSendResetLink(string $email)
{
return Livewire::test(ForgotPassword::class)
->set('email', $email)
->call('sendLink');
}
function mockPasswordResetStatus(string $status, string $email = 'user@example.com'): void
{
Password::shouldReceive('sendResetLink')
->once()
->with(['email' => $email])
->andReturn($status);
}
/*
|--------------------------------------------------------------------------
| Component Rendering
|--------------------------------------------------------------------------
*/
it('renders forgot password component successfully', function () {
Livewire::test(ForgotPassword::class)
->assertViewIs('livewire.auth.forgot-password')
->assertSet('email', '');
});
/*
|--------------------------------------------------------------------------
| Validation Rules
|--------------------------------------------------------------------------
*/
it('validates email field is required', function () {
Livewire::test(ForgotPassword::class)
->set('email', '')
->call('sendLink')
->assertHasErrors(['email' => 'required']);
});
/*
|--------------------------------------------------------------------------
| Send Reset Link
|--------------------------------------------------------------------------
*/
it('sends reset link successfully', function () {
$email = 'user@example.com';
mockPasswordResetStatus(Password::ResetLinkSent, $email);
attemptSendResetLink($email)
->assertHasNoErrors();
});
it('handles failure when sending reset link', function () {
$email = 'user@example.com';
mockPasswordResetStatus('passwords.user', $email);
attemptSendResetLink($email)
->assertHasNoErrors();
});

View File

@ -0,0 +1,102 @@
<?php
use App\Livewire\Auth\ResetPassword;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Password;
use Livewire\Livewire;
uses(RefreshDatabase::class);
/*
|--------------------------------------------------------------------------
| Helpers
|--------------------------------------------------------------------------
*/
function makeResetComponent(string $token = 'sample-token', string $email = 'user@example.com')
{
return Livewire::withQueryParams([
'token' => $token,
'email' => $email,
])->test(ResetPassword::class);
}
function attemptResetPassword(
string $token = 'sample-token',
string $email = 'user@example.com',
string $password = 'password123',
string $passwordConfirmation = 'password123'
) {
return makeResetComponent($token, $email)
->set('form.password', $password)
->set('form.password_confirmation', $passwordConfirmation)
->call('resetPassword');
}
function mockPasswordResetStatus(string $status): void
{
Password::shouldReceive('reset')
->once()
->andReturn($status);
}
/*
|--------------------------------------------------------------------------
| Component Rendering & Mount
|--------------------------------------------------------------------------
*/
it('renders reset password component successfully', function () {
$token = 'sample-token';
$email = 'user@example.com';
makeResetComponent($token, $email)
->assertViewIs('livewire.auth.reset-password')
->assertSet('token', $token)
->assertSet('email', $email);
});
/*
|--------------------------------------------------------------------------
| Validation Rules
|--------------------------------------------------------------------------
*/
it('validates password fields are required', function () {
makeResetComponent()
->set('form.password', '')
->set('form.password_confirmation', '')
->call('resetPassword')
->assertHasErrors(['form.password', 'form.password_confirmation']);
});
it('validates password confirmation must match', function () {
makeResetComponent()
->set('form.password', 'password123')
->set('form.password_confirmation', 'different123')
->call('resetPassword')
->assertHasErrors(['form.password' => 'confirmed']);
});
/*
|--------------------------------------------------------------------------
| Reset Password
|--------------------------------------------------------------------------
*/
it('resets password successfully', function () {
mockPasswordResetStatus(Password::PasswordReset);
attemptResetPassword()
->assertHasNoErrors()
->assertRedirect(route('login', [
'message' => 'Kata sandi berhasil diperbarui, silakan masuk kembali.',
]));
});
it('handles failure when resetting password', function () {
mockPasswordResetStatus('passwords.token');
attemptResetPassword()
->assertHasNoErrors();
});