Analisis Code Coverage Ignores
Dokumen ini mencatat semua bagian kode yang saat ini diabaikan (@codeCoverageIgnore) dari perhitungan coverage beserta alasannya dan rencana tindak lanjut.
Daftar Bagian yang Di-ignore
1. app/Providers/AppServiceProvider.php (Method boot)
- Status: Di-ignore (Start-End)
- Alasan: Berisi konfigurasi global framework seperti Vite prefetching, pemaksaan HTTPS, dan konfigurasi Rate Limiter. Bagian ini sulit dites secara unit karena efeknya bersifat global pada level infrastruktur/middleware framework.
- Rencana Analisis: Cek apakah konfigurasi HTTPS dan Rate Limiter bisa dites menggunakan Feature Test yang memicu kondisi tersebut (misal: hit API berkali-kali).
2. app/Query/CuratorMediaScope.php
- Status: Seluruh Class / Bagian Logika
- Alasan: Logika scope ini sangat bergantung pada status autentikasi yang kompleks dan kombinasi permission. Saat ini sudah dites secara tidak langsung melalui Integration Tests pada resource yang menggunakan media.
- Rencana Analisis: Buat Dedicated Unit Test untuk Scope ini dengan melakukan mocking pada
Auth::user()dan berbagai kombinasi permission-nya agar tidak perlu lagi di-ignore.
3. app/Notifications/Auth/RestoreAccountNotification.php (Method toMail)
- Status: Di-ignore (Start-End)
- Alasan: Isi body email (MailMessage) biasanya hanya berupa teks statis dan URL. Verifikasi pengiriman email umumnya dilakukan di Integration Test menggunakan
Notification::fake(). - Rencana Analisis: Sebenarnya aman untuk tetap di-ignore jika kita sudah mengetes bahwa notifikasi tersebut terkirim (
assertSentTo). Namun, bisa dites dengan memanggiltoMail()secara manual dan menguji isi propertinya.
4. app/Policies/CuratorMediaPolicy.php (Method: restore, forceDelete, dll)
- Status: Di-ignore per Method
- Alasan: Method-method ini seringkali hanya memanggil
$user->can()atau mengecek kepemilikan sederhana. Saat ini di-ignore karena fungsionalitasnya sudah tercakup dalam test resource Filament. - Rencana Analisis: Tambahkan Policy Unit Test spesifik untuk model
CuratorMediaguna mencakup semua case (Admin vs Owner vs Other).
5. app/Models/CuratorMedia.php (Method booted - events)
- Status: Di-ignore pada closure
creating - Alasan: Mengatur default UUID, kepemilikan (
created_by), dan privacy jika kosong. Di-ignore karena dianggap logika boilerplate yang selalu berjalan saat integrasi. - Rencana Analisis: Hapus ignore dan buat test sederhana yang membuat model
CuratorMediatanpa atribut tersebut, lalu pastikan atributnya terisi secara otomatis.
6. app/Models/User.php (Avatar & Booted Events)
- Status: Di-ignore (Avatar URL & logic deletion)
- Alasan:
getFilamentAvatarUrlbergantung pada ekosistem Filament. LogikaforceDeletinguntuk anonimisasi user dianggap berisiko tinggi dan sulit dipicu secara konsisten dalam unit test tanpa setup database yang lengkap. - Rencana Analisis: Hapus ignore pada
anonymize()dan buat test yang memastikan data user berubah menjadi anonim setelah dihapus.
7. app/Models/CuratorMediaUsage.php
- Status: Seluruh Class
- Alasan: Model pivot sederhana yang hanya mendefinisikan relasi.
- Rencana Analisis: Tetap biarkan di-ignore atau hapus ignore karena pengetesan relasi biasanya sudah tercakup saat mengetes fitur yang menggunakan media.
8. app/Filament/Pages/Auth/EditProfile.php
- Status: Di-ignore (Start-End)
- Alasan: Berisi logika kustom untuk profile page Filament, termasuk deteksi browser/OS untuk session management. Sangat bergantung pada state browser asli.
- Rencana Analisis: Cek apakah logika deteksi OS/Browser bisa dipisah ke Action/Helper tersendiri agar bisa dites secara unit.
9. app/Filament/Forms/Components/CuratorFileUpload.php
- Status: Seluruh Class (kecuali deklarasi utama)
- Alasan: Sebagai sebuah custom form component buatan sendiri yang meluas (extends) dari kelas
FileUploadbawaan Filament, kelas ini bergantung penuh eksistensinya kepada fitur-fitur Livewire (DOM Hydration/Dehydration). Menangani mocking untuk komponen frontend-heavy seperti ini di Pest/PHPUnit sangat sulit dan sering menghasilkan error yang rapuh (fragile). - Rencana Analisis: Disarankan untuk tidak menghapus ignore dari sini unless di-test melalui E2E seperti Laravel Dusk.
10. app/Filament/Pages/Auth/Login.php dan RestoreAccount.php
- Status: Di-ignore pada bagian eksepsi
TooManyRequestsExceptiondan signature fallback gagal. - Alasan: Mekanisme exception rate-limiter dari package ketiga serta penanganan invalid signature yang bersifat defensive checking secara programatik susah distimulasi tanpa membuat testing environment menjadi tidak masuk akal lambat/kompleks.
- Rencana Analisis: Tetap biarkan di-ignore, ini merupakan boilerplate UI yang sangat bergantung pada environment session & signature handling.
11. app/Models/User.php
- Status: Di-ignore untuk kumpulan helper boolean (
isAnonymous,isSoftDeleted,isDeletedBySelf, dll) dan method policy internal model (canAccessPanel). - Alasan: Fungsi helper ini isinya satu baris saja dan dites langsung secara terintegrasi bersama fitur
DeleteUserAccountActiondll. Murni pemecahan kode supaya rapi, bukan logika komputasi rumit. - Rencana Analisis: Tidak ada plan, dibiarkan saja tertulis ignore.
12. app/Actions/Profile/RevokeDeviceAction.php
- Status: Di-ignore pada penentuan label fallback
Unknown Devicejika browser tidak terdeteksi, serta parse datelast_used_at. - Alasan: Sulit sekali menghapus header HTTP user-agent hingga kosong pada setup Pest untuk trigger
Unknown Device, begitupun dengan memaksa token tidak memiliki history timestamp bawaan Sanctum. - Rencana Analisis: Karena hanya string fallback defensif, ignore ini dipertahankan selamanya.
13. app/Policies/CuratorMediaPolicy.php
- Status: Di-ignore untuk beberapa method (
create,update,delete, dll). - Alasan: Kebanyakan method isinya hanya melempar kembali mengecek role atau mengecek kepemilikan. Policy test khusus dapat menghabiskan waktu tanpa nilai test yang berarti. Fitur di test langsung dalam integrasi
Curator. - Rencana Analisis: Rencanakan
CuratorMediaPolicyTestsendiri bila policy berkembang melebihi 1 baris.
Kesimpulan & Tindakan Mendatang
Sebagian besar ignore dilakukan karena ketergantungan pada state global atau framework (Filament/Auth). Strategi utama untuk menghapus ignore ini adalah dengan:
- Mocking State: Menggunakan
Auth::actingAs()dan mockingGatelebih dalam. - Isolation: Memindahkan logika kompleks dari Model/Policy ke Action Classes yang lebih mudah dites.
- Dedicated Testing: Membuat test file khusus untuk Policy dan Scope yang selama ini hanya dites lewat Feature Test.