Files
services_core/tests/Feature/WilayahApiTest.php
T
2026-07-27 16:24:09 +07:00

107 lines
3.6 KiB
PHP

<?php
namespace Tests\Feature;
use App\Enums\UserAccessLevel;
use App\Models\User;
use App\Models\WilayahDesa;
use App\Models\WilayahKabupaten;
use App\Models\WilayahKecamatan;
use App\Models\WilayahProvinsi;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class WilayahApiTest extends TestCase
{
use RefreshDatabase;
public function test_master_admin_can_create_hierarchical_regions_and_get_full_address(): void
{
$user = User::factory()->create([
'is_master' => true,
'access_level' => UserAccessLevel::MASTER_ADMIN,
]);
$provinsiId = $this->actingAs($user)
->postJson('/api/wilayah/provinsi', ['kode' => '11', 'nama' => 'Aceh'])
->assertCreated()
->json('data.id');
$kabupatenId = $this->postJson('/api/wilayah/kabupaten', [
'kode' => '11.01',
'nama' => 'Kabupaten Simeulue',
'provinsi_id' => $provinsiId,
])->assertCreated()->json('data.id');
$kecamatanId = $this->postJson('/api/wilayah/kecamatan', [
'kode' => '11.01.01',
'nama' => 'Teupah Selatan',
'kabupaten_id' => $kabupatenId,
])->assertCreated()->json('data.id');
$desaId = $this->postJson('/api/wilayah/desa', [
'kode' => '11.01.01.2001',
'nama' => 'Latiung',
'kecamatan_id' => $kecamatanId,
])->assertCreated()->json('data.id');
$this->getJson("/api/wilayah/alamat-lengkap?desa_id={$desaId}")
->assertOk()
->assertJsonPath('data.desa.nama', 'Latiung')
->assertJsonPath('data.kecamatan.nama', 'Teupah Selatan')
->assertJsonPath('data.kabupaten.nama', 'Kabupaten Simeulue')
->assertJsonPath('data.provinsi.nama', 'Aceh')
->assertJsonPath(
'data.alamat_wilayah',
'Desa/Kelurahan Latiung, Kecamatan Teupah Selatan, Kabupaten Simeulue, Provinsi Aceh'
);
}
public function test_child_region_requires_its_direct_parent(): void
{
$user = User::factory()->create([
'is_master' => true,
'access_level' => UserAccessLevel::MASTER_ADMIN,
]);
$this->actingAs($user)
->postJson('/api/wilayah/desa', [
'kode' => '01',
'nama' => 'Desa Tanpa Kecamatan',
])
->assertUnprocessable()
->assertJsonValidationErrors('kecamatan_id');
}
public function test_parent_with_children_cannot_be_deleted(): void
{
$user = User::factory()->create([
'is_master' => true,
'access_level' => UserAccessLevel::MASTER_ADMIN,
]);
$provinsi = WilayahProvinsi::create(['kode' => '12', 'nama' => 'Sumatera Utara']);
$kabupaten = WilayahKabupaten::create([
'provinsi_id' => $provinsi->id,
'kode' => '12.01',
'nama' => 'Tapanuli Tengah',
]);
$kecamatan = WilayahKecamatan::create([
'kabupaten_id' => $kabupaten->id,
'kode' => '12.01.01',
'nama' => 'Barus',
]);
WilayahDesa::create([
'kecamatan_id' => $kecamatan->id,
'kode' => '12.01.01.2001',
'nama' => 'Kampung Mudik',
]);
$this->actingAs($user)
->deleteJson("/api/wilayah/provinsi/{$provinsi->id}")
->assertUnprocessable()
->assertJsonValidationErrors('wilayah');
$this->assertDatabaseHas('wilayah_provinsi', ['id' => $provinsi->id]);
}
}