each(fn ($role) => Role::create(['name' => $role])); $this->correctPassword = config('myconfig.password_default'); $this->wrongPassword = 'wrongpassword'; }); /* |-------------------------------------------------------------------------- | Helpers |-------------------------------------------------------------------------- */ function makeUser(?string $role = null, bool $isActive = true): User { $factory = User::factory(); $factory = $isActive ? $factory->active() : $factory->inactive(); $user = $factory ->has(Employee::factory()->male()->permanent()) ->create(); if ($role) { $user->assignRole($role); } return $user; } function attemptLogin(string $login, string $password) { return Livewire::test(Login::class) ->set('form.login', $login) ->set('form.password', $password) ->call('auth'); } /* |-------------------------------------------------------------------------- | Component Rendering & Mount |-------------------------------------------------------------------------- */ it('renders login component successfully', function () { Livewire::test(Login::class) ->assertViewIs('livewire.auth.login') ->assertSet('form.login', '') ->assertSet('form.password', ''); }); it('mounts component without query parameters', function () { Livewire::test(Login::class) ->assertSet('form.login', '') ->assertSet('form.password', ''); }); it('mounts component with message query parameter', function () { $message = 'Test message'; Livewire::withQueryParams(['message' => $message]) ->test(Login::class) ->assertSet('form.login', '') ->assertSet('form.password', ''); }); /* |-------------------------------------------------------------------------- | Validation Rules |-------------------------------------------------------------------------- */ it('validates required fields', function () { Livewire::test(Login::class) ->set('form.login', '') ->set('form.password', '') ->call('auth') ->assertHasErrors(['form.login', 'form.password']); }); it('validates login field is required', function () { Livewire::test(Login::class) ->set('form.login', '') ->set('form.password', 'password123') ->call('auth') ->assertHasErrors(['form.login']); }); it('validates password field is required', function () { Livewire::test(Login::class) ->set('form.login', 'testuser') ->set('form.password', '') ->call('auth') ->assertHasErrors(['form.password']); }); /* |-------------------------------------------------------------------------- | Authentication Failures |-------------------------------------------------------------------------- */ it('fails authentication with wrong credentials', function () { attemptLogin('nonexistent@example.com', $this->correctPassword); expect(auth()->check())->toBeFalse(); }); it('fails authentication with non-existent user', function () { attemptLogin('nonexistent@example.com', $this->wrongPassword); expect(auth()->check())->toBeFalse(); }); /* |-------------------------------------------------------------------------- | Authentication Works (email & username) |-------------------------------------------------------------------------- */ it('successfully authenticates with email', function () { $user = makeUser('Developer'); attemptLogin($user->email, $this->correctPassword)->assertRedirect('/studio/dashboard/overview'); expect(auth()->check())->toBeTrue(); expect(auth()->id())->toBe($user->id); }); it('successfully authenticates with username', function () { $user = makeUser('Developer'); attemptLogin($user->username, $this->correctPassword)->assertRedirect('/studio/dashboard/overview'); expect(auth()->check())->toBeTrue(); expect(auth()->id())->toBe($user->id); }); /* |-------------------------------------------------------------------------- | Prevent Inactive User Login |-------------------------------------------------------------------------- */ it('prevents login for inactive user', function () { $user = makeUser('Developer', false); attemptLogin($user->email, $this->correctPassword); expect(auth()->check())->toBeFalse(); }); /* |-------------------------------------------------------------------------- | Role Redirect Tests |-------------------------------------------------------------------------- */ it('redirects developer to studio dashboard', function () { $user = makeUser('Developer'); attemptLogin($user->email, $this->correctPassword)->assertRedirect('/studio/dashboard/overview'); expect(auth()->check())->toBeTrue(); expect(auth()->id())->toBe($user->id); }); it('redirects owner to studio dashboard', function () { $user = makeUser('Owner'); attemptLogin($user->email, $this->correctPassword)->assertRedirect('/studio/dashboard/overview'); expect(auth()->check())->toBeTrue(); expect(auth()->id())->toBe($user->id); }); it('redirects leader to studio dashboard', function () { $user = makeUser('Leader'); attemptLogin($user->email, $this->correctPassword)->assertRedirect('/studio/dashboard/overview'); expect(auth()->check())->toBeTrue(); expect(auth()->id())->toBe($user->id); }); it('redirects admin to studio dashboard', function () { $user = makeUser('Admin'); attemptLogin($user->email, $this->correctPassword)->assertRedirect('/studio/dashboard/overview'); expect(auth()->check())->toBeTrue(); expect(auth()->id())->toBe($user->id); }); it('redirects partner to partner overview', function () { $user = makeUser('Partner'); attemptLogin($user->email, $this->correctPassword)->assertRedirect('/partner/overview'); expect(auth()->check())->toBeTrue(); expect(auth()->id())->toBe($user->id); }); it('redirects customer to member overview', function () { $user = makeUser('Customer'); attemptLogin($user->email, $this->correctPassword)->assertRedirect('/member/overview'); expect(auth()->check())->toBeTrue(); expect(auth()->id())->toBe($user->id); }); /* |-------------------------------------------------------------------------- | Edge Case |-------------------------------------------------------------------------- */ it('redirects user without role to login', function () { $user = makeUser(); attemptLogin($user->email, $this->correctPassword)->assertRedirect('/login'); expect(auth()->check())->toBeTrue(); expect(auth()->id())->toBe($user->id); }); it('regenerates session on successful login', function () { $user = makeUser('Developer'); attemptLogin($user->email, $this->correctPassword); expect(auth()->check())->toBeTrue(); expect(auth()->user()->id)->toBe($user->id); });