251 lines
7.1 KiB
PHP
251 lines
7.1 KiB
PHP
<?php
|
|
|
|
use App\Livewire\Auth\Login;
|
|
use App\Models\Employee;
|
|
use App\Models\User;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
use Livewire\Livewire;
|
|
use Spatie\Permission\Models\Role;
|
|
|
|
uses(RefreshDatabase::class);
|
|
|
|
beforeEach(function () {
|
|
collect(['Developer', 'Owner', 'Leader', 'Admin', 'Partner', 'Customer'])
|
|
->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);
|
|
});
|