fix: 部署测试SQL工具bug-硬编码user_id=1/无清理trap/迁移文件未引号
This commit is contained in:
63
lib/test.sh
63
lib/test.sh
@@ -5,7 +5,27 @@
|
||||
# 用于所有测试函数的基础 URL(在 run_tests 中设置)
|
||||
BASE_URL="http://127.0.0.1"
|
||||
|
||||
# 测试失败自动回滚
|
||||
# 测试用户管理
|
||||
TEST_USER_ID=""
|
||||
|
||||
setup_test_user() {
|
||||
TEST_USER_ID=$(remote "docker exec ${DB_CONTAINER} psql -U ${DB_USER} -d ${DB_NAME} -tAc \"
|
||||
INSERT INTO users (openid, name, type) VALUES ('test_\$(date +%s)', 'test_user', 2)
|
||||
RETURNING id;
|
||||
\"" 2>/dev/null | tr -d ' ' || echo "")
|
||||
[ -z "$TEST_USER_ID" ] && { log_error "创建测试用户失败"; return 1; }
|
||||
log_info " 测试用户 ID: ${TEST_USER_ID}"
|
||||
}
|
||||
|
||||
cleanup_test_user() {
|
||||
if [ -n "$TEST_USER_ID" ]; then
|
||||
remote "docker exec ${DB_CONTAINER} psql -U ${DB_USER} -d ${DB_NAME} -c \"
|
||||
DELETE FROM payment_orders WHERE user_id = ${TEST_USER_ID};
|
||||
DELETE FROM users WHERE id = ${TEST_USER_ID};
|
||||
\"" 2>/dev/null || true
|
||||
TEST_USER_ID=""
|
||||
fi
|
||||
}
|
||||
rollback_and_exit() {
|
||||
local reason="$1"
|
||||
log_error "测试失败: ${reason}"
|
||||
@@ -166,6 +186,16 @@ test_migration_status() {
|
||||
test_payment_flow() {
|
||||
log_info "开始支付链路测试..."
|
||||
|
||||
# 清理 trap:测试失败时清理
|
||||
local test_cleanup_done=false
|
||||
cleanup_payment_test() {
|
||||
if [ "$test_cleanup_done" = false ]; then
|
||||
cleanup_test_user
|
||||
test_cleanup_done=true
|
||||
fi
|
||||
}
|
||||
trap cleanup_payment_test EXIT
|
||||
|
||||
# 阶段 1:检查订单到期时间计算与套餐天数是否一致
|
||||
# 通过 SQL 直接创建测试订单(避免 JWT 依赖),验证 order.expires_at 间隔
|
||||
local uuid_prefix
|
||||
@@ -181,7 +211,7 @@ test_payment_flow() {
|
||||
|
||||
# 创建测试订单
|
||||
local sql="INSERT INTO payment_orders (user_id, order_no, package_type, amount, status, expires_at)
|
||||
VALUES (1, '${test_no}', '${pkg_type}', 100, 'pending', NOW() + INTERVAL '${expected_days} days');"
|
||||
VALUES (${TEST_USER_ID}, '${test_no}', '${pkg_type}', 100, 'pending', NOW() + INTERVAL '${expected_days} days');"
|
||||
remote "docker exec ${DB_CONTAINER} psql -U ${DB_USER} -d ${DB_NAME} -c \"${sql}\"" 2>/dev/null || true
|
||||
|
||||
# 验证到期时间间隔
|
||||
@@ -239,7 +269,7 @@ test_payment_flow() {
|
||||
local member_expires
|
||||
member_expires=$(remote "docker exec ${DB_CONTAINER} psql -U ${DB_USER} -d ${DB_NAME} -tAc \"
|
||||
SELECT EXTRACT(DAY FROM (membership_expires_at - NOW()))::int
|
||||
FROM users WHERE id = 1;
|
||||
FROM users WHERE id = ${TEST_USER_ID};
|
||||
\"" 2>/dev/null || echo "0")
|
||||
|
||||
if [ "$member_expires" -ge 25 ]; then
|
||||
@@ -250,7 +280,7 @@ test_payment_flow() {
|
||||
fi
|
||||
|
||||
# 6. 清理:取消会员
|
||||
local clean="UPDATE users SET is_member = false, membership_expires_at = NULL WHERE id = 1;"
|
||||
local clean="UPDATE users SET is_member = false, membership_expires_at = NULL WHERE id = ${TEST_USER_ID};"
|
||||
remote "docker exec ${DB_CONTAINER} psql -U ${DB_USER} -d ${DB_NAME} -c \"${clean}\"" 2>/dev/null || true
|
||||
local cancel="UPDATE payment_orders SET status = 'cancelled' WHERE order_no = '${order_no}' AND status = 'paid';"
|
||||
remote "docker exec ${DB_CONTAINER} psql -U ${DB_USER} -d ${DB_NAME} -c \"${cancel}\"" 2>/dev/null || true
|
||||
@@ -285,7 +315,7 @@ test_payment_dedup() {
|
||||
uuid_prefix="dedup-test-$(date +%s)"
|
||||
local test_no1="${uuid_prefix}-1"
|
||||
local test_no2="${uuid_prefix}-2"
|
||||
local user_id=1
|
||||
local user_id=${TEST_USER_ID}
|
||||
|
||||
# 清理可能残留的测试数据
|
||||
remote "docker exec ${DB_CONTAINER} psql -U ${DB_USER} -d ${DB_NAME} -c \"DELETE FROM payment_orders WHERE order_no LIKE '${uuid_prefix}%';\"" 2>/dev/null || true
|
||||
@@ -367,11 +397,11 @@ test_payment_refund() {
|
||||
|
||||
# 创建已支付订单(模拟一个月会员)
|
||||
local sql_create="INSERT INTO payment_orders (user_id, order_no, package_type, amount, status, paid_at, expires_at)
|
||||
VALUES (1, '${test_no}', 'monthly', 590, 'paid', NOW(), NOW() + INTERVAL '30 days');"
|
||||
VALUES (${TEST_USER_ID}, '${test_no}', 'monthly', 590, 'paid', NOW(), NOW() + INTERVAL '30 days');"
|
||||
remote "docker exec ${DB_CONTAINER} psql -U ${DB_USER} -d ${DB_NAME} -c \"${sql_create}\"" 2>/dev/null || true
|
||||
|
||||
# 设置用户为会员
|
||||
local sql_member="UPDATE users SET is_member = true, membership_expires_at = NOW() + INTERVAL '30 days' WHERE id = 1;"
|
||||
local sql_member="UPDATE users SET is_member = true, membership_expires_at = NOW() + INTERVAL '30 days' WHERE id = ${TEST_USER_ID};"
|
||||
remote "docker exec ${DB_CONTAINER} psql -U ${DB_USER} -d ${DB_NAME} -c \"${sql_member}\"" 2>/dev/null || true
|
||||
|
||||
# 执行退款(直接调用 db 函数等价操作)
|
||||
@@ -379,7 +409,7 @@ test_payment_refund() {
|
||||
remote "docker exec ${DB_CONTAINER} psql -U ${DB_USER} -d ${DB_NAME} -c \"${sql_refund}\"" 2>/dev/null || true
|
||||
|
||||
# 清理:取消会员 + 删除测试订单
|
||||
local clean_member="UPDATE users SET is_member = false, membership_expires_at = NULL WHERE id = 1;"
|
||||
local clean_member="UPDATE users SET is_member = false, membership_expires_at = NULL WHERE id = ${TEST_USER_ID};"
|
||||
remote "docker exec ${DB_CONTAINER} psql -U ${DB_USER} -d ${DB_NAME} -c \"${clean_member}\"" 2>/dev/null || true
|
||||
remote "docker exec ${DB_CONTAINER} psql -U ${DB_USER} -d ${DB_NAME} -c \"DELETE FROM payment_orders WHERE order_no = '${test_no}';\"" 2>/dev/null || true
|
||||
|
||||
@@ -398,11 +428,11 @@ test_payment_verify_detection() {
|
||||
|
||||
# 构造一个 expiry = paid_at + 1 天的异常订单(模拟 ELSE INTERVAL '0 days')
|
||||
local sql_create="INSERT INTO payment_orders (user_id, order_no, package_type, amount, status, paid_at, expires_at)
|
||||
VALUES (1, '${test_no}', 'half_year', 3190, 'paid', NOW(), NOW() + INTERVAL '1 day');"
|
||||
VALUES (${TEST_USER_ID}, '${test_no}', 'half_year', 3190, 'paid', NOW(), NOW() + INTERVAL '1 day');"
|
||||
remote "docker exec ${DB_CONTAINER} psql -U ${DB_USER} -d ${DB_NAME} -c \"${sql_create}\"" 2>/dev/null || true
|
||||
|
||||
# 设置会员为 paid_at + 1 天(模拟 0 天会员时长)
|
||||
local sql_member="UPDATE users SET is_member = true, membership_expires_at = NOW() + INTERVAL '1 day' WHERE id = 1;"
|
||||
local sql_member="UPDATE users SET is_member = true, membership_expires_at = NOW() + INTERVAL '1 day' WHERE id = ${TEST_USER_ID};"
|
||||
remote "docker exec ${DB_CONTAINER} psql -U ${DB_USER} -d ${DB_NAME} -c \"${sql_member}\"" 2>/dev/null || true
|
||||
|
||||
# 验证 actual_days < 25 能被检测到
|
||||
@@ -415,7 +445,7 @@ test_payment_verify_detection() {
|
||||
actual_days=${actual_days%.*}
|
||||
|
||||
# 清理
|
||||
local clean="UPDATE users SET is_member = false, membership_expires_at = NULL WHERE id = 1;"
|
||||
local clean="UPDATE users SET is_member = false, membership_expires_at = NULL WHERE id = ${TEST_USER_ID};"
|
||||
remote "docker exec ${DB_CONTAINER} psql -U ${DB_USER} -d ${DB_NAME} -c \"${clean}\"" 2>/dev/null || true
|
||||
remote "docker exec ${DB_CONTAINER} psql -U ${DB_USER} -d ${DB_NAME} -c \"DELETE FROM payment_orders WHERE order_no = '${test_no}';\"" 2>/dev/null || true
|
||||
|
||||
@@ -452,11 +482,22 @@ run_tests() {
|
||||
"test_payment_verify_detection:验证函数检测逻辑"
|
||||
)
|
||||
local i=1 total=${#tests[@]}
|
||||
|
||||
# 设置测试用户(用于支付类测试)
|
||||
if ! setup_test_user; then
|
||||
log_warn "创建测试用户失败,支付类测试将使用 user_id=1"
|
||||
TEST_USER_ID=1
|
||||
fi
|
||||
|
||||
for entry in "${tests[@]}"; do
|
||||
IFS=':' read -r fn name <<< "$entry"
|
||||
log_step "测试 ${i}/${total}: ${name}..."
|
||||
$fn || rollback_and_exit "${name} 测试失败"
|
||||
i=$((i+1))
|
||||
done
|
||||
|
||||
# 清理测试用户
|
||||
cleanup_test_user
|
||||
|
||||
log_info "========== 全部 ${total} 项测试通过 =========="
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user