Files
prn2026/tests/Feature/WheelchairManagementTest.php
2026-06-03 08:51:22 +08:00

167 lines
6.1 KiB
PHP

<?php
namespace Tests\Feature;
use App\Models\PusatMengundi;
use App\Models\User;
use App\Models\WheelchairAllocation;
use App\Models\WheelchairTransaction;
use Database\Seeders\DatabaseSeeder;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class WheelchairManagementTest extends TestCase
{
use RefreshDatabase;
public function test_admin_can_create_or_update_wheelchair_allocation(): void
{
$this->seed(DatabaseSeeder::class);
$admin = User::query()->where('email', 'admin@prn.local')->firstOrFail();
$pusat = PusatMengundi::query()->where('code', 'PM001')->firstOrFail();
$this->actingAs($admin)
->post(route('admin.management.wheelchairs.store'), [
'election_id' => $pusat->election_id,
'pusat_mengundi_id' => $pusat->id,
'allocated_quantity' => 4,
'notes' => 'Tambahan kerusi roda.',
])
->assertRedirect();
$this->assertDatabaseHas('wheelchair_allocations', [
'election_id' => $pusat->election_id,
'pusat_mengundi_id' => $pusat->id,
'allocated_quantity' => 4,
]);
}
public function test_admin_can_record_taken_and_returned_wheelchairs(): void
{
$this->seed(DatabaseSeeder::class);
$admin = User::query()->where('email', 'admin@prn.local')->firstOrFail();
$allocation = WheelchairAllocation::query()->firstOrFail();
$allocation->update(['allocated_quantity' => 3]);
$this->actingAs($admin)
->post(route('admin.management.wheelchairs.transactions.store', $allocation), [
'transaction_type' => 'taken',
'quantity' => 2,
'taken_by_name' => 'Petugas Logistik',
'taken_at' => now()->format('Y-m-d H:i:s'),
'notes' => 'Ambil pagi.',
])
->assertRedirect(route('admin.management.wheelchairs.show', $allocation));
$this->actingAs($admin)
->post(route('admin.management.wheelchairs.transactions.store', $allocation), [
'transaction_type' => 'returned',
'quantity' => 1,
'returned_at' => now()->format('Y-m-d H:i:s'),
'return_condition' => 'baik',
])
->assertRedirect(route('admin.management.wheelchairs.show', $allocation));
$this->assertDatabaseHas('wheelchair_transactions', [
'wheelchair_allocation_id' => $allocation->id,
'transaction_type' => 'taken',
'quantity' => 2,
'taken_by_name' => 'Petugas Logistik',
'recorded_by_user_id' => $admin->id,
]);
$this->assertDatabaseHas('wheelchair_transactions', [
'wheelchair_allocation_id' => $allocation->id,
'transaction_type' => 'returned',
'quantity' => 1,
'return_condition' => 'baik',
]);
}
public function test_taken_quantity_cannot_exceed_available_allocation(): void
{
$this->seed(DatabaseSeeder::class);
$admin = User::query()->where('email', 'admin@prn.local')->firstOrFail();
$allocation = WheelchairAllocation::query()->firstOrFail();
$allocation->update(['allocated_quantity' => 2]);
$this->actingAs($admin)
->post(route('admin.management.wheelchairs.transactions.store', $allocation), [
'transaction_type' => 'taken',
'quantity' => 3,
'taken_by_name' => 'Petugas Logistik',
])
->assertSessionHasErrors('quantity');
$this->assertDatabaseMissing('wheelchair_transactions', [
'wheelchair_allocation_id' => $allocation->id,
'quantity' => 3,
]);
}
public function test_return_quantity_cannot_exceed_outstanding_quantity(): void
{
$this->seed(DatabaseSeeder::class);
$admin = User::query()->where('email', 'admin@prn.local')->firstOrFail();
$allocation = WheelchairAllocation::query()->firstOrFail();
$allocation->update(['allocated_quantity' => 2]);
WheelchairTransaction::query()->create([
'wheelchair_allocation_id' => $allocation->id,
'transaction_type' => 'taken',
'quantity' => 1,
'taken_at' => now(),
'taken_by_name' => 'Petugas Logistik',
'recorded_by_user_id' => $admin->id,
]);
$this->actingAs($admin)
->post(route('admin.management.wheelchairs.transactions.store', $allocation), [
'transaction_type' => 'returned',
'quantity' => 2,
'return_condition' => 'baik',
])
->assertSessionHasErrors('quantity');
}
public function test_allocation_cannot_be_reduced_below_outstanding_quantity(): void
{
$this->seed(DatabaseSeeder::class);
$admin = User::query()->where('email', 'admin@prn.local')->firstOrFail();
$allocation = WheelchairAllocation::query()->firstOrFail();
$allocation->update(['allocated_quantity' => 3]);
WheelchairTransaction::query()->create([
'wheelchair_allocation_id' => $allocation->id,
'transaction_type' => 'taken',
'quantity' => 2,
'taken_at' => now(),
'taken_by_name' => 'Petugas Logistik',
'recorded_by_user_id' => $admin->id,
]);
$this->actingAs($admin)
->patch(route('admin.management.wheelchairs.update', $allocation), [
'election_id' => $allocation->election_id,
'pusat_mengundi_id' => $allocation->pusat_mengundi_id,
'allocated_quantity' => 1,
])
->assertSessionHasErrors('allocated_quantity');
}
public function test_admin_kewangan_cannot_manage_wheelchairs(): void
{
$this->seed(DatabaseSeeder::class);
$finance = User::query()->where('email', 'kewangan@prn.local')->firstOrFail();
$this->actingAs($finance)
->get(route('admin.management.wheelchairs.index'))
->assertForbidden();
}
}