Files

105 lines
3.4 KiB
PHP

<?php
namespace Tests\Feature;
use App\Models\Classes;
use App\Models\Setting;
use App\Models\Student;
use App\Models\User;
use App\Models\Violation;
use App\Models\ViolationType;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class ViolationReportTest extends TestCase
{
use RefreshDatabase;
protected function setUp(): void
{
parent::setUp();
// Role 'kepala_sekolah' punya permission violations-export (di-seed lewat migrasi)
$this->admin = User::factory()->create(['roles' => ['kepala_sekolah']]);
}
protected function seedData(): void
{
Setting::setValue('school_name', 'SMKN 1 WONOREJO');
Setting::setValue('school_address', 'Jl. Pesantren');
Setting::setValue('school_phone', '(0343) 410064');
Setting::setValue('kepala_sekolah_name', 'Dr. H. Ahmad Sobirin');
Setting::setValue('kepala_sekolah_nip', '197606042008011014');
$class = Classes::create(['name' => 'X-TKJ 1', 'level' => 'X']);
$student = Student::create([
'full_name' => 'Budi Santoso',
'nisn' => '1234567890',
'class_id' => $class->id,
'class_name' => 'X-TKJ 1',
]);
$category = \App\Models\ViolationCategory::create(['name' => 'Kedisiplinan', 'slug' => 'kedisiplinan']);
$type = ViolationType::create(['name' => 'Terlambat', 'slug' => 'terlambat', 'points' => 5, 'category_id' => $category->id]);
Violation::create([
'student_id' => $student->id,
'student_class' => 'X-TKJ 1',
'violation_type_id' => $type->id,
'violation_date' => '2026-07-20',
'points' => 5,
'recorded_by' => $this->admin->id,
]);
Violation::create([
'student_id' => $student->id,
'student_class' => 'X-TKJ 1',
'violation_type_id' => $type->id,
'violation_date' => '2026-07-21',
'points' => 5,
'recorded_by' => $this->admin->id,
]);
}
public function test_halaman_laporan_membutuhkan_permission(): void
{
$user = User::factory()->create();
$this->actingAs($user)->get('/reports/violations')->assertForbidden();
}
public function test_halaman_laporan_terbuka_untuk_yang_punya_permission(): void
{
$this->seedData();
$this->actingAs($this->admin)
->get('/reports/violations')
->assertOk()
->assertSee('Laporan Rekap Pelanggaran')
->assertSee('Cetak Laporan PDF');
}
public function test_pdf_laporan_valid(): void
{
$this->seedData();
$response = $this->actingAs($this->admin)
->get('/reports/violations/pdf?date_from=2026-07-01&date_to=2026-07-31');
$response->assertOk();
$response->assertHeader('content-type', 'application/pdf');
$content = $response->getContent();
$this->assertStringStartsWith('%PDF-', $content);
$this->assertGreaterThan(1000, strlen($content)); // PDF terisi, bukan kosong
}
public function test_pdf_laporan_dengan_filter_kelas(): void
{
$this->seedData();
$class = Classes::first();
$this->actingAs($this->admin)
->get("/reports/violations/pdf?class_id={$class->id}")
->assertOk()
->assertHeader('content-type', 'application/pdf');
}
}