From 40681b4347bfec0a24167038777cafb43243ed61 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Wed, 3 Dec 2025 20:55:11 +0700 Subject: [PATCH] feat(test): membuat testing untuk module forgot dan reset password --- .../Livewire/Auth/ForgotPasswordTest.php | 78 ++++++++++++++ .../Livewire/Auth/ResetPasswordTest.php | 102 ++++++++++++++++++ 2 files changed, 180 insertions(+) create mode 100644 tests/Feature/Livewire/Auth/ForgotPasswordTest.php create mode 100644 tests/Feature/Livewire/Auth/ResetPasswordTest.php diff --git a/tests/Feature/Livewire/Auth/ForgotPasswordTest.php b/tests/Feature/Livewire/Auth/ForgotPasswordTest.php new file mode 100644 index 0000000..9750be5 --- /dev/null +++ b/tests/Feature/Livewire/Auth/ForgotPasswordTest.php @@ -0,0 +1,78 @@ +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(); +}); diff --git a/tests/Feature/Livewire/Auth/ResetPasswordTest.php b/tests/Feature/Livewire/Auth/ResetPasswordTest.php new file mode 100644 index 0000000..909e45e --- /dev/null +++ b/tests/Feature/Livewire/Auth/ResetPasswordTest.php @@ -0,0 +1,102 @@ + $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(); +});