[TASK-SIPT-UNIT-TEST-SONARQUBE] Inisiasi Infrastruktur Unit Test Vitest dan Integrasi Code Quality LCOV Coverage SonarQube pada SIPT Backend
Modul: SIPT/PAB | Tipe: Refactoring | Stage Saat Ini:
DEVELOPMENT| Tanggal Dokumen: 2026-09-15
DEVELOPMENT STAGE
Dokumen ini sedang berada dalam tahap DEVELOPMENT. Penambahan konfigurasi unit test Vitest, integrasi SonarQube LCOV coverage, dan test suite komprehensif masih aktif di lingkungan pengembangan (Development).
1. Informasi Tugas & Referensi Bisnis
Task ID / Nomor Referensi:
TASK-SIPT-UNIT-TEST-SONARQUBESumber Instruksi: Inisiatif Engineering Internal
Dokumen Referensi / Lampiran: Tidak ada
Task / Dependensi Terkait (Cross-Service): —
Modul Terkait:
SIPT/PABService / Repository:
sipt-backendPIC Pengembang: Hermansyah Efendi
Ringkasan Non-Teknis (Executive Summary): Repo
sipt-backendsebelumnya beroperasi tanpa kerangka kerja pengujian otomatis (automated test suite) dan tanpa penganalisis kualitas kode statis (static code analysis). Setiap perubahan logika program hanya dapat divalidasi secara manual, yang meningkatkan risiko terjadinya regresi bug saat kode dinaikkan ke staging atau produksi.Melalui pekerjaan ini:
- Dibangun fondasi unit test komprehensif menggunakan runner modern Vitest yang mencakup 119 file test (1.172 assertions) pada seluruh layer aplikasi (controller, middleware, model, helper, repository, validasi).
- Dihubungkan laporan coverage LCOV ke dashboard SonarQube LNSW dengan ambang batas (threshold) minimum 30% untuk menjaga standar kualitas kode berkelanjutan pada pipeline CI/CD.
- Dilakukan penyelarasan mock test pada mekanisme cooldown PAB pasca refaktorisasi TTL 60 detik.
Latar Belakang & Ringkasan Kebutuhan: Repo
sipt-backendsebelumnya tidak memiliki infrastruktur unit test dan alat analisis kualitas kode. Absennya test coverage menyebabkan perubahan logika tidak terverifikasi secara empiris sebelum deployment, meningkatkan risiko regresi bug di staging dan produksi. Pekerjaan ini membangun fondasi test suite komprehensif menggunakan Vitest, mengintegrasikan laporan coverage LCOV ke SonarQube untuk analisis code quality berkelanjutan, dan menetapkan threshold coverage minimum pada seluruh layer aplikasi.Ruang Lingkup & Rincian Sub-Pekerjaan (Technical Scope & Milestones):
- [x] Membuat
vitest.config.jsdengan konfigurasi coverage provider v8, reporter LCOV/HTML/text, include/exclude paths, dan threshold coverage awal - [x] Menambahkan konfigurasi
sonar-project.propertiesdengan mapping sources, tests, dan lcov.info - [x] Menulis 119 file unit test baru mencakup seluruh layer: controllers, middlewares, models, helpers, repositories, validations (14.457 baris kode test)
- [x] Menyesuaikan threshold coverage dari 95% ke 30% (baseline realistis untuk phase awal integrasi CI/CD)
- [x] Alignment test mocks submission_cooldown dan kemendag-axios-interceptor pasca cooldown refactor (TTL 60s dan penghapusan
releaseSubmissionLock) - [x] Penambahan
app/connection*.jsdanapp/db_conn*.jske coverage exclusions SonarQube
- [x] Membuat
2. Deployment Lifecycle
| # | Environment | Tanggal & Waktu | PIC | Status | Catatan |
|---|---|---|---|---|---|
| 1 | Development | 2026-08-12 09:50 | Hermansyah Efendi | DEPLOYED | Branch: development (Commit: eeb5d19 .. baa4b6c) |
| 2 | Staging (UAT) | — | — | PENDING | — |
| 3 | Production | — | — | PENDING | — |
Riwayat Update Log
| Tanggal | Environment | Perubahan | PIC |
|---|---|---|---|
| 2026-09-15 | Development | Inisialisasi technical audit log untuk infrastruktur unit test Vitest dan integrasi SonarQube coverage | Hermansyah Efendi |
3. Analisis Teknis & Rincian Perubahan
Alur Logika & Bisnis:
- Konfigurasi Vitest Runner (
vitest.config.js): Mendefinisikan test runner modern berbasis Node.js environment dengan include patterntests/**/*.test.js. Menggunakan coverage providerv8yang memanfaatkan native V8 AST instrumentation sehingga performa eksekusi jauh lebih cepat dibandingkan Istanbul/Babel. Menghasilkan artefak reportertext,lcov(coverage/lcov.info), danhtml. Mengatur path exclusion untuk file non-logika sepertiapp/public/**,app/schemas/**,app/routers/**,app/config/**,app/constants/**,app/connection*.js,app/db_conn*.js,app/seeder/**,app/raw-queries/**,app/tmp/**, danapp/uploads/**. Menetapkan ambang batas (thresholds) awal sebesar 30% pada metrik statements, branches, functions, dan lines sebagai Quality Gate awal pada CI/CD. - Integrasi Analisis Kualitas Kode SonarQube (
sonar-project.properties): Mengonfigurasi parameter scanner SonarQube dengan memetakansonar.projectKey=lnsw_sipt-backend_AYbpxwnIhtKTvbdPKUcd,sonar.sources=app,sonar.tests=tests, dansonar.javascript.lcov.reportPaths=coverage/lcov.info. File koneksi database diisolasi dari metrik coverage melaluisonar.coverage.exclusionskarena membutuhkan dependensi database aktif yang tidak relevan diuji pada level unit test terisolasi. - Penyelarasan Mock Test Cooldown & Interceptor (
01bae0c): Menyesuaikan suitetests/middlewares/submission_cooldown.test.jspasca pembaruan submission cooldown:- Mengubah assertion TTL Redis dari 300 detik menjadi 60 detik (
'EX', 60, 'NX'). - Menambahkan mock
res.end = vi.fn()untuk mengakomodasi monkey-patching pelepas kunci lock Redis. - Menghapus assertion
redisDelyang redundan padatests/helpers/kemendag-axios-interceptor.test.jspasca eliminasi fungsireleaseSubmissionLock.
- Mengubah assertion TTL Redis dari 300 detik menjadi 60 detik (
- Konfigurasi Vitest Runner (
Perubahan Database (DDL / DML):
sql-- Tidak ada perubahan skema database (DDL/DML) untuk task ini. -- Perubahan murni pada infrastruktur testing (Vitest), integrasi static analysis (SonarQube), dan mock alignment.Kontrak API & Response Payload: Tidak ada penambahan atau perubahan kontrak API. Perubahan murni pada infrastruktur testing dan tooling code quality.
4. Bukti Teknis (Technical Proof & Audit Trail)
- Repository:
sipt-backend - Branch Utama:
development - Merge Request / PR:
-
Daftar Commit Terkait (Multi-Commit Trail)
| Commit ID | Branch | Author | Tanggal & Jam | Ringkasan Perubahan |
|---|---|---|---|---|
eeb5d19 | development | Hermansyah Efendi | 2026-08-11 22:06 | test(coverage): add comprehensive unit test suite and SonarQube coverage integration |
83f42c4 | development | Hermansyah Efendi | 2026-08-11 22:07 | docs(changelog): update unreleased entries for unit test coverage and sonar setup |
01bae0c | development | Hermansyah Efendi | 2026-08-11 22:11 | test(cooldown): align submission cooldown TTL and interceptor mocks with development branch |
9f2d82e | development | Hermansyah Efendi | 2026-08-11 22:23 | test(controllers): increase unit test coverage across controller files |
f3576c8 | development | Hermansyah Efendi | 2026-08-11 22:23 | docs(changelog): update unreleased entries for controller unit test coverage |
baa4b6c | development | Hermansyah Efendi | 2026-08-12 09:50 | chore(sonar): add db connection files to coverage exclusions |
Cuplikan Kode / Implementasi Inti
// File: vitest.config.js
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
environment: 'node',
include: ['tests/**/*.test.js'],
coverage: {
provider: 'v8',
reporter: ['text', 'lcov', 'html'],
reportsDirectory: './coverage',
include: ['app/**/*.js'],
exclude: [
'app/public/**',
'app/schemas/**',
'app/routers/**',
'app/config/**',
'app/constants/**',
'app/connection*.js',
'app/db_conn*.js',
'app/seeder/**',
'app/raw-queries/**',
'app/tmp/**',
'app/uploads/**',
'node_modules/**',
],
thresholds: {
statements: 30,
branches: 30,
functions: 30,
lines: 30,
},
},
},
});# File: sonar-project.properties
sonar.projectKey=lnsw_sipt-backend_AYbpxwnIhtKTvbdPKUcd
sonar.sources=app
sonar.tests=tests
sonar.javascript.lcov.reportPaths=coverage/lcov.info
sonar.coverage.exclusions=app/public/**,app/schemas/**,app/routers/**,app/config/**,app/constants/**,app/connection*.js,app/db_conn*.js,app/seeder/**,app/raw-queries/**,app/tmp/**,app/uploads/**// File: tests/middlewares/submission_cooldown.test.js — alignment TTL 60s
it("allows submission when Redis SET NX returns 'OK'", async () => {
mockSet.mockResolvedValueOnce('OK');
res.end = vi.fn(); // mock res.end diperlukan untuk monkey-patching releaseLock
const middleware = submissionCooldown('receivePelaporan');
await middleware(req, res, next);
expect(mockSet).toHaveBeenCalledWith(
expect.stringContaining('cooldown:receivePelaporan:NL-001'),
expect.any(String),
'EX',
60, // sebelumnya: 300 (5 menit)
'NX'
);
expect(next).toHaveBeenCalled();
});5. Bukti Verifikasi Pengujian (QA / Unit Test / API Verification)
A. Verifikasi Unit Test (Development Stage)
- Test Suite Files:
tests/**/*.test.js(119 file unit test) - Status Eksekusi CLI:
PASSED (119 test files, 1172 tests passed)
RUN v4.1.11 D:/WORK/LNSW/sipt-backend
Test Files 119 passed (119)
Tests 1172 passed (1172)
Start at 09:30:44
Duration 10.17s (transform 10.33s, setup 0ms, import 30.92s, tests 4.51s, environment 37ms)B. Panduan Pengujian QA & Verifikasi Staging (QA Playbook)
- Cakupan / Surface Pengujian:
Worker / DB / Cron Only(Pipeline CI/CD & Static Code Analysis) - Kebutuhan Akses / Role Akun: Developer / DevOps — akses ke SonarQube dashboard LNSW
- Hasil Pengujian UAT:
PENDING - Catatan QA: —
Skenario Pengujian QA (Test Scenarios)
Skenario 1 — Verifikasi Test Runner (CI Happy Path):
- Pre-kondisi: Semua dependensi terinstall (
npm install) dan environment runtime Node.js tersedia. - Trigger / Request: Jalankan perintah runner
npm run test:onlyataunpm test(dengan coverage). - Ekspektasi Response: CLI terminal melaporkan 119 test files berstatus passed, seluruh 1.172 assertions passed, durasi ~10 detik, tanpa ada failure.
- Verifikasi Database / Log: File artefak coverage
coverage/lcov.infoberhasil dibuat di root direktori repo.
- Pre-kondisi: Semua dependensi terinstall (
Skenario 2 — Verifikasi SonarQube Coverage Upload & Quality Gate:
- Pre-kondisi:
npm testselesai dieksekusi dan filecoverage/lcov.infotersedia. - Trigger / Request: Jalankan SonarQube scanner pada pipeline CI/CD (
sonar-scanner). - Ekspektasi Response: Dashboard SonarQube menampilkan metrik coverage > 30% untuk statements, branches, functions, dan lines.
- Verifikasi Database / Log: Project
lnsw_sipt-backend_AYbpxwnIhtKTvbdPKUcdpada SonarQube menampilkan status Quality Gate passed.
- Pre-kondisi:
Bukti Response Verifikasi Staging (Diisi saat UAT)
{
"status": "PENDING",
"note": "Menunggu deployment ke environment Staging untuk eksekusi skenario uji QA dan scanner SonarQube pada pipeline CI/CD."
}