TIF_Nganjuk_E41220879/tests/Unit/ResepModelTest.php

233 lines
8.2 KiB
PHP

<?php
namespace Tests\Unit;
use App\Models\Resep;
use App\Models\User;
use Tests\DatabaseTestCase;
class ResepModelTest extends DatabaseTestCase
{
// ─────────────────────────────────────────
// getStatusColorAttribute()
// ─────────────────────────────────────────
public function test_status_color_is_terkirim_when_status_selesai(): void
{
$resep = new Resep(['status' => 'selesai']);
$this->assertEquals('terkirim', $resep->status_color);
}
public function test_status_color_is_proses_when_status_proses(): void
{
$resep = new Resep(['status' => 'proses']);
$this->assertEquals('proses', $resep->status_color);
}
public function test_status_color_is_dibatalkan_when_status_dibatalkan(): void
{
$resep = new Resep(['status' => 'dibatalkan']);
$this->assertEquals('dibatalkan', $resep->status_color);
}
public function test_status_color_defaults_to_proses_for_unknown_status(): void
{
$resep = new Resep(['status' => 'unknown']);
$this->assertEquals('proses', $resep->status_color);
}
// ─────────────────────────────────────────
// generateNoResep() - requires DB
// ─────────────────────────────────────────
public function test_generate_no_resep_starts_with_rsp_prefix(): void
{
$noResep = Resep::generateNoResep();
$this->assertStringStartsWith('RSP-', $noResep);
}
public function test_generate_no_resep_contains_today_date(): void
{
$today = now()->format('Ymd');
$noResep = Resep::generateNoResep();
$this->assertStringContainsString($today, $noResep);
}
public function test_generate_no_resep_starts_at_0001_when_no_resep_today(): void
{
// Tidak ada resep hari ini
$today = now()->format('Ymd');
$noResep = Resep::generateNoResep();
$this->assertEquals("RSP-{$today}-0001", $noResep);
}
public function test_generate_no_resep_increments_when_resep_exists_today(): void
{
$user = User::factory()->create();
// Buat resep pertama hari ini
Resep::create([
'no_resep' => Resep::generateNoResep(),
'user_id' => $user->id,
'nama_pasien' => 'Pasien A',
'tanggal_resep' => now()->toDateString(),
'diagnosa' => 'Flu',
'status' => 'proses',
'nama_dokter' => 'Dokter A',
'jenis_penjamin' => 'umum',
'jenis_layanan' => 'BP',
'jenis_kelamin' => 'L',
'umur_pasien' => 30,
'berat_badan' => 60,
'is_read' => false,
]);
$today = now()->format('Ymd');
$noResep = Resep::generateNoResep();
$this->assertEquals("RSP-{$today}-0002", $noResep);
}
// ─────────────────────────────────────────
// scopeUnread()
// ─────────────────────────────────────────
public function test_scope_unread_only_returns_unread_reseps(): void
{
$user = User::factory()->create();
Resep::create([
'no_resep' => 'RSP-TEST-0001',
'user_id' => $user->id,
'nama_pasien' => 'Pasien Unread',
'tanggal_resep' => now()->toDateString(),
'diagnosa' => 'Flu',
'status' => 'proses',
'nama_dokter' => 'Dokter A',
'jenis_penjamin' => 'umum',
'jenis_layanan' => 'BP',
'jenis_kelamin' => 'L',
'umur_pasien' => 25,
'berat_badan' => 55,
'is_read' => false,
]);
Resep::create([
'no_resep' => 'RSP-TEST-0002',
'user_id' => $user->id,
'nama_pasien' => 'Pasien Read',
'tanggal_resep' => now()->toDateString(),
'diagnosa' => 'Batuk',
'status' => 'proses',
'nama_dokter' => 'Dokter B',
'jenis_penjamin' => 'umum',
'jenis_layanan' => 'BP',
'jenis_kelamin' => 'P',
'umur_pasien' => 30,
'berat_badan' => 50,
'is_read' => true,
]);
$unread = Resep::unread()->get();
$this->assertCount(1, $unread);
$this->assertEquals('Pasien Unread', $unread->first()->nama_pasien);
}
// ─────────────────────────────────────────
// markAsRead()
// ─────────────────────────────────────────
public function test_mark_as_read_sets_is_read_to_true(): void
{
$user = User::factory()->create();
$resep = Resep::create([
'no_resep' => 'RSP-TEST-0010',
'user_id' => $user->id,
'nama_pasien' => 'Pasien Test',
'tanggal_resep' => now()->toDateString(),
'diagnosa' => 'Flu',
'status' => 'proses',
'nama_dokter' => 'Dokter X',
'jenis_penjamin' => 'umum',
'jenis_layanan' => 'BP',
'jenis_kelamin' => 'L',
'umur_pasien' => 25,
'berat_badan' => 60,
'is_read' => false,
]);
$resep->markAsRead();
$resep->refresh();
$this->assertTrue($resep->is_read);
}
public function test_mark_as_read_does_not_re_update_if_already_read(): void
{
$user = User::factory()->create();
$resep = Resep::create([
'no_resep' => 'RSP-TEST-0011',
'user_id' => $user->id,
'nama_pasien' => 'Pasien Read',
'tanggal_resep' => now()->toDateString(),
'diagnosa' => 'Flu',
'status' => 'proses',
'nama_dokter' => 'Dokter Y',
'jenis_penjamin' => 'umum',
'jenis_layanan' => 'BP',
'jenis_kelamin' => 'P',
'umur_pasien' => 20,
'berat_badan' => 45,
'is_read' => true,
]);
// Panggil markAsRead() ketika sudah true — tidak boleh error
$resep->markAsRead();
$resep->refresh();
$this->assertTrue($resep->is_read);
}
// ─────────────────────────────────────────
// Relationships
// ─────────────────────────────────────────
public function test_resep_belongs_to_user(): void
{
$resep = new Resep();
$this->assertInstanceOf(
\Illuminate\Database\Eloquent\Relations\BelongsTo::class,
$resep->user()
);
}
public function test_resep_has_many_items(): void
{
$resep = new Resep();
$this->assertInstanceOf(
\Illuminate\Database\Eloquent\Relations\HasMany::class,
$resep->items()
);
}
// ─────────────────────────────────────────
// Fillable & Casts
// ─────────────────────────────────────────
public function test_resep_is_read_is_cast_as_boolean(): void
{
$resep = new Resep();
$casts = $resep->getCasts();
$this->assertEquals('boolean', $casts['is_read']);
}
public function test_resep_tanggal_resep_is_cast_as_date(): void
{
$resep = new Resep();
$casts = $resep->getCasts();
$this->assertEquals('date', $casts['tanggal_resep']);
}
}