--- description: Vitest via vp test; unit tests sit next to code as *.test.ts, regression/integration tests in tests/ via the public entry (through its # alias, never ../); scripts/ has no tests --- Decided 2026-10-14 for all repos. - **Runner:** Vitest through `vp test`. Import test APIs from `vite-plus/test` (`describe`, `expect`, `it`). - **Unit tests** sit next to the code: `src/foo/bar.ts` is tested in `src/foo/bar.test.ts`. Vitest's default include finds them; no `test` config needed. Packages publish only `dist/`, so colocated tests cost nothing in the tarball. - **Regression and integration tests** live in the top-level `tests/` folder and use only the public entry point, imported through its `#` alias (e.g. `#plugin` for `./src/plugin/index.ts`), never internals and never `../`, which is banned in every file. `vp test tests` runs just these ([[imports-aliases-barrels]]). In bot-agents, `tests/` imports only `#testing` (`./src/testing.ts`), which re-exports the few source helpers those tests need. - **No in-source tests** (`import.meta.vitest`). - **`scripts/` gets no tests** (2026-10-15): it is repo tooling, not production code (`project-lint.ts`, `decorators.ts`, `lit-check.ts`, release helpers). - Test files follow every lint rule; no relaxed overrides for tests. ## Migrating Deno tests `Deno.test` suites were converted by a codemod (`~/.local/share/deno-migration/src/convert.ts` on the user's machine), then its TODOs finished by hand. Watch for: - `@std/assert` → `expect` (`assertEquals` → `toStrictEqual` or `toBe`, `assertThrows` → `toThrow`, `assertRejects` → `rejects.toThrow`); - `Deno.*` file, env, and process APIs → `node:fs`, `process.env`, `node:child_process`; - `t.step` → nested `describe`/`it`; - sanitizer options, which Vitest doesn't have. A migration PR must keep every test case; a dropped case is lost coverage. Tests must pass locally before any push.