'super-admin', 'guard_name' => 'web']); Role::firstOrCreate(['name' => 'admin', 'guard_name' => 'web']); }); test('it verifies mail service configuration defaults for netgescon', function () { expect(config('mail.mailers.smtp.transport'))->toBe('smtp') ->and(config('mail.mailers.smtp.host'))->toBe('smtp.gmail.com') ->and(config('mail.from.address'))->toBe('michele@netgescon.it') ->and(config('mail.from.name'))->toBe('NetGescon'); }); test('it formats NetGescon password reset notification with Italian text and security links', function () { $user = User::factory()->create([ 'name' => 'Michele Test', 'email' => 'michele.test@netgescon.it', ]); $user->assignRole('super-admin'); $notification = new NetGesconResetPasswordNotification('test-token-123'); $notification->url = 'http://192.168.0.205:8000/admin-filament/password-reset/reset?token=test-token-123'; $mail = $notification->toMail($user); expect($mail->subject)->toBe('NetGescon - Reimpostazione della Password') ->and($mail->greeting)->toContain('Michele Test') ->and($mail->actionText)->toBe('Reimposta Password') ->and($mail->actionUrl)->toBe('http://192.168.0.205:8000/admin-filament/password-reset/reset?token=test-token-123') ->and(collect($mail->introLines)->join(' '))->toContain('NetGescon') ->and(collect($mail->outroLines)->join(' '))->toContain('60 minuti'); }); test('it sends password reset email via artisan command for registered user', function () { Notification::fake(); $user = User::factory()->create([ 'name' => 'Mario Rossi', 'email' => 'mario.rossi@netgescon.it', ]); $user->assignRole('admin'); $exitCode = Artisan::call('netgescon:send-password-reset', ['email' => 'mario.rossi@netgescon.it']); expect($exitCode)->toBe(0); Notification::assertSentTo($user, NetGesconResetPasswordNotification::class); }); test('it fails artisan command gracefully when user does not exist', function () { $exitCode = Artisan::call('netgescon:send-password-reset', ['email' => 'nonexistent@netgescon.it']); expect($exitCode)->toBe(1); }); test('it mounts Filament password reset request page and profile page routes', function () { $requestResponse = $this->get('/admin-filament/password-reset/request'); $requestResponse->assertStatus(200); $profileRoute = route('filament.admin-filament.auth.profile'); expect($profileRoute)->toContain('/admin-filament/profile'); });