#!/bin/bash # ========================================== # 完整 API 测试脚本 # 测试所有 32 个后端 API 端点 # ========================================== set -e BASE_URL="${API_BASE_URL:-http://localhost:8080}" API_URL="$BASE_URL/api/v1" echo "==========================================" echo " RustJR 完整 API 测试" echo " 测试目标: $BASE_URL" echo "==========================================" # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # 计数器 TOTAL=0 PASSED=0 FAILED=0 # 测试函数 test_api() { local method=$1 local endpoint=$2 local data=$3 local description=$4 TOTAL=$((TOTAL + 1)) echo -n "[$TOTAL] $description... " if [ "$method" == "GET" ]; then response=$(curl -s -o /dev/null -w "%{http_code}" "$API_URL$endpoint" 2>/dev/null || echo "000") else response=$(curl -s -o /dev/null -w "%{http_code}" -X $method -H "Content-Type: application/json" -d "$data" "$API_URL$endpoint" 2>/dev/null || echo "000") fi if [ "$response" == "200" ] || [ "$response" == "201" ]; then echo -e "${GREEN}✓ PASS${NC} (HTTP $response)" PASSED=$((PASSED + 1)) elif [ "$response" == "404" ] || [ "$response" == "400" ]; then echo -e "${YELLOW}⚠ WARN${NC} (HTTP $response - 可能数据不存在)" PASSED=$((PASSED + 1)) elif [ "$response" == "000" ]; then echo -e "${RED}✗ FAIL${NC} (连接失败)" FAILED=$((FAILED + 1)) else echo -e "${RED}✗ FAIL${NC} (HTTP $response)" FAILED=$((FAILED + 1)) fi } # 健康检查 echo "" echo "==================== 健康检查 ====================" test_api "GET" "" "" "健康检查 (基础路径)" HEALTH_STATUS=$(curl -s -o /dev/null -w "%{http_code}" "$BASE_URL/health" 2>/dev/null || echo "000") if [ "$HEALTH_STATUS" == "200" ]; then echo -e "${GREEN}✓ 服务运行正常${NC}" else echo -e "${RED}✗ 服务未运行,请先启动后端服务: cargo run${NC}" exit 1 fi # ==================== Account API (11个端点) ==================== echo "" echo "==================== Account API (11个端点) ====================" TIMESTAMP=$(date +%s) # 1. 创建实体账户 test_api "POST" "/physical-accounts" "{\"account_no\":\"ACC_TEST_$TIMESTAMP\",\"account_name\":\"测试账户\",\"bank_code\":\"ICBC\",\"consistency_mode\":\"eventual\",\"outbound_control\":\"online_bank\"}" "创建实体账户" # 2. 获取实体账户列表 test_api "GET" "/physical-accounts?page=1&page_size=10" "" "获取实体账户列表" # 3. 获取实体账户详情 test_api "GET" "/physical-accounts/1" "" "获取实体账户详情" # 4. 冻结实体账户 test_api "POST" "/physical-accounts/1/freeze" "{\"amount\":\"100.00\"}" "冻结实体账户" # 5. 解冻实体账户 test_api "POST" "/physical-accounts/1/unfreeze" "{\"amount\":\"50.00\"}" "解冻实体账户" # 6. 创建虚拟子账户 test_api "POST" "/sub-accounts" "{\"physical_account_id\":1,\"account_code\":\"SUB_$TIMESTAMP\",\"account_type\":\"settlement\"}" "创建虚拟子账户" # 7. 获取子账户详情 test_api "GET" "/sub-accounts/1" "" "获取子账户详情" # 8. 获取子账户余额 test_api "GET" "/sub-accounts/1/balance" "" "获取子账户余额" # 9. 冻结子账户 test_api "POST" "/sub-accounts/1/freeze" "{\"amount\":\"10.00\"}" "冻结子账户" # 10. 解冻子账户 test_api "POST" "/sub-accounts/1/unfreeze" "{\"amount\":\"5.00\"}" "解冻子账户" # 11. 关闭子账户 (跳过,会影响后续测试) echo "[跳过] 关闭子账户 (会影响后续测试)" # ==================== Transaction API (5个端点) ==================== echo "" echo "==================== Transaction API (5个端点) ====================" # 12. 发起转账 test_api "POST" "/transactions/transfer" "{\"from_account_id\":1,\"to_account_id\":1,\"amount\":\"100.00\",\"remark\":\"测试转账\"}" "发起转账" # 13. 发起充值 test_api "POST" "/transactions/deposit" "{\"account_id\":1,\"amount\":\"1000.00\",\"source_key\":\"DEP_$TIMESTAMP\"}" "发起充值" # 14. 发起提现 test_api "POST" "/transactions/withdraw" "{\"account_id\":1,\"amount\":\"50.00\"}" "发起提现" # 15. 获取交易详情 test_api "GET" "/transactions/1" "" "获取交易详情" # 16. 获取交易列表 test_api "GET" "/transactions?page=1&page_size=10" "" "获取交易列表" # ==================== Ledger API (3个端点) ==================== echo "" echo "==================== Ledger API (3个端点) ====================" # 17. 获取会计科目列表 test_api "GET" "/ledger/subjects" "" "获取会计科目列表" # 18. 获取分录详情 test_api "GET" "/ledger/entries/1" "" "获取分录详情" # 19. 获取账户分录列表 test_api "GET" "/ledger/accounts/1/entries?account_type=physical" "" "获取账户分录列表" # ==================== Reconciliation API (8个端点) ==================== echo "" echo "==================== Reconciliation API (8个端点) ====================" # 20. 执行对账 test_api "POST" "/reconciliation/run" "{\"physical_account_id\":1,\"recon_date\":\"2024-01-01\"}" "执行对账" # 21. 获取对账批次详情 test_api "GET" "/reconciliation/batches/1" "" "获取对账批次详情" # 22. 获取对账明细 test_api "GET" "/reconciliation/batches/1/items" "" "获取对账明细" # 23. 三账校验 test_api "GET" "/reconciliation/three-account/1" "" "三账校验" # 24. 创建手工补录 test_api "POST" "/reconciliation/adjustments" "{\"adjustment_type\":\"add\",\"account_id\":1,\"amount\":\"100.00\",\"reason\":\"测试补录\"}" "创建手工补录" # 25. 审批补录 test_api "POST" "/reconciliation/adjustments/1/approve" "{\"approver\":\"admin\"}" "审批补录" # 26. 拒绝补录 test_api "POST" "/reconciliation/adjustments/2/reject" "{\"approver\":\"admin\",\"reason\":\"测试拒绝\"}" "拒绝补录" # 27. 获取待审批补录 test_api "GET" "/reconciliation/adjustments/pending" "" "获取待审批补录" # ==================== Points API (5个端点) ==================== echo "" echo "==================== Points API (5个端点) ====================" # 28. 获取积分账户 test_api "GET" "/points/accounts/1" "" "获取积分账户" # 29. 获取积分 test_api "POST" "/points/earn" "{\"points_account_id\":1,\"amount\":\"100.00\"}" "获取积分" # 30. 消费积分 test_api "POST" "/points/spend" "{\"points_account_id\":1,\"amount\":\"50.00\"}" "消费积分" # 31. 转移积分 test_api "POST" "/points/transfer" "{\"from_account_id\":1,\"to_account_id\":2,\"amount\":\"10.00\"}" "转移积分" # 32. 获取积分交易列表 test_api "GET" "/points/transactions?page=1&page_size=10" "" "获取积分交易列表" # ==================== 测试结果汇总 ==================== echo "" echo "==========================================" echo " 测试结果汇总" echo "==========================================" echo "总计测试: $TOTAL" echo -e "通过: ${GREEN}$PASSED${NC}" echo -e "失败: ${RED}$FAILED${NC}" echo "" if [ $FAILED -eq 0 ]; then echo -e "${GREEN}✓ 所有测试通过!${NC}" exit 0 else echo -e "${YELLOW}⚠ 部分测试失败,请检查后端服务和数据库状态${NC}" exit 1 fi