| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- #!/usr/bin/env bash
- # R2-TIMEOUT regression script — S8-REGRESSION-FIXTURE-1 重构版(dev/test only, aidopdev)。
- #
- # 演变史:
- # - 旧版基于 G01_TEST_TIMEOUT 旧 fixture(id=52)+ 强依赖 baseline=13 + G01_TEST_WATCH 兼容路径。
- # - 重构后:默认复用 demo rule 10 DEMO_ORDER_DELIVERY_TIMEOUT(CTO 拍板二.A),
- # 若 demo rule 缺失则 record_skip,不再 FAIL。
- #
- # 验证项(demo rule 10 模式):
- # 1. 双 run-once HTTP 200;
- # 2. 同一 dedup_key 下仅 1 条活动 exception;
- # 3. last_detected_at 在两次运行之间推进;
- # 4. source_payload 含 __ruleType / __sourceObjectType / __sourceObjectId 元数据;
- # 5. demo rule 10 守恒:enabled=1 / paused_until=NULL / trigger=1 / recover=1 /
- # params_json / rule_type / expression 不变(运行态字段 last_run_at/next_run_at 等允许刷新)。
- set -uo pipefail
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
- # shellcheck source=./s8-regression-common.sh
- source "${SCRIPT_DIR}/s8-regression-common.sh"
- auth_load
- RULE_CODE="${RULE_CODE:-DEMO_ORDER_DELIVERY_TIMEOUT}"
- baseline_before=$(read_baseline)
- echo "==== r2-timeout-regression RULE_CODE=${RULE_CODE} baseline_before=${baseline_before} ===="
- if ! require_demo_rule "${RULE_CODE}"; then
- record_skip "TIMEOUT fixture '${RULE_CODE}' not present or disabled — historic G01_TEST_TIMEOUT removed from dev"
- print_summary
- exit 0
- fi
- record_pass "${RULE_CODE} enabled"
- RULE_ID=$(get_rule_id_by_code "${RULE_CODE}")
- # 守恒快照(CTO 约束 五.D:结束时确认未被污染)
- snap_enabled=$(get_rule_field "${RULE_ID}" enabled)
- snap_paused=$(get_rule_field "${RULE_ID}" paused_until)
- snap_trigger=$(get_rule_field "${RULE_ID}" trigger_count_required)
- snap_recover=$(get_rule_field "${RULE_ID}" recover_count_required)
- snap_rtype=$(get_rule_field "${RULE_ID}" rule_type)
- snap_expr=$(get_rule_field "${RULE_ID}" expression)
- snap_params=$(get_rule_field "${RULE_ID}" params_json)
- resp1=$(run_once_endpoint)
- count1=$(printf '%s' "${resp1}" | python3 -c "import json,sys;print(json.load(sys.stdin).get('count',0))")
- [[ "${count1}" -ge 1 ]] && record_pass "first run-once HTTP 200, count=${count1}" || record_fail "first run-once empty (${count1})"
- before_ts=$(mysql_run "SELECT IFNULL(MAX(last_detected_at), '1970-01-01') FROM ado_s8_exception WHERE source_rule_code='${RULE_CODE}' AND status<>'CLOSED' AND is_deleted=0;")
- echo "pre-second-run last_detected_at=${before_ts}"
- sleep 1
- resp2=$(run_once_endpoint)
- count2=$(printf '%s' "${resp2}" | python3 -c "import json,sys;print(json.load(sys.stdin).get('count',0))")
- [[ "${count2}" -ge 1 ]] && record_pass "second run-once HTTP 200, count=${count2}" || record_fail "second run-once empty (${count2})"
- active_count=$(mysql_run "SELECT COUNT(*) FROM ado_s8_exception WHERE source_rule_code='${RULE_CODE}' AND status<>'CLOSED' AND is_deleted=0;")
- [[ "${active_count}" == "1" ]] && record_pass "active TIMEOUT exception count = 1 (no duplicate creation)" || record_fail "expected exactly 1 active TIMEOUT exception, got ${active_count}"
- after_ts=$(mysql_run "SELECT MAX(last_detected_at) FROM ado_s8_exception WHERE source_rule_code='${RULE_CODE}' AND status<>'CLOSED' AND is_deleted=0;")
- [[ "${after_ts}" > "${before_ts}" ]] && record_pass "last_detected_at refreshed: ${before_ts} -> ${after_ts}" || record_fail "last_detected_at did not refresh (before=${before_ts}, after=${after_ts})"
- payload=$(mysql_run "SELECT source_payload FROM ado_s8_exception WHERE source_rule_code='${RULE_CODE}' AND status<>'CLOSED' AND is_deleted=0 ORDER BY id DESC LIMIT 1;")
- metadata_ok=1
- for field in __sourceObjectId __sourceObjectType __ruleType; do
- echo "${payload}" | grep -q "${field}" || { record_fail "source_payload missing ${field}"; metadata_ok=0; }
- done
- (( metadata_ok == 1 )) && record_pass "source_payload metadata fields present (__ruleType / __sourceObjectType / __sourceObjectId)"
- # 守恒断言
- final_enabled=$(get_rule_field "${RULE_ID}" enabled)
- final_paused=$(get_rule_field "${RULE_ID}" paused_until)
- final_trigger=$(get_rule_field "${RULE_ID}" trigger_count_required)
- final_recover=$(get_rule_field "${RULE_ID}" recover_count_required)
- final_rtype=$(get_rule_field "${RULE_ID}" rule_type)
- final_expr=$(get_rule_field "${RULE_ID}" expression)
- final_params=$(get_rule_field "${RULE_ID}" params_json)
- [[ "${final_enabled}" == "${snap_enabled}" && "${final_paused}" == "${snap_paused}" \
- && "${final_trigger}" == "${snap_trigger}" && "${final_recover}" == "${snap_recover}" \
- && "${final_rtype}" == "${snap_rtype}" && "${final_expr}" == "${snap_expr}" \
- && "${final_params}" == "${snap_params}" ]] \
- && record_pass "${RULE_CODE} 守恒: enabled/paused/trigger/recover/rule_type/expression/params_json 全部不变" \
- || record_fail "${RULE_CODE} 守恒失败: 配置字段被污染"
- assert_baseline_unchanged "${baseline_before}"
- print_summary
- exit_by_summary
|