Three layers, each with a different cost and a different reason to exist.
Unit tests
Vitest for the frontends, xUnit for the API:
npm run test:frontends
npm run test:api
Frontend components are tested by rendering them to static markup with
renderToStaticMarkup, which keeps the tests free of a DOM environment and asserts on what a
crawler would actually receive.
End-to-end tests
Playwright, driving the real apps against a real API:
npm run test:e2e
These need the stack running and the environment populated. They are the slowest layer, so they cover flows rather than details: signup, login, checkout, admin operations.
Guards
Beyond tests, the codebase enforces rules mechanically: configuration schemas, commit
authorship, comment density, and a language guard that rejects non-English strings outside
the message files. npm run qa:fast runs them all, and the pre-commit hook runs the subset
that applies to the files you touched.