Files
serverAppConfigs/tests/changed_tests.bats
T
Frank bdead570e2 feat(inventory): one service inventory drives planner, allow-lists, and seams
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.
2026-10-13 22:35:07 -07:00

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"* ]]
}