Files
cabutan-bertuah-koipb/tests/Feature/UserManagementTest.php
2026-06-26 19:10:31 +08:00

118 lines
3.8 KiB
PHP

<?php
namespace Tests\Feature;
use App\Models\User;
use Database\Seeders\RoleUserSeeder;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Hash;
use Tests\TestCase;
class UserManagementTest extends TestCase
{
use RefreshDatabase;
private function admin(): User
{
$this->seed(RoleUserSeeder::class);
return User::where('email', 'admin@koipb.test')->first();
}
public function test_admin_can_create_user_with_role(): void
{
$this->actingAs($this->admin())->post(route('admin.users.store'), [
'name' => 'Pegawai Baru',
'email' => 'baru@koipb.test',
'role' => User::ROLE_KAUNTER,
'password' => 'rahsia123',
'password_confirmation' => 'rahsia123',
])->assertRedirect(route('admin.users.index'));
$user = User::where('email', 'baru@koipb.test')->first();
$this->assertNotNull($user);
$this->assertTrue($user->hasRole(User::ROLE_KAUNTER));
}
public function test_admin_can_change_role_and_password(): void
{
$admin = $this->admin();
$kaunter = User::where('email', 'kaunter@koipb.test')->first();
$this->actingAs($admin)->put(route('admin.users.update', $kaunter), [
'name' => $kaunter->name,
'email' => $kaunter->email,
'role' => User::ROLE_CABUTAN,
'password' => 'katalaluanbaru',
'password_confirmation' => 'katalaluanbaru',
])->assertRedirect(route('admin.users.index'));
$kaunter->refresh();
$this->assertTrue($kaunter->hasRole(User::ROLE_CABUTAN));
$this->assertFalse($kaunter->hasRole(User::ROLE_KAUNTER));
$this->assertTrue(Hash::check('katalaluanbaru', $kaunter->password));
}
public function test_cannot_delete_self(): void
{
$admin = $this->admin();
$this->actingAs($admin)->delete(route('admin.users.destroy', $admin))
->assertSessionHas('error');
$this->assertDatabaseHas('users', ['id' => $admin->id]);
}
public function test_cannot_demote_last_admin(): void
{
$admin = $this->admin();
$this->actingAs($admin)->put(route('admin.users.update', $admin), [
'name' => $admin->name,
'email' => $admin->email,
'role' => User::ROLE_KAUNTER,
])->assertSessionHas('error');
$admin->refresh();
$this->assertTrue($admin->hasRole(User::ROLE_ADMIN));
}
public function test_non_admin_cannot_access_user_management(): void
{
$this->seed(RoleUserSeeder::class);
$kaunter = User::where('email', 'kaunter@koipb.test')->first();
$this->actingAs($kaunter)->get(route('admin.users.index'))->assertForbidden();
}
public function test_user_can_change_own_password(): void
{
$this->seed(RoleUserSeeder::class);
$kaunter = User::where('email', 'kaunter@koipb.test')->first();
$this->actingAs($kaunter)->put(route('profile.password'), [
'current_password' => 'password',
'password' => 'katalaluanbaru',
'password_confirmation' => 'katalaluanbaru',
])->assertRedirect(route('profile.edit'));
$kaunter->refresh();
$this->assertTrue(Hash::check('katalaluanbaru', $kaunter->password));
}
public function test_wrong_current_password_rejected(): void
{
$this->seed(RoleUserSeeder::class);
$kaunter = User::where('email', 'kaunter@koipb.test')->first();
$this->actingAs($kaunter)->put(route('profile.password'), [
'current_password' => 'salah',
'password' => 'katalaluanbaru',
'password_confirmation' => 'katalaluanbaru',
])->assertSessionHasErrors('current_password');
$kaunter->refresh();
$this->assertTrue(Hash::check('password', $kaunter->password));
}
}