Files
D1041231009-WebGIS-PovertyMap/tests/Feature/EditFormTest.php
T
GuavaPopper 2e2b42f96b feat: Plan 2 — Form Edit Rumah Ibadah & Keluarga Miskin + Ownership
- Add user_id FK (nullable) to rumah_ibadah for ownership tracking
- IbadahController: set user_id on store; enforce ownership on update/destroy
- Add edit modals to map and data views (ibadah + miskin)
- Popup and table row Edit buttons with per-record ownership check
- 7 new tests covering ownership and full-field updates
- Fix ExampleTest for auth-protected routes
- Fix UserFactory missing email_verified_at column
- Mark Plan 2 complete in missing_features.md; update README

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-02 20:29:36 +07:00

145 lines
4.5 KiB
PHP

<?php
namespace Tests\Feature;
use App\Models\RumahIbadah;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class EditFormTest extends TestCase
{
use RefreshDatabase;
protected function setUp(): void
{
parent::setUp();
foreach (['administrator', 'pengurus_ibadah', 'petugas_pendataan', 'pemangku_kebijakan'] as $role) {
\Spatie\Permission\Models\Role::create(['name' => $role, 'guard_name' => 'web']);
}
}
private function createUser(string $role): User
{
$user = User::factory()->create();
$user->assignRole($role);
return $user;
}
private function createIbadah(?int $userId = null): RumahIbadah
{
return RumahIbadah::create([
'user_id' => $userId,
'nama' => 'Test Masjid',
'jenis' => 'masjid',
'latitude' => -7.0,
'longitude' => 110.0,
'radius' => 500,
]);
}
public function test_ibadah_store_sets_user_id(): void
{
$pengurus = $this->createUser('pengurus_ibadah');
$this->actingAs($pengurus);
$this->postJson('/api/ibadah', [
'nama' => 'Masjid Baru',
'latitude' => -7.0,
'longitude' => 110.0,
])->assertOk()->assertJsonFragment(['user_id' => $pengurus->id]);
}
public function test_pengurus_can_update_own_ibadah(): void
{
$pengurus = $this->createUser('pengurus_ibadah');
$ibadah = $this->createIbadah($pengurus->id);
$this->actingAs($pengurus);
$this->putJson("/api/ibadah/{$ibadah->id}", [
'nama' => 'Masjid Diperbarui',
'latitude' => -7.0,
'longitude' => 110.0,
'radius' => 500,
])->assertOk()->assertJsonFragment(['nama' => 'Masjid Diperbarui']);
}
public function test_pengurus_cannot_update_others_ibadah(): void
{
$pengurus = $this->createUser('pengurus_ibadah');
$admin = $this->createUser('administrator');
$ibadah = $this->createIbadah($admin->id);
$this->actingAs($pengurus);
$this->putJson("/api/ibadah/{$ibadah->id}", [
'nama' => 'Coba Edit',
'latitude' => -7.0,
'longitude' => 110.0,
'radius' => 500,
])->assertStatus(403);
}
public function test_administrator_can_update_any_ibadah(): void
{
$admin = $this->createUser('administrator');
$pengurus = $this->createUser('pengurus_ibadah');
$ibadah = $this->createIbadah($pengurus->id);
$this->actingAs($admin);
$this->putJson("/api/ibadah/{$ibadah->id}", [
'nama' => 'Edit oleh Admin',
'latitude' => -7.0,
'longitude' => 110.0,
'radius' => 500,
])->assertOk()->assertJsonFragment(['nama' => 'Edit oleh Admin']);
}
public function test_pengurus_cannot_delete_others_ibadah(): void
{
$pengurus = $this->createUser('pengurus_ibadah');
$admin = $this->createUser('administrator');
$ibadah = $this->createIbadah($admin->id);
$this->actingAs($pengurus);
$this->deleteJson("/api/ibadah/{$ibadah->id}")->assertStatus(403);
}
public function test_pengurus_can_delete_own_ibadah(): void
{
$pengurus = $this->createUser('pengurus_ibadah');
$ibadah = $this->createIbadah($pengurus->id);
$this->actingAs($pengurus);
$this->deleteJson("/api/ibadah/{$ibadah->id}")->assertOk();
$this->assertNull(RumahIbadah::find($ibadah->id));
}
public function test_petugas_can_update_all_miskin_fields(): void
{
$petugas = $this->createUser('petugas_pendataan');
$this->actingAs($petugas);
$this->postJson('/api/miskin', [
'id_rumah' => 'TESTID001',
'nama_kk' => 'Budi Santoso',
'latitude' => -7.0,
'longitude' => 110.0,
'jumlah_kk' => 1,
'jumlah_orang' => 4,
])->assertOk();
$this->putJson('/api/miskin/TESTID001', [
'nama_kk' => 'Budi Diperbarui',
'latitude' => -7.0,
'longitude' => 110.0,
'jumlah_kk' => 2,
'jumlah_orang' => 6,
'pekerjaan' => 'Buruh',
'pendapatan' => 1500000,
'kondisi_rumah' => 'buruk',
'keterangan' => 'Catatan baru',
])->assertOk()->assertJsonFragment(['nama_kk' => 'Budi Diperbarui']);
}
}