Files
zkldi_Tachi/old-docs/docs/codebase/structure/testing.md
T
zk e363bd2532 docs: migrate from mkdocs to mdbook (#1558)
* docs: migrate from mkdocs to mdbook

- Rename old mkdocs docs/ to old-docs/ for reference
- Set up new docs/ with mdbook (book.toml + src/ tree)
- Mirror full nav structure from mkdocs.yml into SUMMARY.md
- Add Justfile-docs with docs-serve, docs-build, docs-check, docs-install recipes
- Import Justfile-docs from root Justfile
- Rewrite .github/workflows/docs.yml: build step uses taiki-e/install-action
  to install mdbook, split into separate build + deploy jobs, PR builds
  run the check step too

* ci(docs): pin actions to SHAs, install mdbook via release binary

* ci(docs): install mdbook from apt instead of curling a release binary

* dev: replace mkdocs python stack with mdbook in dev image

* ci(docs): apt only works on Debian; restore release binary install for Ubuntu CI

* docs: fix duplicate file entries in SUMMARY.md

* docs: remove docs-install recipe

* docs: remove site-url from book.toml to fix asset loading

* dev: install mdbook from upstream release binary, not Debian apt

The Debian package (0.4.x+ds) strips bundled font assets, leaving the
built site without fonts/fonts.css. Use the upstream tarball (same as CI)
so the theme is complete. Handles x86_64 and aarch64.

* docs: vendor mdbook tarballs in dev/mdbook/, install from there

Dockerfile.dev uses COPY + tar to install the right arch at build time.
CI extracts the x86_64 tarball directly from the checkout.
No network access required for either — and no stripped-fonts Debian package.

* fix: unwritten
2026-05-22 20:43:07 +01:00

2.2 KiB

Tests

Tachi makes extensive use of tests to ensure code is of high quality when its released.


Running Tests

Tests are ran with node-tap.

You can run the server test suite with the following script:

pnpm test

This will execute every test, and also perform coverage analysis.

!!! bug This may or may not impact you depending on how dependencies install, but tap requires ts-node and typescript to also be installed.

Otherwise, you will get a
`cannot use import outside of module`
error, which indicates that our typescript hasn't
been transpiled.

Writing Tests

Tests should be located in the same folder as the file they're testing, and tests should only ever test exports from one file at a time.

Tests should call things like ResetDBState and CloseAllConnections as lifecycle hooks to ensure the file exits.

Tests should use the extension .test.ts, and keep the same filename as the file they are testing.

Coverage

Coverage should be kept above 80%. New code should be tested.

Pull Requests will be rejected if they contain significant changes that are untested!

Single Process TAP

Since we don't mock our MongoDB install out, we run a real instance of Mongo for our tests, and run against it.

TAP runs every test file in isolation. This is a good idea normally, as it means state is never shared across files, and nothing bad is generally going to happen.

However, it takes around 2 seconds to connect to the MongoDB server when a new test file is started. These 2 seconds add up over the course of a ~1500 test file suite, and result in tests taking over 15-20 minutes.

To get around this, we use a Single Process TAP hack, which rolls all of our test files up into one test file.

The hack part here is not an understatement, and it is genuinely rather dirty. BUT, it runs in ~40-50 seconds, works the same for coverage, and can just generally be ignored as an abstraction layer.

As a downside, this makes error messages way more cryptic, but for a 20x performance gain, it can be lived with.

!!! warning If you are getting failures like "Child test left in suite", one of your test files is crashing the entire process, leaving all other tests just dangling.