Browse Source

test: 添加文件上传接口测试脚本

- 支持测试 /api/v1/parse/upload 文件上传接口
- 支持查询解析状态
- 支持轮询解析进度直到完成
- 自动检测服务可用性
何文松 1 month ago
parent
commit
a54573c9ff
1 changed files with 306 additions and 0 deletions
  1. 306 0
      test/test_upload_api.sh

+ 306 - 0
test/test_upload_api.sh

@@ -0,0 +1,306 @@
+#!/bin/bash
+
+# ============================================
+# 文件上传接口测试脚本
+# ============================================
+# 使用方法: ./test_upload_api.sh [host] [port]
+# 示例: ./test_upload_api.sh localhost 8003
+# ============================================
+
+# 配置参数
+HOST=${1:-localhost}
+PORT=${2:-8003}
+BASE_URL="http://${HOST}:${PORT}"
+UPLOAD_URL="${BASE_URL}/api/v1/parse/upload"
+STATUS_URL="${BASE_URL}/parse/status"
+
+# 测试文件路径(相对于脚本所在目录)
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+TEST_FILE="${SCRIPT_DIR}/test.docx"
+
+# 测试用户ID
+USER_ID="test-user-$(date +%s)"
+
+# 颜色定义
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+YELLOW='\033[1;33m'
+BLUE='\033[0;34m'
+NC='\033[0m' # No Color
+
+# 输出函数
+print_header() {
+    echo -e "\n${BLUE}============================================${NC}"
+    echo -e "${BLUE}$1${NC}"
+    echo -e "${BLUE}============================================${NC}"
+}
+
+print_success() {
+    echo -e "${GREEN}✓ $1${NC}"
+}
+
+print_error() {
+    echo -e "${RED}✗ $1${NC}"
+}
+
+print_info() {
+    echo -e "${YELLOW}➤ $1${NC}"
+}
+
+# 检查依赖
+check_dependencies() {
+    print_header "检查依赖"
+    
+    if ! command -v curl &> /dev/null; then
+        print_error "curl 未安装"
+        exit 1
+    fi
+    print_success "curl 已安装"
+    
+    if ! command -v jq &> /dev/null; then
+        print_info "jq 未安装,JSON格式化将不可用"
+        JQ_AVAILABLE=false
+    else
+        print_success "jq 已安装"
+        JQ_AVAILABLE=true
+    fi
+}
+
+# 检查测试文件
+check_test_file() {
+    print_header "检查测试文件"
+    
+    if [ ! -f "$TEST_FILE" ]; then
+        print_error "测试文件不存在: $TEST_FILE"
+        exit 1
+    fi
+    
+    FILE_SIZE=$(stat -c%s "$TEST_FILE" 2>/dev/null || stat -f%z "$TEST_FILE" 2>/dev/null)
+    print_success "测试文件存在: $TEST_FILE"
+    print_info "文件大小: $FILE_SIZE bytes"
+}
+
+# 检查服务是否可用
+check_service() {
+    print_header "检查服务状态"
+    
+    print_info "测试服务: $BASE_URL"
+    
+    HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 5 "${BASE_URL}/actuator/health" 2>/dev/null)
+    
+    if [ "$HTTP_CODE" = "200" ]; then
+        print_success "服务正常运行 (HTTP $HTTP_CODE)"
+    elif [ "$HTTP_CODE" = "000" ]; then
+        print_error "无法连接到服务 $BASE_URL"
+        print_info "请确保 parse-service 正在运行"
+        exit 1
+    else
+        print_info "健康检查返回 HTTP $HTTP_CODE,继续测试..."
+    fi
+}
+
+# 测试文件上传
+test_upload() {
+    print_header "测试文件上传接口"
+    
+    print_info "上传URL: $UPLOAD_URL"
+    print_info "用户ID: $USER_ID"
+    print_info "文件: $TEST_FILE"
+    
+    echo -e "\n发送请求..."
+    
+    RESPONSE=$(curl -s -w "\n%{http_code}" \
+        -X POST "$UPLOAD_URL" \
+        -H "Content-Type: multipart/form-data" \
+        -F "file=@${TEST_FILE}" \
+        -F "userId=${USER_ID}" \
+        --connect-timeout 10 \
+        --max-time 300)
+    
+    HTTP_CODE=$(echo "$RESPONSE" | tail -n1)
+    BODY=$(echo "$RESPONSE" | sed '$d')
+    
+    echo -e "\n${YELLOW}响应状态码:${NC} $HTTP_CODE"
+    echo -e "${YELLOW}响应内容:${NC}"
+    
+    if [ "$JQ_AVAILABLE" = true ]; then
+        echo "$BODY" | jq . 2>/dev/null || echo "$BODY"
+    else
+        echo "$BODY"
+    fi
+    
+    # 解析响应
+    if [ "$HTTP_CODE" = "200" ]; then
+        print_success "文件上传成功!"
+        
+        # 提取documentId用于后续状态查询
+        if [ "$JQ_AVAILABLE" = true ]; then
+            DOCUMENT_ID=$(echo "$BODY" | jq -r '.data.documentId // .documentId // empty' 2>/dev/null)
+            if [ -n "$DOCUMENT_ID" ] && [ "$DOCUMENT_ID" != "null" ]; then
+                print_info "文档ID: $DOCUMENT_ID"
+                echo "$DOCUMENT_ID" > "${SCRIPT_DIR}/.last_document_id"
+                
+                # 查询解析状态
+                test_parse_status "$DOCUMENT_ID"
+            fi
+        fi
+    else
+        print_error "文件上传失败 (HTTP $HTTP_CODE)"
+    fi
+}
+
+# 测试解析状态查询
+test_parse_status() {
+    local DOC_ID=$1
+    
+    print_header "查询解析状态"
+    
+    print_info "文档ID: $DOC_ID"
+    print_info "状态URL: ${STATUS_URL}/${DOC_ID}"
+    
+    # 等待一会儿让解析任务开始
+    sleep 2
+    
+    RESPONSE=$(curl -s -w "\n%{http_code}" \
+        -X GET "${STATUS_URL}/${DOC_ID}" \
+        --connect-timeout 10)
+    
+    HTTP_CODE=$(echo "$RESPONSE" | tail -n1)
+    BODY=$(echo "$RESPONSE" | sed '$d')
+    
+    echo -e "\n${YELLOW}响应状态码:${NC} $HTTP_CODE"
+    echo -e "${YELLOW}响应内容:${NC}"
+    
+    if [ "$JQ_AVAILABLE" = true ]; then
+        echo "$BODY" | jq . 2>/dev/null || echo "$BODY"
+    else
+        echo "$BODY"
+    fi
+    
+    if [ "$HTTP_CODE" = "200" ]; then
+        print_success "状态查询成功!"
+    else
+        print_error "状态查询失败 (HTTP $HTTP_CODE)"
+    fi
+}
+
+# 轮询解析状态直到完成
+poll_parse_status() {
+    local DOC_ID=$1
+    local MAX_ATTEMPTS=${2:-30}
+    local INTERVAL=${3:-5}
+    
+    print_header "轮询解析状态 (最多${MAX_ATTEMPTS}次, 间隔${INTERVAL}秒)"
+    
+    for ((i=1; i<=MAX_ATTEMPTS; i++)); do
+        print_info "第 $i 次查询..."
+        
+        RESPONSE=$(curl -s "${STATUS_URL}/${DOC_ID}" --connect-timeout 10)
+        
+        if [ "$JQ_AVAILABLE" = true ]; then
+            STATUS=$(echo "$RESPONSE" | jq -r '.data.parseStatus // .parseStatus // empty' 2>/dev/null)
+            echo "当前状态: $STATUS"
+            
+            if [ "$STATUS" = "2" ] || [ "$STATUS" = "COMPLETED" ]; then
+                print_success "解析完成!"
+                echo "$RESPONSE" | jq .
+                return 0
+            elif [ "$STATUS" = "3" ] || [ "$STATUS" = "FAILED" ]; then
+                print_error "解析失败!"
+                echo "$RESPONSE" | jq .
+                return 1
+            fi
+        else
+            echo "$RESPONSE"
+        fi
+        
+        sleep $INTERVAL
+    done
+    
+    print_error "轮询超时"
+    return 1
+}
+
+# 显示使用帮助
+show_help() {
+    echo "使用方法: $0 [选项] [host] [port]"
+    echo ""
+    echo "选项:"
+    echo "  -h, --help      显示帮助信息"
+    echo "  -p, --poll      上传后轮询解析状态直到完成"
+    echo "  -s, --status    仅查询上次上传的文档状态"
+    echo ""
+    echo "示例:"
+    echo "  $0                      # 使用默认配置 (localhost:8003)"
+    echo "  $0 192.168.1.100 8003   # 指定服务器地址"
+    echo "  $0 -p                   # 上传并轮询状态"
+    echo "  $0 -s                   # 查询上次上传的状态"
+}
+
+# 主函数
+main() {
+    local POLL_STATUS=false
+    local STATUS_ONLY=false
+    
+    # 解析参数
+    while [[ $# -gt 0 ]]; do
+        case $1 in
+            -h|--help)
+                show_help
+                exit 0
+                ;;
+            -p|--poll)
+                POLL_STATUS=true
+                shift
+                ;;
+            -s|--status)
+                STATUS_ONLY=true
+                shift
+                ;;
+            *)
+                if [[ -z "$HOST_ARG" ]]; then
+                    HOST=$1
+                elif [[ -z "$PORT_ARG" ]]; then
+                    PORT=$1
+                fi
+                shift
+                ;;
+        esac
+    done
+    
+    # 更新URL
+    BASE_URL="http://${HOST}:${PORT}"
+    UPLOAD_URL="${BASE_URL}/api/v1/parse/upload"
+    STATUS_URL="${BASE_URL}/parse/status"
+    
+    print_header "文件上传接口测试"
+    echo "目标服务: $BASE_URL"
+    echo "时间: $(date '+%Y-%m-%d %H:%M:%S')"
+    
+    check_dependencies
+    
+    if [ "$STATUS_ONLY" = true ]; then
+        if [ -f "${SCRIPT_DIR}/.last_document_id" ]; then
+            DOCUMENT_ID=$(cat "${SCRIPT_DIR}/.last_document_id")
+            test_parse_status "$DOCUMENT_ID"
+        else
+            print_error "未找到上次上传的文档ID"
+            exit 1
+        fi
+        exit 0
+    fi
+    
+    check_test_file
+    check_service
+    test_upload
+    
+    if [ "$POLL_STATUS" = true ] && [ -f "${SCRIPT_DIR}/.last_document_id" ]; then
+        DOCUMENT_ID=$(cat "${SCRIPT_DIR}/.last_document_id")
+        poll_parse_status "$DOCUMENT_ID"
+    fi
+    
+    print_header "测试完成"
+}
+
+# 运行主函数
+main "$@"