e457bbb09c
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
157 lines
6.1 KiB
PHP
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');
|
|
}
|
|
}
|