diff --git a/app/Livewire/Profile/Index.php b/app/Livewire/Profile/Index.php index a69424cffd..8801ffac36 100644 --- a/app/Livewire/Profile/Index.php +++ b/app/Livewire/Profile/Index.php @@ -222,6 +222,7 @@ class Index extends Component $this->show_verification = false; $this->dispatch('success', 'Email address updated successfully.'); + $this->dispatch('close-email-change-modal'); auditLog('ui.user.email_changed', $this->auditContext()); } else { $this->dispatch('error', 'Failed to update email address.'); diff --git a/tests/Feature/ProfileEmailChangeModalTest.php b/tests/Feature/ProfileEmailChangeModalTest.php new file mode 100644 index 0000000000..da4f6f3b31 --- /dev/null +++ b/tests/Feature/ProfileEmailChangeModalTest.php @@ -0,0 +1,40 @@ +user = User::factory()->create(['name' => 'Profile User', 'email' => 'old@example.com']); + $this->user->forceFill([ + 'pending_email' => 'new@example.com', + 'email_change_code' => '123456', + 'email_change_code_expires_at' => now()->addMinutes(10), + ])->save(); + + $this->actingAs($this->user); +}); + +it('closes the email change modal after a successful verification', function () { + Livewire::test(ProfileIndex::class) + ->set('email_verification_code', '123456') + ->call('verifyEmailChange') + ->assertDispatched('success', 'Email address updated successfully.') + ->assertDispatched('close-email-change-modal') + ->assertSet('show_verification', false); + + expect($this->user->fresh()->email)->toBe('new@example.com'); +}); + +it('keeps the email change modal open when the verification code is wrong', function () { + Livewire::test(ProfileIndex::class) + ->set('email_verification_code', '654321') + ->call('verifyEmailChange') + ->assertDispatched('error', 'Invalid or expired verification code.') + ->assertNotDispatched('close-email-change-modal'); + + expect($this->user->fresh()->email)->toBe('old@example.com'); +});