47 lines
2.3 KiB
Markdown
47 lines
2.3 KiB
Markdown
# Testing
|
|
|
|
NexusAI has a lightweight regression suite built on Node's **built-in** test
|
|
runner (`node:test`) and assertions (`node:assert`) — no external test
|
|
dependencies. It runs offline on any node in the homelab.
|
|
|
|
```bash
|
|
npm test # = node --test (discovers test/*.test.js at the repo root)
|
|
```
|
|
|
|
## What's covered
|
|
|
|
| File | Subject | Imports the real… |
|
|
|---|---|---|
|
|
| `test/fusion.test.js` | RRF ranking math | `fuseEpisodeResults` (orchestration) |
|
|
| `test/fts-query.test.js` | Keyword tokenizer + FTS5 matching | `buildFtsQuery` (memory-service) |
|
|
| `test/llamacpp-stream.test.js` | SSE stream reassembly across chunks | `completeStream` (inference) |
|
|
| `test/summarization.test.js` | Summarization decision logic | `maybeSummarize` (orchestration) |
|
|
| `test/entity-extraction.test.js` | Greeting + regurgitation guards | `mentionedIn`, `isIgnoredName` (memory-service) |
|
|
| `test/schema.test.js` | Fresh-DB schema completeness | `schema.js` string (memory-service) |
|
|
| `test/migrations.test.js` | Migration version-stepping | `migrate` (memory-service) |
|
|
|
|
Tests import the **real** functions rather than reimplementing logic — the
|
|
functions are exported for this purpose. External calls (Ollama, Qdrant, the
|
|
memory service) are mocked via `global.fetch`; SQLite-backed tests use the
|
|
built-in `node:sqlite` module against a throwaway in-memory database.
|
|
|
|
## `node:sqlite` and skips
|
|
|
|
`test/schema.test.js` and three cases in `test/fts-query.test.js` need
|
|
`node:sqlite`, which requires **Node ≥ 22.5**. On older Node they `skip`
|
|
themselves cleanly (guarded by `{ skip: !DatabaseSync }`) rather than failing,
|
|
so the suite stays green everywhere — but those checks only *verify* anything on
|
|
a node new enough to run them. A dev machine on current Node is the source of
|
|
truth for the schema and FTS matching tests.
|
|
|
|
`node:sqlite` is still marked experimental, so runs print a one-line
|
|
`ExperimentalWarning`. It's harmless; `node --test --no-warnings` suppresses it.
|
|
|
|
## Adding tests
|
|
|
|
Keep the pattern: export the real function, import it, mock I/O at the boundary
|
|
(`global.fetch`) or use `node:sqlite` for DB behaviour. Prefer testing pure
|
|
logic (ranking, tokenizing, version-stepping, decision branches) over wiring.
|
|
Several of these tests were written *after* a bug slipped through — each new
|
|
class of mistake is worth a case so it can't recur silently.
|