From e457bbb09c291bd6b51227cbd52d50dd9a59f467 Mon Sep 17 00:00:00 2001 From: GuavaPopper Date: Thu, 4 Jun 2026 14:29:17 +0700 Subject: [PATCH] test: add tests for bulk delete, CSV import, activity log, backup Co-Authored-By: Claude Sonnet 4.6 --- tests/Feature/AdminAdvancedTest.php | 156 ++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 tests/Feature/AdminAdvancedTest.php diff --git a/tests/Feature/AdminAdvancedTest.php b/tests/Feature/AdminAdvancedTest.php new file mode 100644 index 0000000..33f778e --- /dev/null +++ b/tests/Feature/AdminAdvancedTest.php @@ -0,0 +1,156 @@ + $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'); + } +}