Files
PlantAI-rag-new/tests/smoke_upstreams.sh
T
jerryandClaude Fable 5 1e94de7464 PlantAI-rag-new 首次提交:文献知识工作台
- BFF 薄适配层(FastAPI,8090):QA 代理/SSE 中继/Neo4j 直连/抽取代理/会话持久化
- Vue3 前端:五相位检索流水线、文献来源与证据链、知识图谱、提取任务四 tab
- 四档响应式(桌面/笔记本/平板/手机)、深浅主题
- 81 个 FR 全部实现,测试追溯矩阵 81/81,后端 121 测/前端 156 测
- 真实凭据已脱敏,运行时配置在 backend/.env(不入 git)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-25 20:47:52 +08:00

128 lines
5.0 KiB
Bash
Executable File
Raw 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.
#!/bin/bash
# smoke_upstreams.sh —— L2s 上游连通性冒烟(T 归属,TEST_PLAN §1/§7)。
# 只读探测远端机上四个服务的健康契约,输出 PASS/FAIL 表。不改任何状态。
# 运行处:远端 plantai-bff 机(上游只绑 127.0.0.1,须在本机执行);Mac 本地经 SSH 隧道
# 运行时用环境变量改 URL(见文末「远程探测」注释)。
# 非 CI 常驻:仅集成点(M2)与验收前手动执行一次。
#
# 环境变量覆盖:
# QA_URL QA 服务根,默认 http://127.0.0.1:7920
# EXTRACT_URL 抽取服务根,默认 http://127.0.0.1:8000
# ALT_URL 回落抽取服务根,默认 http://127.0.0.1:7900
# MOCK_URL mock server 根,默认 http://127.0.0.1:8099
# NEO4J_HTTP Neo4j HTTP 根,默认 http://127.0.0.1:18575(direct-v1-full 实例,DISCOVERY.md §1)
# NEO4J_USER / NEO4J_PASSWORD Neo4j 认证,默认 neo4j / <NEO4J_PASSWORD from backend/.env>(DISCOVERY.md §2.1)
# TIMEOUT curl 超时秒,默认 4
#
# 注意:不探测 QA /search 与 /chat/stream —— 实测单次 37~92s(DISCOVERY.md §4),
# 冒烟只验证 /health 与 /info 可达。
set -u
QA_URL="${QA_URL:-http://127.0.0.1:7920}"
EXTRACT_URL="${EXTRACT_URL:-http://127.0.0.1:8000}"
ALT_URL="${ALT_URL:-http://127.0.0.1:7900}"
MOCK_URL="${MOCK_URL:-http://127.0.0.1:8099}"
NEO4J_HTTP="${NEO4J_HTTP:-http://127.0.0.1:18575}"
TIMEOUT="${TIMEOUT:-4}"
PASS=0
FAIL=0
FAILED_LINES=()
TMP="$(mktemp)"
trap 'rm -f "$TMP"' EXIT
# check_http <名称> <URL> [预期子串]
check_http() {
local name="$1" url="$2" expect="${3:-}"
local out code
out=$(curl -s -m "$TIMEOUT" -o "$TMP" -w '%{http_code}' "$url" 2>/dev/null)
code=$?
if [ "$code" -ne 0 ]; then
printf '%-16s FAIL 连接失败(curl exit %s)\n' "$name" "$code"
FAIL=$((FAIL+1)); FAILED_LINES+=("$name")
return
fi
if [ "$out" != "200" ]; then
printf '%-16s FAIL HTTP %s\n' "$name" "$out"
FAIL=$((FAIL+1)); FAILED_LINES+=("$name")
return
fi
if [ -n "$expect" ] && ! grep -q "$expect" "$TMP"; then
printf '%-16s FAIL HTTP 200 但响应不含「%s」\n' "$name" "$expect"
FAIL=$((FAIL+1)); FAILED_LINES+=("$name")
return
fi
printf '%-16s PASS HTTP 200\n' "$name"
PASS=$((PASS+1))
}
# check_neo4j <名称> <HTTP 根>:POST db/neo4j/tx/commit 一条最小只读 Cypher。
# 契约(DISCOVERY.md §2.1):direct-v1-full 需要 Basic auth(neo4j/<NEO4J_PASSWORD from backend/.env>);
# 凭据经环境变量 NEO4J_USER/NEO4J_PASSWORD 覆盖(默认指向当选实例)。
check_neo4j() {
local name="$1" base="$2"
local user="${NEO4J_USER:-neo4j}"
local pass="${NEO4J_PASSWORD:-<NEO4J_PASSWORD from backend/.env>}"
local out code
out=$(curl -s -m "$TIMEOUT" -o "$TMP" -w '%{http_code}' \
-u "$user:$pass" \
-X POST -H 'Content-Type: application/json' \
-d '{"statements":[{"statement":"MATCH (e:SRT2CanonicalEntity) RETURN e.name LIMIT 1"}]}' \
"$base/db/neo4j/tx/commit" 2>/dev/null)
code=$?
if [ "$code" -ne 0 ]; then
printf '%-16s FAIL 连接失败(curl exit %s)\n' "$name" "$code"
FAIL=$((FAIL+1)); FAILED_LINES+=("$name")
return
fi
if [ "$out" != "200" ]; then
printf '%-16s FAIL HTTP %s(认证或实例异常,检查 NEO4J_USER/NEO4J_PASSWORD)\n' "$name" "$out"
FAIL=$((FAIL+1)); FAILED_LINES+=("$name")
return
fi
if grep -q '"errors":\[\]' "$TMP" && grep -q '"results"' "$TMP"; then
printf '%-16s PASS HTTP 200(Cypher 查询有结果)\n' "$name"
PASS=$((PASS+1))
else
printf '%-16s FAIL HTTP 200 但 Cypher 查询返回错误/空 results\n' "$name"
FAIL=$((FAIL+1)); FAILED_LINES+=("$name")
fi
}
echo "== 上游连通性冒烟(timeout ${TIMEOUT}s,$(date '+%F %T'))=="
echo
echo "-- QA (7920),契约:DISCOVERY.md §4 --"
check_http "QA health" "$QA_URL/api/v1/qa-v1-1-73/health" '"status":"ok"'
check_http "QA info" "$QA_URL/api/v1/qa-v1-1-73/info" 'version'
echo "-- 抽取 (8000),契约:DISCOVERY.md §3 --"
check_http "抽取 health" "$EXTRACT_URL/health" '"status":"healthy"'
check_http "抽取 jobs" "$EXTRACT_URL/api/v1/methodology/extract-jobs?limit=1" '"jobs"'
echo "-- 抽取回落 (7900),契约:DISCOVERY.md §3.7 --"
check_http "7900 health" "$ALT_URL/health"
echo "-- Neo4j (bolt 18788 ↔ HTTP 18575),契约:DISCOVERY.md §2 --"
check_neo4j "Neo4j 查询" "$NEO4J_HTTP"
echo "-- mock (8099),契约:ARCHITECTURE.md §6 / API.md --"
check_http "mock health" "$MOCK_URL/api/health" '"upstreams"'
echo
echo "== 汇总 =="
echo "PASS: $PASS | FAIL: $FAIL"
if [ "$FAIL" -gt 0 ]; then
echo "失败项: ${FAILED_LINES[*]}"
exit 1
fi
exit 0
# ---- 远程探测(Mac 本地运行,经 SSH 隧道)----
# 远端上游只绑 127.0.0.1,本地需先起隧道(以 QA 7920 与 Neo4j 18575 为例):
# ssh -N -L 7920:127.0.0.1:7920 -L 18575:127.0.0.1:18575 xzq@100.109.52.26
# 然后:
# QA_URL=http://127.0.0.1:7920 NEO4J_HTTP=http://127.0.0.1:18575 \
# bash tests/smoke_upstreams.sh
# 注意:隧道只解决了连通,Neo4j 数据源真实内容仍以远端为准。