Skip to content

[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/2026

  • Sumber Instruksi: Nota Dinas Resmi

  • Dokumen Referensi / Lampiran: Pemberitahuan Pembaruan Standar Quality Gate SonarQube.pdf

  • Task / Dependensi Terkait (Cross-Service): Tidak ada

  • Modul Terkait: Pengangkut

  • Service / Repository: pengangkut-backend

  • PIC 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.

2. Deployment Lifecycle ​

#EnvironmentTanggal & WaktuPICStatusCatatan
1Development2026-08-11 14:33Hermansyah EfendiDEPLOYEDBranch: development (Merged from feat/unit-test-coverage)
2Staging (UAT)2026-09-09 11:34achmad fauziDEPLOYEDRelease 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]
3Production——PENDING—

Riwayat Update Log ​

TanggalEnvironmentPerubahanPIC
2026-09-09StagingPromosi ke STAGING via MR !2080 (Release Candidate v1.18.2)Hermansyah Efendi
2026-09-03DevelopmentInitial log createdHermansyah 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) ​

Daftar Commit Terkait (Multi-Commit Trail) ​

Commit IDBranchAuthorTanggal & JamRingkasan Perubahan
5c520918feat/unit-test-coverageHermansyah Efendi2026-08-04 11:45test(coverage): add unit tests to achieve 30% SonarQube line coverage
1880bfa2feat/unit-test-coverageHermansyah Efendi2026-08-04 11:50fix vuln pack
d281d061feat/unit-test-coverageHermansyah Efendi2026-08-04 12:02chore(test): merge test:coverage into test script
d645d3bbfeat/unit-test-coverageHermansyah Efendi2026-08-04 12:08test(vitest): add vitest.config.js and configure lcov coverage reporter
8f68d39bfeat/unit-test-coverageHermansyah Efendi2026-08-04 12:21update sonar prop
9926c33dfeat/unit-test-coverageHermansyah Efendi2026-08-04 13:10test(coverage): add unit tests for services and major controllers
2ac4dc5cdevelopmentHermansyah Efendi2026-08-04 13:11Merge branch 'feat/unit-test-coverage' into development
c7c43b61feat/unit-test-coverageHermansyah Efendi2026-08-04 14:19test(services): split monolithic td-services test into individual service test files
ecb83294developmentHermansyah Efendi2026-08-04 14:19Merge branch 'feat/unit-test-coverage' into development
0e4ca794feat/unit-test-coverageHermansyah Efendi2026-08-04 14:46test(coverage): expand unit tests for helpers and service layer
e4a2a3a4developmentHermansyah Efendi2026-08-04 14:47Merge branch 'feat/unit-test-coverage' into development
2c29e8c0feat/unit-test-coverageHermansyah Efendi2026-08-04 15:29test(controllers): expand unit test coverage for controllers and fix missing log import
f5386e86developmentHermansyah Efendi2026-08-04 15:29Merge branch 'feat/unit-test-coverage' into development
b3774a66feat/unit-test-coverageHermansyah Efendi2026-08-04 16:17test(controllers): expand unit test coverage across multiple controllers
737a4ad6feat/unit-test-coverageHermansyah Efendi2026-08-04 16:18Merge branch 'development' into feat/unit-test-coverage
f0abf27bfeat/unit-test-coverageHermansyah Efendi2026-08-05 10:01docs(changelog): update unreleased entries
7b7baee4feat/unit-test-coverageHermansyah Efendi2026-08-06 12:28test(coverage): configure coverage exclusions for declarative and connection files
a7156b4ffeat/unit-test-coverageHermansyah Efendi2026-08-06 13:41test(validations): add 1-to-1 unit test suites for validation schemas
d361d4fefeat/unit-test-coverageHermansyah Efendi2026-08-06 13:47test(api): add 1-to-1 unit test suites for API client layer
59e5b0e8feat/unit-test-coverageHermansyah Efendi2026-08-06 14:31test(services): add 1-to-1 unit test suites across service layer
64124682developmentHermansyah Efendi2026-08-06 14:31Merge branch 'feat/unit-test-coverage' into development
1939b4e6feat/unit-test-coverageHermansyah Efendi2026-08-06 14:43fix(tests): mock cache service in validation test suites to prevent CI/CD network timeouts
47fe2dfafeat/unit-test-coverageHermansyah Efendi2026-08-06 14:46test(coverage): add unit test suites for transformers, env-validator, and dashboard validation
7889587ffeat/unit-test-coverageHermansyah Efendi2026-08-06 14:55fix(tests): isolate cache service in passenger and remaining validation test suites
26077d26developmentHermansyah Efendi2026-08-06 14:55Merge branch 'feat/unit-test-coverage' into development
5d0ab1d7feat/unit-test-coverageHermansyah Efendi2026-08-10 10:04test(helpers,middlewares): add unit test suites for helper and middleware layers
fb550d09developmentHermansyah Efendi2026-08-10 10:05Merge branch 'feat/unit-test-coverage' into development
e994552bfeat/unit-test-coverageHermansyah Efendi2026-08-10 10:17test(sinkarkes): fix getRefKkp rejection test assertion
5c6b93bedevelopmentHermansyah Efendi2026-08-11 14:33Merge branch 'feat/unit-test-coverage' into development

Cuplikan Kode / Implementasi Inti ​

javascript
// 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/**',
      ],
    },
  },
});
properties
# 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
javascript
// 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);
  });
});
text
 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) ​
  1. Skenario 1 — Eksekusi Unit Test Lokal & Coverage Report (Happy Path):

    • Pre-kondisi: Repository telah terinstal dependensi (npm install).
    • Trigger / Request: Jalankan perintah npm test atau npx vitest run --coverage.
    • Ekspektasi Response: Seluruh 207 test files lulus (207 passed), 1.945 test assertions lulus, dan file coverage/lcov.info terbentuk dengan persentase coverage ≥ 30.0%.
    • Verifikasi Database / Log: Output terminal menampilkan status passed tanpa throw error unhandled rejection.
  2. Skenario 2 — SonarQube Scanner Quality Gate Validation:

    • Pre-kondisi: File coverage/lcov.info tersedia 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.
Bukti Response Verifikasi Staging (Diisi saat UAT) ​
json
{
  "status": "PENDING",
  "note": "Menunggu deployment ke environment Staging untuk eksekusi skenario uji QA."
}

Single Source of Truth (SSOT) Arsitektur & Perubahan Teknis Backend