Files
Airtep/gig-poc/infrastructure/scripts/acceptance-e2e.sh
2026-04-01 14:19:25 +08:00

115 lines
4.4 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env sh
set -eu
API_BASE="${API_BASE:-http://127.0.0.1:8000}"
BOOTSTRAP_ON_RUN="${BOOTSTRAP_ON_RUN:-true}"
TMP_DIR="$(mktemp -d)"
trap 'rm -rf "$TMP_DIR"' EXIT
step() {
echo "[ACCEPTANCE] $1"
}
fail() {
echo "[ACCEPTANCE][FAIL] $1" >&2
exit 1
}
parse_json() {
PY_EXPR="$1"
INPUT_FILE="$2"
python3 - "$PY_EXPR" "$INPUT_FILE" <<'PY'
import json
import sys
expr = sys.argv[1]
path = sys.argv[2]
data = json.loads(open(path, "r", encoding="utf-8").read())
safe_builtins = {"bool": bool, "len": len, "str": str}
value = eval(expr, {"__builtins__": safe_builtins}, {"data": data})
if isinstance(value, (dict, list)):
print(json.dumps(value, ensure_ascii=False))
elif value is None:
print("")
else:
print(str(value))
PY
}
step "健康检查"
curl -fsS "${API_BASE}/health" >"$TMP_DIR/health.json" || fail "health 接口不可用"
if [ "$BOOTSTRAP_ON_RUN" = "true" ]; then
step "执行 bootstrap"
curl -fsS -X POST "${API_BASE}/poc/ingest/bootstrap" >"$TMP_DIR/bootstrap.json" || fail "bootstrap 失败"
fi
step "抽取岗位"
curl -fsS -X POST "${API_BASE}/poc/extract/job" \
-H "Content-Type: application/json" \
-d '{"text":"明天下午南山会展中心需要2个签到协助5小时150/人,女生优先"}' \
>"$TMP_DIR/extract_job.json" || fail "岗位抽取调用失败"
[ "$(parse_json "bool(data.get('success'))" "$TMP_DIR/extract_job.json")" = "True" ] || fail "岗位抽取失败"
parse_json "data.get('data')" "$TMP_DIR/extract_job.json" >"$TMP_DIR/job.json"
JOB_ID="$(parse_json "data.get('data', {}).get('job_id')" "$TMP_DIR/extract_job.json")"
[ -n "$JOB_ID" ] || fail "岗位抽取缺少 job_id"
step "岗位入库"
python3 - "$TMP_DIR/job.json" >"$TMP_DIR/ingest_job_payload.json" <<'PY'
import json
import sys
job = json.loads(open(sys.argv[1], "r", encoding="utf-8").read())
print(json.dumps({"job": job}, ensure_ascii=False))
PY
curl -fsS -X POST "${API_BASE}/poc/ingest/job" \
-H "Content-Type: application/json" \
--data @"$TMP_DIR/ingest_job_payload.json" \
>"$TMP_DIR/ingest_job.json" || fail "岗位入库失败"
step "岗位匹配工人"
curl -fsS -X POST "${API_BASE}/poc/match/workers" \
-H "Content-Type: application/json" \
-d "{\"job_id\":\"${JOB_ID}\",\"top_n\":3}" \
>"$TMP_DIR/match_workers.json" || fail "岗位匹配工人失败"
MATCH_ID_1="$(parse_json "((data.get('items') or [{}])[0]).get('match_id')" "$TMP_DIR/match_workers.json")"
[ -n "$MATCH_ID_1" ] || fail "岗位匹配工人未返回 match_id"
step "解释匹配(岗位->工人)"
curl -fsS "${API_BASE}/poc/match/explain/${MATCH_ID_1}" >"$TMP_DIR/explain_1.json" || fail "匹配解释失败(岗位->工人)"
step "抽取工人"
curl -fsS -X POST "${API_BASE}/poc/extract/worker" \
-H "Content-Type: application/json" \
-d '{"text":"我做过商场促销和活动签到,也能做登记和引导,周末都能接,福田南山都方便。"}' \
>"$TMP_DIR/extract_worker.json" || fail "工人抽取调用失败"
[ "$(parse_json "bool(data.get('success'))" "$TMP_DIR/extract_worker.json")" = "True" ] || fail "工人抽取失败"
parse_json "data.get('data')" "$TMP_DIR/extract_worker.json" >"$TMP_DIR/worker.json"
WORKER_ID="$(parse_json "data.get('data', {}).get('worker_id')" "$TMP_DIR/extract_worker.json")"
[ -n "$WORKER_ID" ] || fail "工人抽取缺少 worker_id"
step "工人入库"
python3 - "$TMP_DIR/worker.json" >"$TMP_DIR/ingest_worker_payload.json" <<'PY'
import json
import sys
worker = json.loads(open(sys.argv[1], "r", encoding="utf-8").read())
print(json.dumps({"worker": worker}, ensure_ascii=False))
PY
curl -fsS -X POST "${API_BASE}/poc/ingest/worker" \
-H "Content-Type: application/json" \
--data @"$TMP_DIR/ingest_worker_payload.json" \
>"$TMP_DIR/ingest_worker.json" || fail "工人入库失败"
step "工人匹配岗位"
curl -fsS -X POST "${API_BASE}/poc/match/jobs" \
-H "Content-Type: application/json" \
-d "{\"worker_id\":\"${WORKER_ID}\",\"top_n\":3}" \
>"$TMP_DIR/match_jobs.json" || fail "工人匹配岗位失败"
MATCH_ID_2="$(parse_json "((data.get('items') or [{}])[0]).get('match_id')" "$TMP_DIR/match_jobs.json")"
[ -n "$MATCH_ID_2" ] || fail "工人匹配岗位未返回 match_id"
step "解释匹配(工人->岗位)"
curl -fsS "${API_BASE}/poc/match/explain/${MATCH_ID_2}" >"$TMP_DIR/explain_2.json" || fail "匹配解释失败(工人->岗位)"
step "链路验收通过:抽取 -> 入库 -> 匹配 -> 解释"