TIF_Nganjuk_E41220879/tests/Feature/ObatMasukTest.php

291 lines
12 KiB
PHP

<?php
namespace Tests\Feature;
use App\Models\Kategori;
use App\Models\ObatMasuk;
use App\Models\Satuan;
use App\Models\Supplier;
use App\Models\User;
use Tests\DatabaseTestCase;
class ObatMasukTest extends DatabaseTestCase
{
private User $user;
protected function setUp(): void
{
parent::setUp();
$this->user = User::factory()->create(['role' => 'apoteker']);
$this->actingAs($this->user);
}
private function createKategori(): Kategori
{
return Kategori::create(['nama' => 'Antibiotik']);
}
private function createSatuan(): Satuan
{
return Satuan::create(['nama' => 'Tablet']);
}
private function validData(array $overrides = []): array
{
$kategori = Kategori::firstOrCreate(['nama' => 'Antibiotik']);
$satuan = Satuan::firstOrCreate(['nama' => 'Tablet']);
return array_merge([
'nama_obat' => 'Amoxicillin',
'kategori_id' => $kategori->id,
'satuan_id' => $satuan->id,
'kode_batch' => 'BTH-001',
'stok' => 100,
'tanggal_penerimaan' => now()->toDateString(),
'tanggal_kadaluarsa' => now()->addYear()->toDateString(),
], $overrides);
}
// ─────────────────────────────────────────
// index
// ─────────────────────────────────────────
public function test_index_returns_200(): void
{
$response = $this->get(route('obat-masuk.index'));
$response->assertStatus(200);
}
public function test_index_guest_redirects_to_login(): void
{
auth()->logout();
$response = $this->get(route('obat-masuk.index'));
$response->assertRedirect(route('login'));
}
public function test_index_search_by_nama_obat(): void
{
$kategori = $this->createKategori();
$satuan = $this->createSatuan();
ObatMasuk::create([
'nama_obat' => 'Amoxicillin',
'kategori_id' => $kategori->id,
'satuan_id' => $satuan->id,
'kode_batch' => 'BTH-001',
'stok' => 100,
'tanggal_penerimaan' => now()->toDateString(),
'tanggal_kadaluarsa' => now()->addYear()->toDateString(),
'user_id' => $this->user->id,
]);
ObatMasuk::create([
'nama_obat' => 'Paracetamol',
'kategori_id' => $kategori->id,
'satuan_id' => $satuan->id,
'kode_batch' => 'BTH-002',
'stok' => 50,
'tanggal_penerimaan' => now()->toDateString(),
'tanggal_kadaluarsa' => now()->addYear()->toDateString(),
'user_id' => $this->user->id,
]);
$response = $this->get(route('obat-masuk.index', ['search' => 'Amoxicillin']));
$data = $response->viewData('obatMasuks');
$names = $data->pluck('nama_obat')->toArray();
$this->assertContains('Amoxicillin', $names);
$this->assertNotContains('Paracetamol', $names);
}
public function test_index_filter_by_status_tersedia(): void
{
$kategori = $this->createKategori();
$satuan = $this->createSatuan();
ObatMasuk::create([
'nama_obat' => 'ObatA', 'kategori_id' => $kategori->id,
'satuan_id' => $satuan->id, 'kode_batch' => 'B1', 'stok' => 10,
'tanggal_penerimaan' => now()->toDateString(),
'tanggal_kadaluarsa' => now()->addYear()->toDateString(),
'user_id' => $this->user->id,
]);
ObatMasuk::create([
'nama_obat' => 'ObatB', 'kategori_id' => $kategori->id,
'satuan_id' => $satuan->id, 'kode_batch' => 'B2', 'stok' => 0,
'tanggal_penerimaan' => now()->toDateString(),
'tanggal_kadaluarsa' => now()->addYear()->toDateString(),
'user_id' => $this->user->id,
]);
$response = $this->get(route('obat-masuk.index', ['status' => 'tersedia']));
$data = $response->viewData('obatMasuks');
$names = $data->pluck('nama_obat')->toArray();
$this->assertContains('ObatA', $names);
$this->assertNotContains('ObatB', $names);
}
public function test_index_filter_by_status_habis(): void
{
$kategori = $this->createKategori();
$satuan = $this->createSatuan();
ObatMasuk::create([
'nama_obat' => 'ObatA', 'kategori_id' => $kategori->id,
'satuan_id' => $satuan->id, 'kode_batch' => 'B1', 'stok' => 10,
'tanggal_penerimaan' => now()->toDateString(),
'tanggal_kadaluarsa' => now()->addYear()->toDateString(),
'user_id' => $this->user->id,
]);
ObatMasuk::create([
'nama_obat' => 'ObatHabis', 'kategori_id' => $kategori->id,
'satuan_id' => $satuan->id, 'kode_batch' => 'B2', 'stok' => 0,
'tanggal_penerimaan' => now()->toDateString(),
'tanggal_kadaluarsa' => now()->addYear()->toDateString(),
'user_id' => $this->user->id,
]);
$response = $this->get(route('obat-masuk.index', ['status' => 'habis']));
$data = $response->viewData('obatMasuks');
$names = $data->pluck('nama_obat')->toArray();
$this->assertContains('ObatHabis', $names);
$this->assertNotContains('ObatA', $names);
}
// ─────────────────────────────────────────
// store
// ─────────────────────────────────────────
public function test_store_creates_obat_masuk_with_valid_data(): void
{
$response = $this->post(route('obat-masuk.store'), $this->validData());
$response->assertRedirect(route('obat-masuk.index'));
$response->assertSessionHas('success');
$this->assertDatabaseHas('obat_masuks', ['nama_obat' => 'Amoxicillin', 'stok' => 100]);
}
public function test_store_fails_without_required_fields(): void
{
$response = $this->post(route('obat-masuk.store'), []);
$response->assertSessionHasErrors(['nama_obat', 'kode_batch', 'stok', 'tanggal_penerimaan', 'tanggal_kadaluarsa']);
}
public function test_store_fails_when_kadaluarsa_before_penerimaan(): void
{
$response = $this->post(route('obat-masuk.store'), $this->validData([
'tanggal_penerimaan' => now()->toDateString(),
'tanggal_kadaluarsa' => now()->subDay()->toDateString(), // sebelum penerimaan
]));
$response->assertSessionHasErrors('tanggal_kadaluarsa');
}
public function test_store_fails_with_zero_stok(): void
{
$response = $this->post(route('obat-masuk.store'), $this->validData(['stok' => 0]));
$response->assertSessionHasErrors('stok');
}
public function test_store_sets_user_id_from_authenticated_user(): void
{
$this->post(route('obat-masuk.store'), $this->validData());
$this->assertDatabaseHas('obat_masuks', ['user_id' => $this->user->id]);
}
// ─────────────────────────────────────────
// show
// ─────────────────────────────────────────
public function test_show_returns_200(): void
{
$obat = ObatMasuk::create(array_merge($this->validData(), ['user_id' => $this->user->id]));
$response = $this->get(route('obat-masuk.show', $obat));
$response->assertStatus(200);
}
// ─────────────────────────────────────────
// update
// ─────────────────────────────────────────
public function test_update_modifies_obat_masuk(): void
{
$obat = ObatMasuk::create(array_merge($this->validData(), ['user_id' => $this->user->id]));
$response = $this->put(route('obat-masuk.update', $obat), $this->validData(['nama_obat' => 'Paracetamol', 'stok' => 50]));
$response->assertRedirect(route('obat-masuk.index'));
$this->assertDatabaseHas('obat_masuks', ['id' => $obat->id, 'nama_obat' => 'Paracetamol', 'stok' => 50]);
}
public function test_update_fails_without_required_fields(): void
{
$obat = ObatMasuk::create(array_merge($this->validData(), ['user_id' => $this->user->id]));
$response = $this->put(route('obat-masuk.update', $obat), []);
$response->assertSessionHasErrors(['nama_obat', 'kode_batch']);
}
// ─────────────────────────────────────────
// destroy
// ─────────────────────────────────────────
public function test_destroy_deletes_obat_masuk(): void
{
$obat = ObatMasuk::create(array_merge($this->validData(), ['user_id' => $this->user->id]));
$response = $this->delete(route('obat-masuk.destroy', $obat));
$response->assertRedirect(route('obat-masuk.index'));
$this->assertDatabaseMissing('obat_masuks', ['id' => $obat->id]);
}
// ─────────────────────────────────────────
// superadmin access
// ─────────────────────────────────────────
public function test_superadmin_can_access_index(): void
{
$superadmin = User::factory()->create(['role' => 'superadmin']);
$this->actingAs($superadmin);
$response = $this->get(route('obat-masuk.index'));
$response->assertStatus(200);
}
public function test_superadmin_can_access_show(): void
{
$superadmin = User::factory()->create(['role' => 'superadmin']);
$this->actingAs($superadmin);
$obat = ObatMasuk::create(array_merge($this->validData(), ['user_id' => $this->user->id]));
$response = $this->get(route('obat-masuk.show', $obat));
$response->assertStatus(200);
}
public function test_superadmin_can_access_create_store_edit_update_destroy(): void
{
$superadmin = User::factory()->create(['role' => 'superadmin']);
$this->actingAs($superadmin);
$obat = ObatMasuk::create(array_merge($this->validData(), ['user_id' => $this->user->id]));
$this->get(route('obat-masuk.create'))->assertStatus(200);
$storePayload = $this->validData([
'nama_obat' => 'Cefixime',
'kode_batch' => 'BTH-003',
]);
$this->post(route('obat-masuk.store'), $storePayload)->assertRedirect(route('obat-masuk.index'));
$this->assertDatabaseHas('obat_masuks', ['nama_obat' => 'Cefixime']);
$this->get(route('obat-masuk.edit', $obat))->assertStatus(200);
$updatePayload = $this->validData(['nama_obat' => 'Paracetamol Superadmin']);
$this->put(route('obat-masuk.update', $obat), $updatePayload)->assertRedirect(route('obat-masuk.index'));
$this->assertDatabaseHas('obat_masuks', ['id' => $obat->id, 'nama_obat' => 'Paracetamol Superadmin']);
$this->delete(route('obat-masuk.destroy', $obat))->assertRedirect(route('obat-masuk.index'));
$this->assertDatabaseMissing('obat_masuks', ['id' => $obat->id]);
}
}