#!/usr/bin/env bash # scripts/release-ship 的迴歸測試(inkstone/ISEP#67) # # 兩個方向都要有證據: # A 群「該擋」(exit 2)——前置條件沒滿足就不給建 release,且說得出是哪一個前置 # ① 版本不一致 ② Gitea 上沒那個 tag ③ 版本寫法不對 # B 群「該放行」(exit 0)——前置都在就建;release 已存在則冪等不重複建;--dry-run 不 POST # # 🔴 全程離線(RELEASE_SHIP_FIXTURE + RELEASE_SHIP_SINK),不打 Gitea、不建任何真 release。 set -u TOOL="${1:-$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/release-ship}" TMP=$(mktemp -d); trap 'rm -rf "$TMP"' EXIT PASS=0; FAIL=0; N=0 # t <期望exit> <說明> <必須出現的字串> [額外參數…] t() { want="$1"; desc="$2"; must="$3"; fx="$4"; shift 4 N=$((N+1)) rm -f "$TMP/sink.json" "$TMP/sink.json.checkfx.json" out=$(RELEASE_SHIP_FIXTURE="$TMP/$fx" RELEASE_SHIP_SINK="$TMP/sink.json" \ python3 "$TOOL" "$@" 2>&1); rc=$? ok=1 [ "$rc" -eq "$want" ] || ok=0 if [ -n "$must" ] && ! printf '%s' "$out" | grep -qF "$must"; then ok=0; fi if [ "$ok" -eq 1 ]; then printf ' ✅ %s\n' "$desc"; PASS=$((PASS+1)) else printf ' ❌ %s —— 期望 exit=%s%s,實得 exit=%s\n' "$desc" "$want" \ "${must:+ 且輸出含「$must」}" "$rc" printf '%s\n' "$out" | sed -n '1,14p' | sed 's/^/ /'; FAIL=$((FAIL+1)) fi } echo "── A 群:該擋(前置條件沒滿足)──" # A1:版本一致性沒過 cat > "$TMP/a1.json" <<'JSON' {"consistency_ok":false,"consistency_msg":"❌ plugin.json=0.21.0 但 tag=v0.22.0", "tags":["v0.22.0"],"releases":[]} JSON t 2 "版本不一致 → 擋,指名前置①" "前置①" a1.json v0.22.0 # A2:Gitea 上沒有這個 tag cat > "$TMP/a2.json" <<'JSON' {"consistency_ok":true,"tags":["v0.18.0"],"releases":["v0.18.0"]} JSON t 2 "Gitea 沒有該 tag → 擋,指名前置②+叫人先推 tag" "git push origin v0.22.0" a2.json v0.22.0 # A3:版本寫法不對 cat > "$TMP/a3.json" <<'JSON' {"consistency_ok":true,"tags":[],"releases":[]} JSON t 2 "版本寫法不對 → 擋" "版本寫法" a3.json "0.22" echo "── B 群:該放行 ──" # B1:前置都在、release 還沒建 → 建(fixture sink),然後覆核通過 cat > "$TMP/b1.json" <<'JSON' {"consistency_ok":true, "current":"0.22.0","dingban":["0.22.0","0.18.0"],"loaded":"0.22.0", "tags":["v0.22.0","v0.18.0"],"releases":["v0.18.0"]} JSON t 0 "前置齊全、release 缺 → 建起來" "已建立 release「v0.22.0」" b1.json v0.22.0 --notes-file "$TMP/b1.json" t 0 "建完回頭跑 release-check 覆核(問收貨端)" "覆核" b1.json v0.22.0 --notes-file "$TMP/b1.json" # B2:release 已存在 → 冪等,不重複建 cat > "$TMP/b2.json" <<'JSON' {"consistency_ok":true, "current":"0.18.0","dingban":["0.18.0"],"loaded":"0.18.0", "tags":["v0.18.0"],"releases":["v0.18.0"]} JSON t 0 "release 已存在 → 冪等放行、不重複建" "本來就在了" b2.json v0.18.0 --notes-file "$TMP/b2.json" # B3:--dry-run 不 POST cat > "$TMP/b3.json" <<'JSON' {"consistency_ok":true,"tags":["v0.22.0"],"releases":[]} JSON t 0 "--dry-run 全走一遍但不 POST" "不 POST" b3.json v0.22.0 --dry-run echo "" echo "──────────────────────────────" printf '共 %d 項:✅ %d / ❌ %d\n' "$N" "$PASS" "$FAIL" [ "$FAIL" -eq 0 ]