[ND-304/LNSW.34/2026] Pembaruan Standar Quality Gate SonarQube dan Implementasi Komprehensif Unit Test Coverage Backend Pengangkut
Modul: Pengangkut | Tipe: Change Request | Stage Saat Ini:
STAGING| Tanggal Dokumen: 2026-09-03
1. Informasi Tugas & Referensi Bisnis
Task ID / Nomor Referensi:
ND-304/LNSW.34/2026Sumber Instruksi: Nota Dinas Resmi
Dokumen Referensi / Lampiran: Pemberitahuan Pembaruan Standar Quality Gate SonarQube.pdf
Task / Dependensi Terkait (Cross-Service): Tidak ada
Modul Terkait:
PengangkutService / Repository:
pengangkut-backendPIC Pengembang: Hermansyah Efendi
Latar Belakang & Ringkasan Kebutuhan: Pemenuhan kepatuhan terhadap Nota Dinas ND-304/LNSW.34/2026 perihal pembaruan standar metrik Quality Gate SonarQube pada Aplikasi Sistem Indonesia Single Window (SINSW), khususnya ketentuan batas kelulusan Unit Test Coverage minimum 30.0% pada Overall Code untuk aplikasi eksisting. Implementasi ini mencakup setup test engine Vitest, konfigurasi LCOV coverage reporting, sinkronisasi exclusions pada SonarQube, serta penulisan 207 test suites (1.945 tests) terisolasi (mocking database, cache/Redis, dan third-party services) di seluruh lapisan arsitektur (controllers, services, helpers, middlewares, validations, API clients, models, dan transformers) agar scanning SonarQube dan pipeline CI/CD lulus Quality Gate tanpa network blocking.
Ruang Lingkup & Rincian Sub-Pekerjaan (Technical Scope & Milestones):
- [x] Inisiasi framework unit test Vitest (
vitest.config.js), konfigurasi LCOV reporter, dan integrasi sonar coverage exclusions (sonar-project.properties). - [x] Implementasi unit test suite 1-to-1 pada lapisan Validation Schemas (Zod) dan API Client integrations.
- [x] Implementasi unit test suite komprehensif pada Service Layer dan Model/Query generation.
- [x] Implementasi unit test suite pada Controller Layer, Middlewares (Auth, Access Role, Error Handling), dan Helper Utilities.
- [x] Isolasi dependensi eksternal (mocking Redis/Cache Service, Axios HTTP client, dan database connections) untuk mencegah kegagalan pipeline CI/CD akibat network timeout.
- [x] Verifikasi empiris eksekusi test runner (100% lulus / 207 test files, 1.945 tests passed) untuk memenuhi Quality Gate SonarQube.
- [x] Inisiasi framework unit test Vitest (
2. Deployment Lifecycle
| # | Environment | Tanggal & Waktu | PIC | Status | Catatan |
|---|---|---|---|---|---|
| 1 | Development | 2026-08-11 14:33 | Hermansyah Efendi | DEPLOYED | Branch: development (Merged from feat/unit-test-coverage) |
| 2 | Staging (UAT) | 2026-09-09 11:34 | achmad fauzi | DEPLOYED | Release Candidate v1.18.2 via MR !2080. Co-deployed: [TASK-DRAGONFLYDB-MIGRATION, TASK-SPLIT-BILLING-202608, FEAT-MANUAL-BILLING-REQUEST, MAINT-SUPERSET-SUMMARY-SHIP-SYNC-SECURITY, REFACTOR-DEPRECATE-POST-STATUS-SERVICE-MIGRATION, TASK-PINO-LOGGER-REFACTOR, ND-304-LNSW.34-2026, ND-256-LNSW.34-2026, ND-183-LNSW.34-2026] |
| 3 | Production | — | — | PENDING | — |
Riwayat Update Log
| Tanggal | Environment | Perubahan | PIC |
|---|---|---|---|
| 2026-09-09 | Staging | Promosi ke STAGING via MR !2080 (Release Candidate v1.18.2) | Hermansyah Efendi |
| 2026-09-03 | Development | Initial log created | Hermansyah Efendi |
3. Analisis Teknis & Rincian Perubahan
Alur Logika & Bisnis: Inisiasi dan konfigurasi Vitest test runner untuk pemindaian SonarQube dengan output report LCOV (
coverage/lcov.info). Seluruh test suite dibangun dengan prinsip isolasi dependency (mocking Axios, Sequelize, Redis Client, Clamscan, dan file system) agar pengujian berjalan secara deterministik dan cepat pada lingkungan CI/CD lokal maupun pipeline GitLab/Jenkins tanpa bergantung pada koneksi jaringan atau database eksternal.Perubahan Database (DDL / DML):
sql-- Tidak ada migration file yang terdeteksi — Perubahan murni penambahan infrastructure unit test dan test suites.Kontrak API & Response Payload: Tidak ada penambahan atau perubahan kontrak API.
4. Bukti Teknis (Technical Proof & Audit Trail)
- Repository:
pengangkut-backend - Branch Utama:
development - Merge Request / PR: MR !2080 (Release Candidate v1.18.2)
Daftar Commit Terkait (Multi-Commit Trail)
| Commit ID | Branch | Author | Tanggal & Jam | Ringkasan Perubahan |
|---|---|---|---|---|
5c520918 | feat/unit-test-coverage | Hermansyah Efendi | 2026-08-04 11:45 | test(coverage): add unit tests to achieve 30% SonarQube line coverage |
1880bfa2 | feat/unit-test-coverage | Hermansyah Efendi | 2026-08-04 11:50 | fix vuln pack |
d281d061 | feat/unit-test-coverage | Hermansyah Efendi | 2026-08-04 12:02 | chore(test): merge test:coverage into test script |
d645d3bb | feat/unit-test-coverage | Hermansyah Efendi | 2026-08-04 12:08 | test(vitest): add vitest.config.js and configure lcov coverage reporter |
8f68d39b | feat/unit-test-coverage | Hermansyah Efendi | 2026-08-04 12:21 | update sonar prop |
9926c33d | feat/unit-test-coverage | Hermansyah Efendi | 2026-08-04 13:10 | test(coverage): add unit tests for services and major controllers |
2ac4dc5c | development | Hermansyah Efendi | 2026-08-04 13:11 | Merge branch 'feat/unit-test-coverage' into development |
c7c43b61 | feat/unit-test-coverage | Hermansyah Efendi | 2026-08-04 14:19 | test(services): split monolithic td-services test into individual service test files |
ecb83294 | development | Hermansyah Efendi | 2026-08-04 14:19 | Merge branch 'feat/unit-test-coverage' into development |
0e4ca794 | feat/unit-test-coverage | Hermansyah Efendi | 2026-08-04 14:46 | test(coverage): expand unit tests for helpers and service layer |
e4a2a3a4 | development | Hermansyah Efendi | 2026-08-04 14:47 | Merge branch 'feat/unit-test-coverage' into development |
2c29e8c0 | feat/unit-test-coverage | Hermansyah Efendi | 2026-08-04 15:29 | test(controllers): expand unit test coverage for controllers and fix missing log import |
f5386e86 | development | Hermansyah Efendi | 2026-08-04 15:29 | Merge branch 'feat/unit-test-coverage' into development |
b3774a66 | feat/unit-test-coverage | Hermansyah Efendi | 2026-08-04 16:17 | test(controllers): expand unit test coverage across multiple controllers |
737a4ad6 | feat/unit-test-coverage | Hermansyah Efendi | 2026-08-04 16:18 | Merge branch 'development' into feat/unit-test-coverage |
f0abf27b | feat/unit-test-coverage | Hermansyah Efendi | 2026-08-05 10:01 | docs(changelog): update unreleased entries |
7b7baee4 | feat/unit-test-coverage | Hermansyah Efendi | 2026-08-06 12:28 | test(coverage): configure coverage exclusions for declarative and connection files |
a7156b4f | feat/unit-test-coverage | Hermansyah Efendi | 2026-08-06 13:41 | test(validations): add 1-to-1 unit test suites for validation schemas |
d361d4fe | feat/unit-test-coverage | Hermansyah Efendi | 2026-08-06 13:47 | test(api): add 1-to-1 unit test suites for API client layer |
59e5b0e8 | feat/unit-test-coverage | Hermansyah Efendi | 2026-08-06 14:31 | test(services): add 1-to-1 unit test suites across service layer |
64124682 | development | Hermansyah Efendi | 2026-08-06 14:31 | Merge branch 'feat/unit-test-coverage' into development |
1939b4e6 | feat/unit-test-coverage | Hermansyah Efendi | 2026-08-06 14:43 | fix(tests): mock cache service in validation test suites to prevent CI/CD network timeouts |
47fe2dfa | feat/unit-test-coverage | Hermansyah Efendi | 2026-08-06 14:46 | test(coverage): add unit test suites for transformers, env-validator, and dashboard validation |
7889587f | feat/unit-test-coverage | Hermansyah Efendi | 2026-08-06 14:55 | fix(tests): isolate cache service in passenger and remaining validation test suites |
26077d26 | development | Hermansyah Efendi | 2026-08-06 14:55 | Merge branch 'feat/unit-test-coverage' into development |
5d0ab1d7 | feat/unit-test-coverage | Hermansyah Efendi | 2026-08-10 10:04 | test(helpers,middlewares): add unit test suites for helper and middleware layers |
fb550d09 | development | Hermansyah Efendi | 2026-08-10 10:05 | Merge branch 'feat/unit-test-coverage' into development |
e994552b | feat/unit-test-coverage | Hermansyah Efendi | 2026-08-10 10:17 | test(sinkarkes): fix getRefKkp rejection test assertion |
5c6b93be | development | Hermansyah Efendi | 2026-08-11 14:33 | Merge branch 'feat/unit-test-coverage' into development |
Cuplikan Kode / Implementasi Inti
// 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/constant/**',
'app/connection*.js',
'app/db_conn*.js',
'app/soap_conn.js',
'node_modules/**',
],
},
},
});# sonar-project.properties
sonar.projectKey=x
sonar.javascript.lcov.reportPaths=coverage/lcov.info
sonar.sources=app
sonar.tests=tests
sonar.coverage.exclusions=app/schemas/**,app/routers/**,app/config/**,app/constant/**,app/connection*.js,app/db_conn*.js,app/soap_conn.js,app/public/**5. Bukti Verifikasi Pengujian (QA / Unit Test / API Verification)
A. Verifikasi Unit Test (Development Stage)
- Test Suite File:
tests/**/*.test.js(207 test suites) - Status Eksekusi CLI:
PASSED
// tests/controllers/v2/billing.controller.test.js
import { describe, it, expect, vi } from 'vitest';
import * as billingController from '../../../app/controllers/v2/billing.controller.js';
import * as splitBillingService from '../../../app/services/split-billing.service.js';
import * as requestBillingService from '../../../app/services/request-billing.service.js';
import * as inquiryBillingService from '../../../app/services/inquiry-billing.service.js';
import ApiResponse from '../../../app/helpers/api-response.js';
describe('Billing Controller V2', () => {
it('should return 200 on successful split billing', async () => {
vi.spyOn(splitBillingService, 'splitBilling').mockResolvedValue({ id_tagihan: 123 });
const req = { body: { service_number: '101', bypass_targets: ['KEMENKES'], keterangan: 'Testing' }, user: { id: 'admin1' } };
const res = await billingController.splitBilling(req);
expect(res).toBeInstanceOf(ApiResponse);
expect(res.statusCode).toBe(200);
});
}); RUN v4.1.10 D:/WORK/LNSW/pengangkut-backend
Test Files 207 passed (207)
Tests 1945 passed (1945)
Start at 10:58:50
Duration 24.07s (transform 21.20s, setup 0ms, import 95.40s, tests 19.93s, environment 82ms)B. Panduan Pengujian QA & Verifikasi Staging (QA Playbook)
Diisi saat development sebagai panduan eksekusi pengujian QA, kemudian dilengkapi bukti response JSON saat verifikasi di Staging.
- Cakupan / Surface Pengujian:
API / Postman Only (Murni Unit Test & CI/CD Pipeline Quality Gate) - Kebutuhan Akses / Role Akun:
Akses Terminal Developer / CI/CD Runner / SonarQube Scanner - Hasil Pengujian UAT:
PENDING - Catatan QA: —
Skenario Pengujian QA (Test Scenarios)
Skenario 1 — Eksekusi Unit Test Lokal & Coverage Report (Happy Path):
- Pre-kondisi: Repository telah terinstal dependensi (
npm install). - Trigger / Request: Jalankan perintah
npm testataunpx vitest run --coverage. - Ekspektasi Response: Seluruh 207 test files lulus (207 passed), 1.945 test assertions lulus, dan file
coverage/lcov.infoterbentuk dengan persentase coverage ≥ 30.0%. - Verifikasi Database / Log: Output terminal menampilkan status passed tanpa throw error unhandled rejection.
- Pre-kondisi: Repository telah terinstal dependensi (
Skenario 2 — SonarQube Scanner Quality Gate Validation:
- Pre-kondisi: File
coverage/lcov.infotersedia di direktori root. - Trigger / Request: Eksekusi SonarQube scanner via pipeline CI/CD.
- Ekspektasi Response: SonarQube membaca laporan LCOV, mendeteksi Unit Test Coverage ≥ 30.0%, Maintainability Rating A, Reliability Rating A, Security Rating A, dan status Quality Gate bernilai
PASSED. - Verifikasi Database / Log: Dashboard SonarQube menampilkan Quality Gate passed sesuai kriteria ND-304/LNSW.34/2026.
- Pre-kondisi: File
Bukti Response Verifikasi Staging (Diisi saat UAT)
{
"status": "PENDING",
"note": "Menunggu deployment ke environment Staging untuk eksekusi skenario uji QA."
}