Skip to content

[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-SONARQUBE

  • Sumber Instruksi: Inisiatif Engineering Internal

  • Dokumen Referensi / Lampiran: Tidak ada

  • Task / Dependensi Terkait (Cross-Service): —

  • Modul Terkait: SIPT/PAB

  • Service / Repository: sipt-backend

  • PIC Pengembang: Hermansyah Efendi

  • Ringkasan Non-Teknis (Executive Summary): Repo sipt-backend sebelumnya 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:

    1. 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).
    2. Dihubungkan laporan coverage LCOV ke dashboard SonarQube LNSW dengan ambang batas (threshold) minimum 30% untuk menjaga standar kualitas kode berkelanjutan pada pipeline CI/CD.
    3. Dilakukan penyelarasan mock test pada mekanisme cooldown PAB pasca refaktorisasi TTL 60 detik.
  • Latar Belakang & Ringkasan Kebutuhan: Repo sipt-backend sebelumnya 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.js dengan konfigurasi coverage provider v8, reporter LCOV/HTML/text, include/exclude paths, dan threshold coverage awal
    • [x] Menambahkan konfigurasi sonar-project.properties dengan 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*.js dan app/db_conn*.js ke coverage exclusions SonarQube

2. Deployment Lifecycle ​

#EnvironmentTanggal & WaktuPICStatusCatatan
1Development2026-08-12 09:50Hermansyah EfendiDEPLOYEDBranch: development (Commit: eeb5d19 .. baa4b6c)
2Staging (UAT)——PENDING—
3Production——PENDING—

Riwayat Update Log ​

TanggalEnvironmentPerubahanPIC
2026-09-15DevelopmentInisialisasi technical audit log untuk infrastruktur unit test Vitest dan integrasi SonarQube coverageHermansyah 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 pattern tests/**/*.test.js. Menggunakan coverage provider v8 yang memanfaatkan native V8 AST instrumentation sehingga performa eksekusi jauh lebih cepat dibandingkan Istanbul/Babel. Menghasilkan artefak reporter text, lcov (coverage/lcov.info), dan html. Mengatur path exclusion untuk file non-logika seperti app/public/**, app/schemas/**, app/routers/**, app/config/**, app/constants/**, app/connection*.js, app/db_conn*.js, app/seeder/**, app/raw-queries/**, app/tmp/**, dan app/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 memetakan sonar.projectKey=lnsw_sipt-backend_AYbpxwnIhtKTvbdPKUcd, sonar.sources=app, sonar.tests=tests, dan sonar.javascript.lcov.reportPaths=coverage/lcov.info. File koneksi database diisolasi dari metrik coverage melalui sonar.coverage.exclusions karena membutuhkan dependensi database aktif yang tidak relevan diuji pada level unit test terisolasi.
    • Penyelarasan Mock Test Cooldown & Interceptor (01bae0c): Menyesuaikan suite tests/middlewares/submission_cooldown.test.js pasca pembaruan submission cooldown:
      1. Mengubah assertion TTL Redis dari 300 detik menjadi 60 detik ('EX', 60, 'NX').
      2. Menambahkan mock res.end = vi.fn() untuk mengakomodasi monkey-patching pelepas kunci lock Redis.
      3. Menghapus assertion redisDel yang redundan pada tests/helpers/kemendag-axios-interceptor.test.js pasca eliminasi fungsi releaseSubmissionLock.
  • 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 IDBranchAuthorTanggal & JamRingkasan Perubahan
eeb5d19developmentHermansyah Efendi2026-08-11 22:06test(coverage): add comprehensive unit test suite and SonarQube coverage integration
83f42c4developmentHermansyah Efendi2026-08-11 22:07docs(changelog): update unreleased entries for unit test coverage and sonar setup
01bae0cdevelopmentHermansyah Efendi2026-08-11 22:11test(cooldown): align submission cooldown TTL and interceptor mocks with development branch
9f2d82edevelopmentHermansyah Efendi2026-08-11 22:23test(controllers): increase unit test coverage across controller files
f3576c8developmentHermansyah Efendi2026-08-11 22:23docs(changelog): update unreleased entries for controller unit test coverage
baa4b6cdevelopmentHermansyah Efendi2026-08-12 09:50chore(sonar): add db connection files to coverage exclusions

Cuplikan Kode / Implementasi Inti ​

javascript
// 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,
      },
    },
  },
});
properties
# 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/**
javascript
// 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)
text
 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) ​
  1. 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:only atau npm 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.info berhasil dibuat di root direktori repo.
  2. Skenario 2 — Verifikasi SonarQube Coverage Upload & Quality Gate:

    • Pre-kondisi: npm test selesai dieksekusi dan file coverage/lcov.info tersedia.
    • 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_AYbpxwnIhtKTvbdPKUcd pada SonarQube menampilkan status Quality Gate passed.
Bukti Response Verifikasi Staging (Diisi saat UAT) ​
json
{
  "status": "PENDING",
  "note": "Menunggu deployment ke environment Staging untuk eksekusi skenario uji QA dan scanner SonarQube pada pipeline CI/CD."
}

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