parfum/tests/Feature/Studio/Master/User/CreateTest.php

110 lines
3.5 KiB
PHP

<?php
use App\Enums\Gender;
use App\Enums\UserStatus;
use App\Livewire\Studio\Master\User\Create;
use App\Models\Outlet;
use App\Models\User;
use Carbon\Carbon;
use Livewire\Livewire;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;
beforeEach(function () {
$this->setupUser();
$role = Role::firstOrCreate(['name' => 'Owner']);
Permission::firstOrCreate(['name' => 'create user']);
$role->givePermissionTo('create user');
$this->user->assignRole($role);
});
it('renders the create user page correctly', function () {
$this->actingAs($this->user)
->get(route('studio.master.user.create'))
->assertOk()
->assertSeeLivewire(Create::class);
});
it('validates required fields', function () {
Livewire::actingAs($this->user)
->test(Create::class)
->call('save')
->assertHasErrors([
'form.full_name' => 'required',
'form.username' => 'required',
'form.email' => 'required',
'form.phone_number' => 'required',
'form.base_salary' => 'required',
'form.birthdate' => 'required',
'form.hire_date' => 'required',
'form.gender' => 'required',
'form.outlet_ids' => 'required',
'form.role_ids' => 'required',
]);
});
it('validates username minimum length', function () {
Livewire::actingAs($this->user)
->test(Create::class)
->set('form.username', 'abc')
->call('save')
->assertHasErrors(['form.username' => 'min']);
});
it('validates birthdate must be at least 18 years ago', function () {
Livewire::actingAs($this->user)
->test(Create::class)
->set('form.birthdate', Carbon::now()->subYears(17)->format('Y-m-d'))
->call('save')
->assertHasErrors(['form.birthdate' => 'before']);
});
it('can store a new user/employee', function () {
$outlet = Outlet::factory()->create();
$role = Role::firstOrCreate(['name' => 'Admin']);
Livewire::actingAs($this->user)
->test(Create::class)
->set('form.full_name', 'Pegawai Baru')
->set('form.username', 'pegawaibaru')
->set('form.email', 'pegawai@example.com')
->set('form.phone_number', '0812 3456 7890')
->set('form.base_salary', '5.000.000')
->set('form.birthdate', '2000-01-01')
->set('form.hire_date', '2024-01-01')
->set('form.gender', Gender::MALE->value)
->set('form.status', UserStatus::ACTIVE->value)
->set('form.outlet_ids', [$outlet->id])
->set('form.role_ids', [$role->id])
->call('save')
->assertHasNoErrors()
->assertRedirect(route('studio.master.user.index', ['notification' => 'Pegawai berhasil ditambahkan.']));
$this->assertDatabaseHas('users', [
'username' => 'pegawaibaru',
'email' => 'pegawai@example.com',
]);
$user = User::where('username', 'pegawaibaru')->first();
$this->assertDatabaseHas('employees', [
'user_id' => $user->id,
'full_name' => 'Pegawai Baru',
'base_salary' => 5000000,
]);
expect($user->outlets)->toHaveCount(1);
expect($user->hasRole('Admin'))->toBeTrue();
});
it('cannot create user without permission', function () {
$this->user->roles()->detach();
$this->user->permissions()->detach();
Livewire::actingAs($this->user)
->test(Create::class)
->set('form.full_name', 'Unauthorized User')
->call('save')
->assertForbidden();
});