mirror of
https://github.com/abhigyanpatwari/GitNexus.git
synced 2026-09-27 01:21:18 +00:00
* refactor: migrate from KuzuDB to LadybugDB v0.15 KuzuDB was archived (Apple acquisition, Oct 2025). LadybugDB is the community fork with full API compatibility. - Package swap: kuzu → @ladybugdb/core, kuzu-wasm → @ladybugdb/wasm-core - Rename all internal paths: kuzu → lbug (adapters, schema, storage) - Storage path: .gitnexus/kuzu → .gitnexus/lbug (with auto-cleanup) - Add explicit VECTOR extension loading (required in v0.15) - Update CI workflow, documentation, and all tests - 1151 unit + 27 integration tests passing Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: address code review findings (P1-P3) P1: Fix WASM adapter to use getAll() API, wire cleanupOldKuzuFiles into analyze command, add symlink path traversal protection. P2: Cache VECTOR extension load state, batch augmentation engine queries (20→4), fix web getCopyQuery for multi-language tables, fix stale KuzuDB references, correct brainstorm package names. P3: Complete lbug-wasm.d.ts type declarations, batch semantic search per-label, update stale BM25 comment. * chore: remove outdated KuzuDB migration brainstorming document * fix: load FTS extension in MCP pool adapter on init The read-only pool adapter never loaded the FTS extension, so all QUERY_FTS_INDEX calls failed silently. This broke search-pool and augmentation integration tests, and caused empty results in the web UI server mode. * feat: implement shared Database caching and connection reference counting * feat: enhance KuzuDB migration handling and status reporting * fix: mock cleanupOldKuzuFiles in local backend callTool tests * fix: update mock for cleanupOldKuzuFiles and adjust imports in callTool tests --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
196 lines
8 KiB
YAML
196 lines
8 KiB
YAML
name: Integration Tests
|
|
|
|
on:
|
|
workflow_call:
|
|
inputs:
|
|
collect-coverage:
|
|
description: 'Whether to run the coverage collection job (only needed for PR reports)'
|
|
required: false
|
|
default: true
|
|
type: boolean
|
|
|
|
jobs:
|
|
# ── Integration test matrix ─────────────────────────────────────────
|
|
# Each test-group runs on a SEPARATE runner per OS, giving full process
|
|
# isolation for the LadybugDB native C++ addon.
|
|
# 3 OS x 4 groups = 12 parallel jobs.
|
|
#
|
|
# Groups:
|
|
# lbug-db — 7 files using withTestLbugDB / lbug-adapter (native addon)
|
|
# Each file runs as its own `vitest run` invocation for full
|
|
# process isolation. LadybugDB's native N-API addon registers
|
|
# persistent handles that prevent fork workers from exiting
|
|
# on Linux, and its C++ destructors segfault during
|
|
# process.exit(). Running each file in its own process lets
|
|
# the OS reclaim all resources cleanly.
|
|
# pipeline — 12 files: ingestion pipeline + csv + 9 resolver tests
|
|
# e2e — 2 files: child-process only (spawnSync), no in-process lbug
|
|
# standalone — 4 files: pure logic, no lbug, no child processes
|
|
test-matrix:
|
|
name: integration (${{ matrix.os }} / ${{ matrix.test-group }})
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
os: [ubuntu-latest, windows-latest, macos-latest]
|
|
test-group: [lbug-db, pipeline, e2e, standalone]
|
|
include:
|
|
- test-group: lbug-db
|
|
# Marker — actual files are listed in the run step below
|
|
test-glob: ''
|
|
- test-group: pipeline
|
|
test-glob: >-
|
|
test/integration/pipeline.test.ts
|
|
test/integration/csv-pipeline.test.ts
|
|
test/integration/parsing.test.ts
|
|
test/integration/resolvers/typescript.test.ts
|
|
test/integration/resolvers/csharp.test.ts
|
|
test/integration/resolvers/cpp.test.ts
|
|
test/integration/resolvers/java.test.ts
|
|
test/integration/resolvers/python.test.ts
|
|
test/integration/resolvers/rust.test.ts
|
|
test/integration/resolvers/go.test.ts
|
|
test/integration/resolvers/kotlin.test.ts
|
|
test/integration/resolvers/php.test.ts
|
|
test/integration/resolvers/ruby.test.ts
|
|
test/integration/resolvers/swift.test.ts
|
|
- test-group: e2e
|
|
test-glob: >-
|
|
test/integration/cli-e2e.test.ts
|
|
test/integration/hooks-e2e.test.ts
|
|
test/integration/skills-e2e.test.ts
|
|
- test-group: standalone
|
|
test-glob: >-
|
|
test/integration/filesystem-walker.test.ts
|
|
test/integration/enrichment.test.ts
|
|
test/integration/tree-sitter-languages.test.ts
|
|
test/integration/worker-pool.test.ts
|
|
runs-on: ${{ matrix.os }}
|
|
timeout-minutes: 25
|
|
steps:
|
|
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
|
- uses: ./.github/actions/setup-gitnexus
|
|
with:
|
|
build: 'true'
|
|
|
|
# lbug-db: run each file in its own vitest process for full isolation.
|
|
# LadybugDB's native addon hangs fork workers on Linux — process isolation
|
|
# is the only reliable fix boundary.
|
|
- name: Run integration tests — lbug-db (process-isolated)
|
|
if: matrix.test-group == 'lbug-db'
|
|
working-directory: gitnexus
|
|
shell: bash
|
|
run: |
|
|
set -e
|
|
files=(
|
|
test/integration/lbug-core-adapter.test.ts
|
|
test/integration/lbug-pool.test.ts
|
|
test/integration/local-backend.test.ts
|
|
test/integration/local-backend-calltool.test.ts
|
|
test/integration/search-core.test.ts
|
|
test/integration/search-pool.test.ts
|
|
test/integration/augmentation.test.ts
|
|
)
|
|
exit_code=0
|
|
for f in "${files[@]}"; do
|
|
echo "::group::$f"
|
|
if ! npx vitest run --reporter=verbose --pool=forks "$f"; then
|
|
exit_code=1
|
|
echo "::error::Test file failed: $f"
|
|
fi
|
|
echo "::endgroup::"
|
|
done
|
|
exit $exit_code
|
|
|
|
# Non-lbug groups: run all files in a single vitest invocation
|
|
- name: Run integration tests — ${{ matrix.test-group }}
|
|
if: matrix.test-group != 'lbug-db'
|
|
shell: bash
|
|
env:
|
|
TEST_GLOB: ${{ matrix.test-glob }}
|
|
run: npx vitest run --reporter=verbose $TEST_GLOB
|
|
working-directory: gitnexus
|
|
|
|
# ── Coverage collection (ubuntu only) ─────────────────────────────────
|
|
# Runs non-lbug integration tests with coverage enabled so the PR report
|
|
# can merge integration + unit coverage for a combined view.
|
|
# lbug-db tests are excluded because each file must run in its own vitest
|
|
# process (native addon isolation) which prevents single-run coverage merge.
|
|
coverage:
|
|
name: integration (ubuntu / coverage)
|
|
if: inputs.collect-coverage
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 15
|
|
steps:
|
|
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
|
- uses: ./.github/actions/setup-gitnexus
|
|
with:
|
|
build: 'true'
|
|
|
|
- name: Run integration tests with coverage
|
|
working-directory: gitnexus
|
|
run: >-
|
|
npx vitest run
|
|
--reporter=default
|
|
--reporter=json
|
|
--outputFile=integration-results.json
|
|
--coverage
|
|
--coverage.reporter=json-summary
|
|
--coverage.reporter=json
|
|
--coverage.reporter=text
|
|
--coverage.thresholdAutoUpdate=false
|
|
--coverage.reportOnFailure=true
|
|
--coverage.thresholds.statements=0
|
|
--coverage.thresholds.branches=0
|
|
--coverage.thresholds.functions=0
|
|
--coverage.thresholds.lines=0
|
|
test/integration/pipeline.test.ts
|
|
test/integration/csv-pipeline.test.ts
|
|
test/integration/parsing.test.ts
|
|
test/integration/cli-e2e.test.ts
|
|
test/integration/hooks-e2e.test.ts
|
|
test/integration/filesystem-walker.test.ts
|
|
test/integration/enrichment.test.ts
|
|
test/integration/tree-sitter-languages.test.ts
|
|
test/integration/worker-pool.test.ts
|
|
test/integration/resolvers/typescript.test.ts
|
|
test/integration/resolvers/csharp.test.ts
|
|
test/integration/resolvers/cpp.test.ts
|
|
test/integration/resolvers/java.test.ts
|
|
test/integration/resolvers/python.test.ts
|
|
test/integration/resolvers/rust.test.ts
|
|
test/integration/resolvers/go.test.ts
|
|
test/integration/resolvers/kotlin.test.ts
|
|
test/integration/resolvers/php.test.ts
|
|
test/integration/resolvers/ruby.test.ts
|
|
test/integration/resolvers/swift.test.ts
|
|
|
|
- name: Upload integration coverage
|
|
if: always()
|
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
|
|
with:
|
|
name: integration-reports
|
|
path: |
|
|
gitnexus/coverage/coverage-summary.json
|
|
gitnexus/coverage/coverage-final.json
|
|
gitnexus/integration-results.json
|
|
retention-days: 5
|
|
|
|
# ── Unified status gate ──────────────────────────────────────────────
|
|
# Branch protection should require THIS job, not the matrix jobs directly.
|
|
# ci.yml's needs.integration.result aggregates through this gate.
|
|
status:
|
|
name: integration (all groups)
|
|
needs: test-matrix
|
|
if: always()
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 5
|
|
steps:
|
|
- name: Check all matrix jobs passed
|
|
shell: bash
|
|
env:
|
|
RESULT: ${{ needs.test-matrix.result }}
|
|
run: |
|
|
if [[ "$RESULT" != "success" ]]; then
|
|
echo "::error::Integration matrix failed or cancelled: $RESULT"
|
|
exit 1
|
|
fi
|