skipUnlessFortifyFeature(Features::twoFactorAuthentication()); Features::twoFactorAuthentication([ 'confirm' => true, 'confirmPassword' => true, ]); } public function test_security_settings_page_can_be_rendered(): void { $user = User::factory()->create(); $this->actingAs($user) ->withSession(['auth.password_confirmed_at' => time()]) ->get(route('security.edit')) ->assertOk() ->assertSee('Two-factor authentication') ->assertSee('Enable 2FA'); } public function test_security_settings_page_requires_password_confirmation_when_enabled(): void { $user = User::factory()->create(); $response = $this->actingAs($user) ->get(route('security.edit')); $response->assertRedirect(route('password.confirm')); } public function test_security_settings_page_renders_without_two_factor_when_feature_is_disabled(): void { config(['fortify.features' => []]); $user = User::factory()->create(); $this->actingAs($user) ->withSession(['auth.password_confirmed_at' => time()]) ->get(route('security.edit')) ->assertOk() ->assertSee('Update password') ->assertDontSee('Two-factor authentication'); } public function test_two_factor_authentication_disabled_when_confirmation_abandoned_between_requests(): void { $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' => null, ])->save(); $this->actingAs($user); $component = Livewire::test(Security::class); $component->assertSet('twoFactorEnabled', false); $this->assertDatabaseHas('users', [ 'id' => $user->id, 'two_factor_secret' => null, 'two_factor_recovery_codes' => null, ]); } public function test_password_can_be_updated(): void { $user = User::factory()->create([ 'password' => Hash::make('password'), ]); $this->actingAs($user); $response = Livewire::test(Security::class) ->set('current_password', 'password') ->set('password', 'new-password') ->set('password_confirmation', 'new-password') ->call('updatePassword'); $response->assertHasNoErrors(); $this->assertTrue(Hash::check('new-password', $user->refresh()->password)); } public function test_correct_password_must_be_provided_to_update_password(): void { $user = User::factory()->create([ 'password' => Hash::make('password'), ]); $this->actingAs($user); $response = Livewire::test(Security::class) ->set('current_password', 'wrong-password') ->set('password', 'new-password') ->set('password_confirmation', 'new-password') ->call('updatePassword'); $response->assertHasErrors(['current_password']); } }