- name
- testing-guidelines
- description
- Testing conventions for divine-web. Load when writing or modifying tests, or
when verifying changes with Vitest or Playwright.
# Testing Guidelines
## Frameworks and Setup
Unit tests use Vitest with jsdom. Component tests use
`@testing-library/react`. Global setup lives in `src/test/setup.ts`.
Test files colocate with source: `*.test.ts` for utilities, `*.test.tsx` for
components.
## Running Tests
- `npm run test` runs type-check, lint, vitest, and build. Use this before
pushing.
- `vitest run` for tests only.
- `vitest` for watch mode during development.
- `npm run test:visual` runs Playwright visual regression tests.
- `npm run test:visual:update` updates visual snapshots.
## Assertion Style
Favor user-facing assertions: `getByRole`, `getByText`, `getByLabelText`,
`getByPlaceholderText`. Query by what the user sees and interacts with.
Avoid testing implementation details. No direct state access. No querying by
`data-testid` unless no user-facing alternative exists.
## Mocking
Mock browser APIs (`window.location`, `fetch`, `IntersectionObserver`, etc.) as
needed. Use `vi.fn()` for spies and `vi.mock()` for module mocks. Keep mocks
minimal and scoped to the test file. Reset mocks between tests with
`vi.restoreAllMocks()` or per-test cleanup.
## Determinism
Tests must be deterministic. No relying on real timers, network calls, or
shared mutable state. Use `vi.useFakeTimers()` for time-dependent logic.
Isolate each test so it can run independently in any order.
## Rules
- Do not commit failing tests. Fix before pushing.
- Add or update tests alongside any feature change or bug fix. Tests are not
optional.
- If a test is temporarily skipped, it must have a linked issue:
`it.skip('description #123')`.
View on GitHub