Some checks failed
CI / test (pull_request) Has been cancelled
CI / release-exercise (pull_request) Has been cancelled
CI / self-guards (pull_request) Has been cancelled
CI / action-exercise (pull_request) Has been cancelled
CI / docs-sync-exercise (pull_request) Has been cancelled
labels / labels (pull_request) Has been cancelled
Term 1 completed. All 52 runtime gh call sites in the three reconcilers and
lib/ruling.sh now go through forge_* verbs; the three remaining matches in
labels-reconcile are prose in comments. lib/facts.sh is deliberately
untouched — it is the release door, and the ruling keeps release.yml out of
this issue.
The CEREMONY_FORGE_CLIENT:-gh wrappers die here, in the same commit as the
sites they described, so the tree is never in a state where the declaration
lies. main() now runs forge_preflight then forge_select "".
Two sites needed judgment rather than substitution:
- labels-scope's write is forge_labels_add, a genuine additive POST on
both backends, NOT forge_issue_edit --add-label. ceremony#128 turns on
that write not being a read-modify-PUT: the labeler action computed
(labels-at-job-start union derived) and PUT the whole set, silently
dropping a label applied while the job ran. Routing it through a generic
edit verb would have quietly reopened that.
- the human-review request is forge_request_reviewer. Contrary to my
earlier reading, POST /pulls/{n}/requested_reviewers DOES exist on
Forgejo — 422 naming the reviewer's access without it, 201 with it. The
earlier 404 was a GET, which the endpoint does not serve, plus a
username that did not exist.
Test churn, all of it the term-5 boundary move:
- the suites select the github backend, so their existing gh() stubs stay
the boundary and keep intercepting;
- stubs strip the paging the shim injects, so fixtures stay keyed on the
logical endpoint (inlined in the PATH stub, which is a standalone
executable and cannot see a shell function);
- fixtures renamed off the per_page suffix for the same reason;
- recorded-mutation assertions now match the verb, not the raw gh line;
- gh() stubs carry SC2317: they are reached through the backend now, so
shellcheck can no longer see the call path.
Refs #188
46 lines
1.4 KiB
Bash
46 lines
1.4 KiB
Bash
#!/usr/bin/env bash
|
|
# Sourced assertion helpers. Tests deliberately use set -u, not set -e:
|
|
# failing commands are behavior for the harness to inspect.
|
|
|
|
PASS=0
|
|
FAIL=0
|
|
|
|
# check <desc> <want_exit> <want_substr> <cmd...>
|
|
check() {
|
|
local desc="$1" want="$2" substring="$3"
|
|
shift 3
|
|
local output rc
|
|
|
|
output="$("$@" 2>&1)"
|
|
rc=$?
|
|
if [ "$rc" -ne "$want" ]; then
|
|
echo "FAIL: $desc — exit $rc, wanted $want"
|
|
printf '%s\n' "$output" | sed 's/^/ /'
|
|
FAIL=$((FAIL + 1))
|
|
return
|
|
fi
|
|
if [ -n "$substring" ] && ! printf '%s' "$output" | grep -qF -e "$substring"; then
|
|
echo "FAIL: $desc — output missing '$substring'"
|
|
printf '%s\n' "$output" | sed 's/^/ /'
|
|
FAIL=$((FAIL + 1))
|
|
return
|
|
fi
|
|
echo "ok: $desc"
|
|
PASS=$((PASS + 1))
|
|
}
|
|
|
|
summary() {
|
|
printf '%d passed, %d failed\n' "$PASS" "$FAIL"
|
|
[ "$FAIL" -eq 0 ]
|
|
}
|
|
|
|
|
|
# forge_stub_path <endpoint> — strip the paging parameters the forge shim
|
|
# injects (#188) so a fixture keyed on the logical endpoint still matches.
|
|
# The page size moved OUT of the call sites and into the backend, which means
|
|
# every stub now sees "?per_page=100" appended to a paginated read; without
|
|
# this, a fixture lookup misses and the stub answers "unreadable", which the
|
|
# production code correctly reports as a degraded read.
|
|
forge_stub_path() {
|
|
printf '%s' "$1" | sed -E 's/([?&])(per_page|limit|page)=[0-9]+/\1/g; s/[?&]+$//; s/([?&])&+/\1/g'
|
|
}
|