mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2026-11-08 11:46:35 +00:00
Strip every `req <NNN>`, `req-<NNN>`, `Requirement <NNN>`, `requirement-<NNN>`, and `docs/requirements/<NNN>-...md` mention from non-Markdown source files. Comments anchored to requirement numbers rot when requirements are renumbered or rewritten and conflate present-state behaviour (which the comment should describe) with the audit trail of how the code got there (which belongs in commit messages, PR descriptions, and the requirement file itself). * Document the rule in `docs/contributing/documentation.md` under "Comments". Code MUST describe the *why* in present-state language; contract enforcement lives in tests, not folklore. * Clean 254 source files across `roles/`, `tests/`, `plugins/`, `cli/`, `scripts/`, `utils/`, `group_vars/`, and the repo-root `eslint.config.js`. Pure comment / docstring / log-message edits; no behavioural change. * Add `tests/lint/repository/test_no_req_references_in_code.py` to enforce the rule going forward across `.js`, `.py`, `.yml`, `.yaml`, `.j2`, and `.sh` files. The legacy `test_no_stale_requirement_refs.py` is exempt as the only file whose purpose is to detect these very tokens. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
101 lines
3.5 KiB
Bash
Executable File
101 lines
3.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Rerun a role-local Playwright spec against the live running stack.
|
|
#
|
|
# Preconditions:
|
|
# - The role has been deployed at least once, so the Playwright project is
|
|
# staged under $TEST_E2E_PLAYWRIGHT_STAGE_BASE_DIR/<role> with a rendered
|
|
# .env file.
|
|
# - The application under test is still running.
|
|
#
|
|
# This script intentionally does NOT re-render .env and does NOT re-stage the
|
|
# project. It only overwrites tests/playwright.spec.js from the repo and
|
|
# reruns Playwright via the same container image the deploy-time runner uses.
|
|
#
|
|
# Usage:
|
|
# scripts/tests/e2e/rerun-spec.sh <role> [playwright args...] # nocheck: self-path-reference
|
|
# scripts/tests/e2e/rerun-spec.sh web-app-nextcloud --grep "talk admin" # nocheck: self-path-reference
|
|
set -euo pipefail
|
|
|
|
if [[ $# -lt 1 ]]; then
|
|
echo "usage: $0 <role> [playwright args...]" >&2
|
|
exit 2
|
|
fi
|
|
|
|
role="$1"
|
|
shift
|
|
|
|
repo_root="$(cd "$(dirname "$0")/../../.." && pwd)"
|
|
spec_src="$repo_root/roles/$role/files/playwright.spec.js"
|
|
defaults="$repo_root/roles/test-e2e-playwright/defaults/main.yml"
|
|
|
|
stage_base="${TEST_E2E_PLAYWRIGHT_STAGE_BASE_DIR:-/tmp/test-e2e-playwright}"
|
|
reports_base="${TEST_E2E_PLAYWRIGHT_REPORTS_BASE_DIR:-/var/lib/infinito/logs/test-e2e-playwright}"
|
|
|
|
stage_dir="$stage_base/$role"
|
|
reports_dir="$reports_base/$role"
|
|
env_file="$stage_dir/.env"
|
|
|
|
[[ -f "$spec_src" ]] || {
|
|
echo "missing spec: $spec_src" >&2
|
|
exit 1
|
|
}
|
|
[[ -d "$stage_dir" ]] || {
|
|
echo "missing staging dir (run deploy first): $stage_dir" >&2
|
|
exit 1
|
|
}
|
|
[[ -f "$env_file" ]] || {
|
|
echo "missing rendered env (run deploy first): $env_file" >&2
|
|
exit 1
|
|
}
|
|
|
|
image="${TEST_E2E_PLAYWRIGHT_IMAGE:-}"
|
|
if [[ -z "$image" ]]; then
|
|
base_image="$(awk '/^[[:space:]]*image:[[:space:]]/{print $2; exit}' "$defaults")"
|
|
# defaults/main.yml is the single source of truth for the image tag.
|
|
tag="$(awk -F'"' '/^[[:space:]]*version:[[:space:]]/{print $2; exit}' "$defaults")"
|
|
image="${base_image}:${tag}"
|
|
fi
|
|
|
|
command -v docker >/dev/null || {
|
|
echo "docker not found in PATH" >&2
|
|
exit 1
|
|
}
|
|
|
|
mkdir -p "$stage_dir/tests" "$stage_dir/volume" "$reports_dir"
|
|
cp "$spec_src" "$stage_dir/tests/playwright.spec.js"
|
|
# Stage the shared service-gating helper so the spec can require("./service-gating").
|
|
helper_src="$repo_root/roles/test-e2e-playwright/files/service-gating.js"
|
|
if [[ -f "$helper_src" ]]; then
|
|
cp "$helper_src" "$stage_dir/tests/service-gating.js"
|
|
fi
|
|
# Stage the shared persona-flow helpers.
|
|
# personas/ holds the persona flow runners (biber.js, admin.js, guest.js,
|
|
# index.js) at the top and every helper module under personas/utils/. Copy
|
|
# both levels so a spec can `require("./personas")` (resolves to
|
|
# personas/index.js) or directly `require("./personas/<flow>")` /
|
|
# `require("./personas/utils/<helper>")` for a subset.
|
|
personas_dir="$repo_root/roles/test-e2e-playwright/files/personas"
|
|
if [[ -d "$personas_dir" ]]; then
|
|
mkdir -p "$stage_dir/tests/personas/utils"
|
|
for persona_file in "$personas_dir"/*.js; do
|
|
[[ -f "$persona_file" ]] || continue
|
|
cp "$persona_file" "$stage_dir/tests/personas/$(basename "$persona_file")"
|
|
done
|
|
for util_file in "$personas_dir"/utils/*.js; do
|
|
[[ -f "$util_file" ]] || continue
|
|
cp "$util_file" "$stage_dir/tests/personas/utils/$(basename "$util_file")"
|
|
done
|
|
fi
|
|
|
|
cmd="${TEST_E2E_PLAYWRIGHT_COMMAND:-npm install --no-fund --no-audit && npx playwright test${*:+ $*}}"
|
|
|
|
exec docker run --rm \
|
|
--ipc=host --shm-size=1g \
|
|
--env-file "$env_file" \
|
|
-v "$stage_dir:/e2e" \
|
|
-v "$stage_dir/volume:/volume" \
|
|
-v "$reports_dir:/reports" \
|
|
-w /e2e \
|
|
"$image" \
|
|
/bin/bash -lc "$cmd"
|