#!/usr/bin/env bats # Seam: Caddyfile validity. # # There is exactly one Caddy in the homelab: the container on dankclaw # (dankclaw/compose.yaml, service 'caddy'). It fronts every service on both # hosts — local services by container name, dankserver services by published # LAN port. Site blocks use the flat franksdank.cloud / franksdank.casa # convention. The basicauth hash is a placeholder in git; deploy.sh renders # the real hash from the host .env (CADDY_BASICAUTH_HASH). load helpers CADDYFILE="$REPO_ROOT/dankclaw/Caddyfile" @test "the Caddyfile lives on dankclaw only (Caddy is consolidated there)" { [ -f "$CADDYFILE" ] [ ! -f "$REPO_ROOT/dankserver/Caddyfile" ] } @test "the Caddyfile uses the flat franksdank.cloud hostname convention" { grep -qE '\.franksdank\.cloud' "$CADDYFILE" } @test "no .local vhost names remain in the Caddyfile" { ! grep -qE '^([a-z0-9.-]+\.)?(dankserver|dankclaw)\.local[[:space:]]*\{' \ "$CADDYFILE" } @test "the Caddyfile has balanced braces" { local open close open=$(grep -o '{' "$CADDYFILE" | wc -l) close=$(grep -o '}' "$CADDYFILE" | wc -l) [ "$open" -eq "$close" ] || { echo "unbalanced braces ($open vs $close)"; return 1; } } @test "caddy validate passes when caddy is available" { if command -v caddy >/dev/null 2>&1; then caddy validate --config "$CADDYFILE" --adapter caddyfile else skip "caddy binary not installed locally" fi } @test "homepage basic auth exists in the Caddyfile" { grep -qiE 'basicauth|basic_auth' "$CADDYFILE" } @test "the Caddyfile carries the renderable basicauth placeholder" { grep -q 'REPLACE_WITH_HASH' "$CADDYFILE" } @test "compose no longer defines the quadlet-replaced services" { # gitea, its postgres, and open-webui run as boot-persistent quadlets on # dankclaw (see dankclaw/gitea/quadlet, dankclaw/open-webui/quadlet). ! grep -qE '^\s+(gitea|postgres|openwebui):\s*$' "$REPO_ROOT/dankclaw/compose.yaml" } @test "the caddy service healthcheck probes the bare-IP catch-all" { grep -q 'curl.*-sf.*http://localhost:80/' "$REPO_ROOT/dankclaw/compose.yaml" }