# Testing All tests should run inside Docker containers. ## Canonical test command ```bash docker compose run --rm backend python manage.py test docker compose run --rm frontend npm run check docker compose run --rm frontend npm run build docker compose run --rm proxy nginx -t docker compose run --rm --no-deps --entrypoint certbot certbot --version docker compose -f docker-compose.yml -f docker-compose.test.yml --profile test run --rm backend python manage.py seed_demo docker compose -f docker-compose.yml -f docker-compose.test.yml --profile test run --build --rm functional-tests docker compose config --quiet LETSENCRYPT_ENABLED=1 docker compose config --quiet ``` ## Test categories The test suite covers: - Django model and API integration tests; - Astro static type and template validation; - production frontend build; - NGINX syntax and upstream configuration validation; - Certbot image availability/version and optional Compose service rendering; - Playwright functional browser tests through the NGINX virtual host; - Docker Compose configuration validation. All commands run in containers. The backend test container starts PostgreSQL through Compose; the frontend checks use the checked-in lockfile for reproducible installs. `docker-compose.test.yml` is an override used only for functional verification. It adds an internal `azionelab.org` alias to the proxy and starts a pinned Playwright container. Run the idempotent demo seed through the merged backend service immediately before the browser suite. The override uses `test_postgres_data` instead of the normal database volume and does not publish additional host ports. The browser suite verifies the public content and section order, CTA/contact links, mobile navigation, horizontal overflow, semantic landmarks, image alternatives, API contract, uploaded media, Wagtail admin routing, and rejection of unknown hosts. A manual visual review is still recommended for subjective layout and design quality.