verify-model-change.sh 2.16 KB
#!/usr/bin/env bash
# 验证"改了模型文件 → 执行的操作定义随之改变"(针对 MetaRule 阈值)。
# 前置:后端已在 8080 运行(./start.sh 或 cd engine && mvn spring-boot:run)。
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
BASE="http://localhost:8080"
MODEL="$ROOT/models/MetaRule-business.yaml"

# 明细 1 件 × 7997 → 引擎服务端重算 totalAmount=7997(无视 master 传入值,防篡改)
ORDER='{"master":{"customerId":"C001","totalCurrency":"CNY","createTime":"2026-07-20T10:00:00"},
 "details":{"OrderItem":[{"productId":"P003","quantity":1,"itemPrice":7997,"itemCurrency":"CNY"}],
 "PaymentTerm":[{"paymentType":"现金","dueDays":0}],
 "DeliveryAddressEntity":[{"province":"广东","city":"深圳","district":"南山","streetDetail":"x","receiverName":"张三","receiverPhone":"13800001111"}]}}'

say() { printf "\n\033[1m%s\033[0m\n" "$1"; }
exec_order() { curl -s -X POST "$BASE/api/scene/SCENE_CREATE_ORDER/execute" -H 'Content-Type: application/json' -d "$ORDER"; }
field() { python3 -c "import sys,json;d=json.load(sys.stdin);print(d.get('$1'))"; }

curl -s -o /dev/null "$BASE/api/meta/models" || { echo "后端未就绪,请先启动 8080"; exit 1; }

say "A) 改动前:普通用户 C001,金额 7997 (< 50000)"
echo "$ORDER" | exec_order </dev/null >/dev/null 2>&1 || true
R=$(exec_order); echo "  success=$(echo "$R" | field success)"

say "B) 仅改模型:single_order_max_amount 50000 -> 100(无代码改动)"
perl -0pi -e 's/defaultValue: 50000/defaultValue: 100/' "$MODEL"
curl -s -X POST "$BASE/api/meta/reload" -H 'X-Principal: backend_admin' >/dev/null; echo "  已热重载"

say "C) 改动后:同一笔订单 (7997 > 100) 应被 REJECT"
R=$(exec_order)
echo "  success=$(echo "$R" | field success)  stage=$(echo "$R" | field stage)  message=$(echo "$R" | field message)"

say "D) 恢复模型 100 -> 50000 并重载"
perl -0pi -e 's/defaultValue: 100\b/defaultValue: 50000/' "$MODEL"
curl -s -X POST "$BASE/api/meta/reload" -H 'X-Principal: backend_admin' >/dev/null; echo "  已恢复"

say "结论:同一请求、仅改 YAML,结果从『通过』变为『拦截』——行为源于模型而非代码。"