118 lines
3.8 KiB
PHP
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));
|
|
}
|
|
}
|