Files
club-3090/scripts/tests/test-quality-baseline.sh
T
9426a03e85 Add curated quality-baseline corpus + auto-diff (#252 Phase 1) (#397)
Phase 1 (offline): the wrapper, the corpus home, and the test gate. Phase 2
(GPU) curates the actual baselines against the live RECOMMENDED_DEFAULT_MODELS
configs.

- scripts/quality-baseline.sh: thin wrapper over quality-test.sh --full that
  captures (--capture -> --save-json) or diffs (default -> --previous-result)
  an n>=3 aggregate per (registry-slug, thinking-mode). no-thinking is
  canonical (temp-0); enable-thinking is the reasoning-on companion. --dry-run
  prints the resolved command; extra args pass through to benchlocal-cli.
- scripts/quality-test.sh: forward --repeat / --previous-result and honor a
  --save-json path override, so the wrapper's blessed layout works.
- results/baselines/: committed corpus home (whitelisted in .gitignore) + a
  README documenting the convention, usage, and an empty index table.
- scripts/tests/test-quality-baseline.sh: offline gate (--dry-run) — asserts
  command/path resolution per mode + the required-slug / valid-mode /
  positive-repeat / missing-baseline guards.
- docs/QUALITY_TEST.md: regression-baseline subsection pointing at the corpus.

Co-authored-by: noonghunna <[email protected]>
Co-authored-by: Claude Opus 4.8 <[email protected]>
2026-06-13 19:11:35 +05:00

103 lines
3.7 KiB
Bash
Executable File

#!/usr/bin/env bash
# Offline test for scripts/quality-baseline.sh (#252). Uses --dry-run so it never
# needs a live endpoint or benchlocal-cli — it only asserts that the wrapper resolves
# the correct quality-test.sh command + baseline path for each mode, and that the
# guard rails (required slug, valid mode, positive --repeat, missing-baseline) fire.
set -euo pipefail
ROOT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/../.." && pwd)"
cd "$ROOT_DIR"
QB="scripts/quality-baseline.sh"
# A throwaway slug that can never collide with a real (Phase-2) baseline filename.
FAKE_SLUG="test/fake-slug-252"
FAKE_FILE="results/baselines/test-fake-slug-252__no-thinking.json"
LAST_OUT=""
# rm -f never errors on a missing file and always returns 0, so the EXIT trap
# can't poison the script's exit code (the FAKE_FILE slug is unique to this test).
cleanup() { rm -f "$FAKE_FILE"; }
trap cleanup EXIT
assert_contains() {
local haystack="$1" needle="$2"
if [[ "$haystack" != *"$needle"* ]]; then
echo "ASSERTION FAILED: expected output to contain: $needle" >&2
echo "--- output ---" >&2
echo "$haystack" >&2
exit 1
fi
}
assert_not_contains() {
local haystack="$1" needle="$2"
if [[ "$haystack" == *"$needle"* ]]; then
echo "ASSERTION FAILED: expected output NOT to contain: $needle" >&2
echo "--- output ---" >&2
echo "$haystack" >&2
exit 1
fi
}
# run the wrapper, capture combined output, assert on the exit code.
expect_rc() {
local want="$1"; shift
local rc
set +e
LAST_OUT="$("$@" 2>&1)"
rc=$?
set -e
if [[ "$rc" != "$want" ]]; then
echo "ASSERTION FAILED: expected exit $want, got $rc for: $*" >&2
echo "--- output ---" >&2
echo "$LAST_OUT" >&2
exit 1
fi
}
# 1. capture, no-thinking (default mode) — dry-run resolves the canonical command.
expect_rc 0 bash "$QB" --slug "$FAKE_SLUG" --capture --dry-run
assert_contains "$LAST_OUT" "--full --no-thinking --repeat 3"
assert_contains "$LAST_OUT" "--save-json"
assert_contains "$LAST_OUT" "$FAKE_FILE"
assert_not_contains "$LAST_OUT" "--previous-result"
# 2. capture, enable-thinking — mode flag + filename both flip.
expect_rc 0 bash "$QB" --slug "$FAKE_SLUG" --mode enable-thinking --capture --dry-run
assert_contains "$LAST_OUT" "--full --enable-thinking --repeat 3"
assert_contains "$LAST_OUT" "results/baselines/test-fake-slug-252__enable-thinking.json"
# 3. --repeat override flows into the command.
expect_rc 0 bash "$QB" --slug "$FAKE_SLUG" --capture --repeat 5 --dry-run
assert_contains "$LAST_OUT" "--repeat 5"
# 4. passthrough args land after the resolved command.
expect_rc 0 bash "$QB" --slug "$FAKE_SLUG" --capture --dry-run --sampling-from-server
assert_contains "$LAST_OUT" "--sampling-from-server"
# 5. diff mode with NO baseline on disk → hard error (exit 1), even under --dry-run.
rm -f "$FAKE_FILE"
expect_rc 1 bash "$QB" --slug "$FAKE_SLUG" --dry-run
assert_contains "$LAST_OUT" "no baseline"
# 6. diff mode with a baseline present → resolves --previous-result, not --save-json.
mkdir -p results/baselines
echo '{}' > "$FAKE_FILE"
expect_rc 0 bash "$QB" --slug "$FAKE_SLUG" --dry-run
assert_contains "$LAST_OUT" "--previous-result"
assert_contains "$LAST_OUT" "$FAKE_FILE"
assert_not_contains "$LAST_OUT" "--save-json"
rm -f "$FAKE_FILE"
# 7. missing --slug → usage error (exit 2).
expect_rc 2 bash "$QB" --capture --dry-run
assert_contains "$LAST_OUT" "--slug"
# 8. invalid --mode → usage error (exit 2).
expect_rc 2 bash "$QB" --slug "$FAKE_SLUG" --mode sideways --dry-run
assert_contains "$LAST_OUT" "--mode must be"
# 9. non-numeric --repeat → usage error (exit 2).
expect_rc 2 bash "$QB" --slug "$FAKE_SLUG" --repeat zero --dry-run
assert_contains "$LAST_OUT" "--repeat must be"
echo "test-quality-baseline: ok"