| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- #!/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
|