2e2b42f96b
- 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>
145 lines
4.5 KiB
PHP
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']);
|
|
}
|
|
}
|