#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) TEST_DIR=$(mktemp -d "${TMPDIR:-/tmp}/multica-check.XXXXXX") trap 'rm -rf "$TEST_DIR"' EXIT mkdir -p "$TEST_DIR/scripts" "$TEST_DIR/server" "$TEST_DIR/bin" # Keep the production script's fixed service logs inside the fixture too. sed "s|/tmp/multica-check-|$TEST_DIR/multica-check-|g" \ "$SCRIPT_DIR/check.sh" >"$TEST_DIR/scripts/check.sh" export CHECK_TEST_DIR="$TEST_DIR" cat >"$TEST_DIR/.env" <<'ENV' PORT=18080 FRONTEND_PORT=13000 ENV # Override process operations as well as external tools: no real service is # started, contacted, or killed, even in the ownership/cleanup cases. cat >"$TEST_DIR/scripts/local-env.sh" <<'FAKE' kill() { if [ "$1" = "$BACKEND_PID" ]; then echo backend >>"$CHECK_TEST_DIR/killed" elif [ "$1" = "$FRONTEND_PID" ]; then echo frontend >>"$CHECK_TEST_DIR/killed" else echo "unexpected PID: $1" >>"$CHECK_TEST_DIR/killed" fi return "${CLEANUP_STATUS:-0}" } wait() { return 0; } FAKE cat >"$TEST_DIR/scripts/ensure-postgres.sh" <<'FAKE' exit "${PREREQUISITE_STATUS:-0}" FAKE printf 'exit 0\n' >"$TEST_DIR/scripts/test-go.test.sh" printf 'exit 0\n' >"$TEST_DIR/scripts/test-go.sh" cat >"$TEST_DIR/bin/pnpm" <<'FAKE' #!/usr/bin/env bash printf '%s\n' "$*" >>"$CHECK_TEST_DIR/pnpm-calls" if [ "$*" = "${FAIL_PHASE:-}" ]; then exit 23 fi FAKE cat >"$TEST_DIR/bin/go" <<'FAKE' #!/usr/bin/env bash exit 0 FAKE cat >"$TEST_DIR/bin/curl" <<'FAKE' #!/usr/bin/env bash case "$*" in *18080*) service=backend ;; *13000*) service=frontend ;; *) exit 2 ;; esac # First probe sees the configured existing service; subsequent probes see the # newly started stub as ready, so tests never sleep or access the network. if [ ! -f "$CHECK_TEST_DIR/$service-probed" ]; then touch "$CHECK_TEST_DIR/$service-probed" case ":${START_SERVICES:-}:" in *":$service:"*) exit 1 ;; esac fi FAKE chmod 755 "$TEST_DIR/bin/"* fail() { echo "$label: $*" >&2 cat "$TEST_DIR/output" >&2 exit 1 } # $1: label; $2: status; $3: services expected to be stopped; rest: env overrides. run_case() { label=$1 expected_status=$2 expected_killed=$3 shift 3 rm -f "$TEST_DIR/"*-probed : >"$TEST_DIR/killed" : >"$TEST_DIR/pnpm-calls" set +e ( cd "$TEST_DIR" env -u BASH_ENV ENV_FILE=.env PATH="$TEST_DIR/bin:$PATH" \ PREREQUISITE_STATUS=0 FAIL_PHASE= START_SERVICES= CLEANUP_STATUS=0 \ "$@" bash scripts/check.sh ) >"$TEST_DIR/output" 2>&1 status=$? set -e [ "$status" -eq "$expected_status" ] || fail "status $status, want $expected_status" if [ "$expected_status" -eq 0 ]; then grep -q '^✓ All checks passed\.$' "$TEST_DIR/output" || fail "missing success footer" ! grep -q 'Checks FAILED' "$TEST_DIR/output" || fail "unexpected failure footer" else grep -q '^✗ Checks FAILED\.$' "$TEST_DIR/output" || fail "missing failure footer" ! grep -q 'All checks passed' "$TEST_DIR/output" || fail "misleading success footer" fi [ "$(cat "$TEST_DIR/killed")" = "$expected_killed" ] || fail "wrong cleanup ownership" echo "$label: PASS" } run_case 'prerequisite failure' 37 '' PREREQUISITE_STATUS=37 [ ! -s "$TEST_DIR/pnpm-calls" ] || fail 'continued after prerequisite failure' run_case 'guarded typecheck failure' 1 '' FAIL_PHASE=typecheck run_case 'success with existing services' 0 '' grep -q '^exec playwright test$' "$TEST_DIR/pnpm-calls" || fail 'did not reach E2E' run_case 'success with owned services' 0 'backend frontend' START_SERVICES=backend:frontend run_case 'E2E failure with owned backend' 1 backend START_SERVICES=backend FAIL_PHASE='exec playwright test' run_case 'E2E failure with owned frontend' 1 frontend START_SERVICES=frontend FAIL_PHASE='exec playwright test' run_case 'cleanup failure preserves failed checks' 1 'backend frontend' START_SERVICES=backend:frontend FAIL_PHASE='exec playwright test' CLEANUP_STATUS=1 echo 'check.test.sh: PASS'