$role, 'guard_name' => 'web']); } } private function createUser(string $role): User { $user = User::factory()->create(); $user->assignRole($role); return $user; } // ── ACTIVITY LOG ───────────────────────────────────────────── public function test_creating_ibadah_writes_activity_log(): void { $admin = $this->createUser('administrator'); $this->actingAs($admin); $this->postJson('/api/ibadah', ['nama' => 'Masjid Log', 'latitude' => -7, 'longitude' => 110])->assertOk(); $this->assertDatabaseHas('activity_logs', ['action' => 'create', 'subject_type' => 'ibadah', 'user_id' => $admin->id]); } public function test_admin_can_list_logs(): void { $admin = $this->createUser('administrator'); $this->actingAs($admin); ActivityLog::record('login', 'Test masuk'); $this->getJson('/api/admin/logs')->assertOk()->assertJsonFragment(['description' => 'Test masuk']); } public function test_non_admin_cannot_list_logs(): void { $this->actingAs($this->createUser('petugas_pendataan')); $this->getJson('/api/admin/logs')->assertStatus(403); } public function test_log_page_accessible_by_admin_only(): void { $this->actingAs($this->createUser('administrator')); $this->get('/admin/logs')->assertOk(); $this->actingAs($this->createUser('pengurus_ibadah')); $this->get('/admin/logs')->assertStatus(403); } // ── BULK DELETE ────────────────────────────────────────────── public function test_admin_can_bulk_delete_ibadah(): void { $admin = $this->createUser('administrator'); $this->actingAs($admin); $a = RumahIbadah::create(['user_id' => $admin->id, 'nama' => 'A', 'latitude' => -7, 'longitude' => 110, 'radius' => 500]); $b = RumahIbadah::create(['user_id' => $admin->id, 'nama' => 'B', 'latitude' => -7, 'longitude' => 110, 'radius' => 500]); $this->postJson('/api/admin/ibadah/bulk-delete', ['ids' => [$a->id, $b->id]]) ->assertOk()->assertJsonFragment(['deleted' => 2]); $this->assertDatabaseCount('rumah_ibadah', 0); } public function test_admin_can_bulk_delete_miskin(): void { $this->actingAs($this->createUser('administrator')); RumahMiskin::create(['id_rumah' => 'RM1', 'latitude' => -7, 'longitude' => 110, 'jumlah_kk' => 1, 'jumlah_orang' => 1]); RumahMiskin::create(['id_rumah' => 'RM2', 'latitude' => -7, 'longitude' => 110, 'jumlah_kk' => 1, 'jumlah_orang' => 1]); $this->postJson('/api/admin/miskin/bulk-delete', ['ids' => ['RM1', 'RM2']]) ->assertOk()->assertJsonFragment(['deleted' => 2]); $this->assertDatabaseCount('rumah_miskin', 0); } public function test_non_admin_cannot_bulk_delete(): void { $this->actingAs($this->createUser('petugas_pendataan')); $this->postJson('/api/admin/miskin/bulk-delete', ['ids' => ['RM1']])->assertStatus(403); } // ── CSV IMPORT ─────────────────────────────────────────────── public function test_admin_can_import_miskin_csv(): void { $this->actingAs($this->createUser('administrator')); $csv = "ID Rumah,Nama KK,Alamat,KK,Jiwa,Pekerjaan,Pendapatan,Kondisi,Lat,Lon\n" . "IMP1,Budi,Jl Test,2,5,Buruh,1000000,buruk,-7.0,110.0\n"; $file = UploadedFile::fake()->createWithContent('miskin.csv', $csv); $this->post('/api/admin/import/miskin', ['file' => $file]) ->assertOk()->assertJsonFragment(['imported' => 1, 'failed' => 0]); $this->assertDatabaseHas('rumah_miskin', ['id_rumah' => 'IMP1', 'nama_kk' => 'Budi']); } public function test_admin_can_import_ibadah_csv(): void { $this->actingAs($this->createUser('administrator')); $csv = "ID,Nama,Jenis,Alamat,Radius,Jemaah,Pengurus,Telepon,Lat,Lon\n" . "1,Masjid Import,masjid,Jl Test,600,100,Pak Imam,0812,-7.0,110.0\n"; $file = UploadedFile::fake()->createWithContent('ibadah.csv', $csv); $this->post('/api/admin/import/ibadah', ['file' => $file]) ->assertOk()->assertJsonFragment(['imported' => 1, 'failed' => 0]); $this->assertDatabaseHas('rumah_ibadah', ['nama' => 'Masjid Import', 'radius' => 600]); } public function test_non_admin_cannot_import(): void { $this->actingAs($this->createUser('petugas_pendataan')); $file = UploadedFile::fake()->createWithContent('x.csv', "a\n"); $this->post('/api/admin/import/miskin', ['file' => $file])->assertStatus(403); } // ── BACKUP ─────────────────────────────────────────────────── public function test_unauthenticated_cannot_backup(): void { $this->get('/api/admin/backup')->assertRedirect('/login'); } public function test_non_admin_cannot_backup(): void { $this->actingAs($this->createUser('pengurus_ibadah')); $this->get('/api/admin/backup')->assertStatus(403); } public function test_admin_can_download_backup(): void { $this->actingAs($this->createUser('administrator')); $response = $this->get('/api/admin/backup'); $response->assertOk(); $response->assertHeader('content-type', 'application/sql'); } }