# Testing Policy This repository tests its configuration at defined seams. The tests run with `bats`; run them with `./tests/run.sh` before every push. ## Seams Under Test | Seam | File | What it asserts | |------|------|-----------------| | Compose validity | `tests/compose_validity.bats` | YAML parses, services have images, no named volumes | | Env consistency | `tests/env_consistency.bats` | every `${VAR}` is defined in `.env.example`; no real secrets; the live gitea password never appears | | Caddyfile validity | `tests/caddyfile.bats` | per-host Caddyfile, `.local` convention, balanced braces, basic auth present | | Docs completeness | `tests/docs_completeness.bats` | every compose service has a docs page; index links every page | | Script syntax | `tests/scripts_syntax.bats` | `bash -n` clean, executable bits, shellcheck when available | | Deployment flow | `tests/deployment_flow.bats`, `tests/deployment_scoping.bats` | scoped dispatcher exists, targets are known, service plans isolate inference, Caddy ownership is guarded, and SSH reachability is checked (skips offline) | ## Focused pre-commit testing For normal commits, use the focused wrapper: ```bash ./scripts/test-changed.sh ``` It reads staged paths with `git diff --cached` and runs only the mapped Bats files. The tracked `.githooks/pre-commit` hook invokes this wrapper. Enable the repository hook path once per checkout: ```bash git config core.hooksPath .githooks ``` Use `--list` to inspect the selection without running tests, or `--paths FILE ...` to preview a mapping. Shared test infrastructure and unmapped paths fail closed rather than silently skipping coverage. Run the full suite with `./tests/run.sh` when changing shared test helpers, the test runner, or when focused coverage is not sufficient. ## Red-Green Tests are written first. A failing test means the seam is not satisfied; the config change that makes it pass is the only acceptable fix. No `--no-verify`, no deleting tests without approval. ## See Also - [[Deployment Flow]] - [[index]]