#!/bin/bash # 開票側門閘的測試(docs/TESTING.md A4) # 判準:4 種該擋、8 種不該擋、1 種有戳記時放行 = 13 條 cd "$(dirname "$0")/.." || exit 1 H=hooks/ticket-api-bypass-guard.sh PASS=0; FAIL=0 run(){ # $1=want $2=cmd printf '%s' "{\"tool_name\":\"Bash\",\"tool_input\":{\"command\":$(python3 -c 'import json,sys;print(json.dumps(sys.argv[1]))' "$2")}}" \ | bash "$H" >/dev/null 2>&1 got=$? if [ "$got" = "$1" ]; then PASS=$((PASS+1)); printf ' ✅ '; else FAIL=$((FAIL+1)); printf ' ❌ '; fi printf 'want=%s got=%s %.56s\n' "$1" "$got" "$2" } SAVED=""; [ -f /tmp/.ticket-where-ok ] && SAVED=$(cat /tmp/.ticket-where-ok) rm -f /tmp/.ticket-where-ok echo "── 該擋(沒有搜尋戳記,且真的在開新票)──" run 2 'curl -X POST https://git.uncle6.me/api/v1/repos/inkstone/ISEP/issues -d @b.json' run 2 'python3 -c "req(\"POST\", f\"{API}/repos/{REPO}/issues\", {\"title\":\"x\"})"' run 2 'curl --request POST "$API/repos/inkstone/InkStoneCo/issues"' run 2 'req("POST",f"{API}/repos/{REPO}/issues",{"title":"x","labels":[1]})' echo "── 不該擋(誤攔比漏擋更該修)──" run 0 'curl -s "https://git.uncle6.me/api/v1/repos/inkstone/ISEP/issues?state=open"' run 0 'req("POST", f"{API}/repos/{REPO}/issues/14/comments", {"body":"x"})' run 0 'req("POST", f"{API}/repos/{REPO}/issues/5/labels", {"labels":[1]})' run 0 'req("PATCH", f"{API}/repos/{REPO}/issues/5", {"state":"closed"})' run 0 'scripts/ticket new ISEP -F /tmp/b.md --title "x"' run 0 'echo "等一下要開票到 /repos/x/issues"' run 0 'grep -n issues hooks/ticket-api-bypass-guard.sh' run 0 'curl -s "$API/repos/inkstone/Arcrun/issues?state=open&limit=100"' echo "── 有新鮮戳記時放行 ──" python3 -c "import json,time;json.dump({'at':time.time(),'n':0,'top':[]},open('/tmp/.ticket-where-ok','w'))" run 0 'curl -X POST https://git.uncle6.me/api/v1/repos/inkstone/ISEP/issues' rm -f /tmp/.ticket-where-ok [ -n "$SAVED" ] && printf '%s' "$SAVED" > /tmp/.ticket-where-ok echo echo "$PASS/$((PASS+FAIL)) 通過" [ "$FAIL" -eq 0 ]