Files
D1041231009-WebGIS-PovertyMap/tests/Feature/AdminAdvancedTest.php
T
2026-06-04 14:29:17 +07:00

157 lines
6.1 KiB
PHP

<?php
namespace Tests\Feature;
use App\Models\ActivityLog;
use App\Models\RumahIbadah;
use App\Models\RumahMiskin;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Http\UploadedFile;
use Tests\TestCase;
class AdminAdvancedTest 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;
}
// ── 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');
}
}