#!/bin/bash # 订单服务一键测试脚本 # 用法: bash test.sh # 内存存储 # STORAGE=sqlite bash test.sh # SQLite 存储 PASS=0 FAIL=0 SERVER_PID= PORT=8080 echo "选择存储后端:" echo " 1) memory(默认)" echo " 2) sqlite" read -p "请选择 [1/2]: " choice case "$choice" in 2|sqlite) STORAGE=sqlite ;; *) STORAGE=memory ;; esac green() { echo -e "\033[32m$1\033[0m"; } red() { echo -e "\033[31m$1\033[0m"; } cleanup() { [ -n "$SERVER_PID" ] && kill $SERVER_PID 2>/dev/null || true sleep 0.5 rm -f orders.db } trap cleanup EXIT # 先释放 8080 端口(处理上次残留) fuser -k ${PORT}/tcp >/dev/null 2>&1 || true sleep 1 echo "========================================" echo " 订 单 服 务 — 一 键 测 试" echo " 存储: $STORAGE" echo "========================================" # 启动服务 export STORAGE GIN_MODE=release go run main.go > /tmp/order_server.log 2>&1 & SERVER_PID=$! sleep 3 # 检查进程 if ! kill -0 $SERVER_PID 2>/dev/null; then red " ❌ 服务启动失败" cat /tmp/order_server.log exit 1 fi assert() { local desc="$1" exp="$2" act="$3" exp_body="$4" act_body="$5" if echo "$act_body" | grep -qF "$exp_body" && [ "$act" = "$exp" ]; then green " ✅ PASS: $desc" ((PASS++)) else red " ❌ FAIL: $desc" echo " HTTP $exp 期望, 实际 $act" echo " body 期望含: $exp_body" echo " body 实际: $act_body" ((FAIL++)) fi } echo "" echo "1. 创建订单..." RESP=$(curl -s -w "\n%{http_code}" -X POST http://localhost:$PORT/orders \ -H "Content-Type: application/json" \ -d '{"service_time":"2025-08-01T14:00:00Z","duration":120,"address":"北京朝阳"}') BODY=$(echo "$RESP" | sed '$d') CODE=$(echo "$RESP" | tail -1) ID=$(echo "$BODY" | grep -o '"id":"[^"]*"' | head -1 | cut -d'"' -f4) assert "创建订单" 201 "$CODE" '"status":"pending"' "$BODY" echo "" echo "2. 接单(首次)..." RESP=$(curl -s -w "\n%{http_code}" -X PUT "http://localhost:$PORT/orders/$ID/accept" \ -H "Content-Type: application/json" \ -d '{"provider_id":"prov_001"}') BODY=$(echo "$RESP" | sed '$d') CODE=$(echo "$RESP" | tail -1) assert "首次接单成功" 200 "$CODE" "接单成功" "$BODY" echo "" echo "3. 重复接单(应拒绝)..." RESP=$(curl -s -w "\n%{http_code}" -X PUT "http://localhost:$PORT/orders/$ID/accept" \ -H "Content-Type: application/json" \ -d '{"provider_id":"prov_002"}') BODY=$(echo "$RESP" | sed '$d') CODE=$(echo "$RESP" | tail -1) assert "重复接单被拒" 409 "$CODE" "已被其他服务者接单" "$BODY" echo "" echo "4. 取消订单..." RESP=$(curl -s -w "\n%{http_code}" -X PUT "http://localhost:$PORT/orders/$ID/cancel" \ -H "Content-Type: application/json" \ -d '{}') BODY=$(echo "$RESP" | sed '$d') CODE=$(echo "$RESP" | tail -1) assert "取消成功" 200 "$CODE" "取消成功" "$BODY" echo "" echo "5. 取消后接单(应拒绝)..." RESP=$(curl -s -w "\n%{http_code}" -X PUT "http://localhost:$PORT/orders/$ID/accept" \ -H "Content-Type: application/json" \ -d '{"provider_id":"prov_003"}') BODY=$(echo "$RESP" | sed '$d') CODE=$(echo "$RESP" | tail -1) assert "取消后接单被拒" 400 "$CODE" "已取消" "$BODY" echo "" echo "6. 重复取消(应拒绝)..." RESP=$(curl -s -w "\n%{http_code}" -X PUT "http://localhost:$PORT/orders/$ID/cancel" \ -H "Content-Type: application/json" \ -d '{}') BODY=$(echo "$RESP" | sed '$d') CODE=$(echo "$RESP" | tail -1) assert "重复取消被拒" 400 "$CODE" "已取消" "$BODY" echo "" echo "7. 订单不存在..." RESP=$(curl -s -w "\n%{http_code}" -X PUT "http://localhost:$PORT/orders/nonexistent/accept" \ -H "Content-Type: application/json" \ -d '{"provider_id":"prov_001"}') BODY=$(echo "$RESP" | sed '$d') CODE=$(echo "$RESP" | tail -1) assert "订单不存在" 404 "$CODE" "订单不存在" "$BODY" echo "" echo "========================================" if [ $FAIL -eq 0 ]; then green " 🎉 全部 $PASS 个测试通过!" else red " $PASS 通过, $FAIL 失败" fi echo "========================================" exit $FAIL