rank 3. shared/services.yml is the single source of truth for every deployable service (hosts, unit dirs, units, path claims, tests, scrape/ dns/probe facts, aliases, stacks); scripts/service-map.py is its only reader (hosts/services/allows/plan/seams/owner/units/stack/get/render/ check). deploy-plan.py becomes a thin CLI wrapper; both --service allow-lists (deploy.sh, deploy-remote.sh) and the changed-test mapper are the inventory. Selection semantics: host scoping (a host's tree selects only its own services), the quadlet netns/network coupling graph resolved across directories (gluetun's riders live in their own dirs), stacks, and canonical restart order. Against the pinned old-planner fixture: 921 raw deltas reduced to 17, all intentional (anubis now maps; cross-host paths select nothing; the retired qwen-sharp template plans nothing and the live froggeric template plans frank-archon; dankserver/romm/romm.container, missed by the old filename rule, plans the romm trio). The fixture is regenerated as the new pin. Integrity gates: schema, unit claims, quadlet-file ownership, path-glob liveness, Pi-hole hosts / Prometheus jobs / DNS / homepage probes drift. tests/service_inventory.bats pins all of it plus the plan fixture and the deploy-plan CLI. Allow-list grep seams in hermes_webui/observability_quadlet become behavioral allows calls.
78 lines
3.6 KiB
Bash
78 lines
3.6 KiB
Bash
#!/usr/bin/env bats
|
|
# Seam: the changed-test wrapper selects only the tests associated with
|
|
# staged paths and refuses to silently run the entire suite.
|
|
|
|
load helpers
|
|
|
|
@test "changed-test wrapper is executable and uses staged diff by default" {
|
|
[ -x "$REPO_ROOT/scripts/test-changed.sh" ]
|
|
[ -x "$REPO_ROOT/.githooks/pre-commit" ]
|
|
run grep -F 'scripts/test-changed.sh' "$REPO_ROOT/.githooks/pre-commit"
|
|
[ "$status" -eq 0 ]
|
|
run grep -F 'git diff --cached' "$REPO_ROOT/scripts/test-changed.sh"
|
|
[ "$status" -eq 0 ]
|
|
}
|
|
|
|
@test "changed-test wrapper maps a shared config change to its service seams" {
|
|
# The compose era is retired (rank 7): the former compose fixture here
|
|
# mapped dankserver/compose.yaml, a file that no longer exists. The
|
|
# equivalent contract now: a service config change maps to the
|
|
# service's seams and nothing unrelated.
|
|
run bash "$REPO_ROOT/scripts/test-changed.sh" --list --paths shared/searxng/settings.yml
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" == *"tests/searxng_limiter.bats"* ]]
|
|
[[ "$output" == *"tests/searxng_quadlet.bats"* ]]
|
|
[[ "$output" != *"tests/homepage_pages.bats"* ]]
|
|
}
|
|
|
|
@test "changed-test wrapper maps the frank-archon trio to its focused tests" {
|
|
# The root-unit shape since the 2026-09-26 swap: the trio lives in
|
|
# scripts/ and must select the unit seam before the generic
|
|
# scripts/*.service fallbacks can swallow it.
|
|
run bash "$REPO_ROOT/scripts/test-changed.sh" --list --paths \
|
|
scripts/frank-archon.env \
|
|
scripts/frank-archon.service \
|
|
scripts/serve-frank-archon.sh
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" == *"tests/frank_archon_unit.bats"* ]]
|
|
[[ "$output" == *"tests/llm_units.bats"* ]]
|
|
[[ "$output" == *"tests/deployment_scoping.bats"* ]]
|
|
[[ "$output" != *"tests/homepage_pages.bats"* ]]
|
|
# The retired trees must no longer select any LLM seam: the mappings
|
|
# were removed with the services, and a stale case would keep firing
|
|
# tests for archived runtimes. All three archive shapes — the radiance
|
|
# Quadlet era, the llama.cpp layersplit trio, and the lucebox quadlet
|
|
# dir — map to nothing.
|
|
run bash "$REPO_ROOT/scripts/test-changed.sh" --list --paths \
|
|
dankserver/.AGENTTRASH/20260926-frank-medium-radiance/frank-medium.container \
|
|
scripts/.AGENTTRASH/20260920-llama-layersplit/serve-frank-medium.sh.llamacpp-layersplit \
|
|
dankserver/.AGENTTRASH/20260926-llamacpp-cutover/frank-archon.container
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" != *"tests/frank_medium_unit.bats"* ]]
|
|
[[ "$output" != *"tests/frank_archon_unit.bats"* ]]
|
|
}
|
|
|
|
@test "changed-test wrapper maps the frankbook unit to the frankbook and deploy-flow seams" {
|
|
run bash "$REPO_ROOT/scripts/test-changed.sh" --list --paths frankbook-pro/sonarr/quadlet/sonarr.container
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" == *"tests/frankbook_quadlet.bats"* ]]
|
|
[[ "$output" == *"tests/deployment_flow.bats"* ]]
|
|
[[ "$output" == *"tests/deployment_scoping.bats"* ]]
|
|
[[ "$output" != *"tests/frank_archon_unit.bats"* ]]
|
|
}
|
|
|
|
@test "changed-test wrapper maps the inventory itself to its seam" {
|
|
run bash "$REPO_ROOT/scripts/test-changed.sh" --list --paths shared/services.yml
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" == *"tests/service_inventory.bats"* ]]
|
|
run bash "$REPO_ROOT/scripts/test-changed.sh" --list --paths scripts/service-map.py
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" == *"tests/service_inventory.bats"* ]]
|
|
}
|
|
|
|
@test "changed-test wrapper refuses an unmapped path" {
|
|
run bash "$REPO_ROOT/scripts/test-changed.sh" --list --paths newdir/file.txt
|
|
[ "$status" -eq 2 ]
|
|
[[ "$output" == *"no focused-test mapping"* ]]
|
|
}
|