Files
leaudit-platform-frontend/auth_doc/test_documents_comprehensive.py
2025-12-05 00:09:32 +08:00

281 lines
10 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
文档列表综合测试 - 搜索过滤 + 完整数据展示
结合 test_search_filters.py 和 test_all_documents.py 的功能
"""
import sys
import io
import requests
import json
import time
from datetime import datetime, timedelta
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
# 配置
BASE_URL = "http://localhost:8073/admin/api/v3"
ADMIN_TOKEN = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjo1LCJ1c2VybmFtZSI6ImFkbWluIiwidXNlcl9yb2xlIjoiYWRtaW4iLCJleHAiOjE3NjM1NDAwMTksImlhdCI6MTc2MzUxODQxOSwiaXNzdWVkX3RpbWUiOiIyMDI1LTExLTE5IDEwOjEzOjM5IiwiYXVkIjoiZG9jcmV2aWV3LWZyb250ZW5kIiwic3ViIjoiMDAwIiwibmlja19uYW1lIjoiYWRtaW4iLCJvdV9pZCI6IjAwMCIsIm91X25hbWUiOiJ0ZXN0IiwiaXNfbGVhZGVyIjp0cnVlfQ.Mocax00w0Os4n2WjogOk5kwE-KYkR4AfGTGA33sjgc0"
# ANSI颜色
GREEN = '\033[92m'
RED = '\033[91m'
YELLOW = '\033[93m'
BLUE = '\033[94m'
CYAN = '\033[96m'
MAGENTA = '\033[95m'
RESET = '\033[0m'
BOLD = '\033[1m'
headers = {
"Authorization": f"Bearer {ADMIN_TOKEN}",
"Content-Type": "application/json"
}
def print_header(text: str):
print(f"\n{BLUE}{BOLD}{'='*100}{RESET}")
print(f"{BLUE}{BOLD}{text:^100}{RESET}")
print(f"{BLUE}{BOLD}{'='*100}{RESET}")
def print_subheader(text: str):
print(f"\n{CYAN}{'-'*100}{RESET}")
print(f"{CYAN}{text}{RESET}")
print(f"{CYAN}{'-'*100}{RESET}")
def test_scenario(title: str, params: dict, show_full_json: bool = False, show_details: bool = True):
"""
测试场景:执行搜索并展示结果
Args:
title: 测试场景标题
params: 查询参数
show_full_json: 是否显示完整JSON
show_details: 是否显示详细信息
"""
print_header(f"📋 {title}")
# 显示查询参数
print(f"\n{CYAN}🔍 查询参数:{RESET}")
for key, value in params.items():
print(f"{key}: {value}")
# 执行请求
url = f"{BASE_URL}/versions/documents-list"
start_time = time.time()
response = requests.get(url, headers=headers, params=params)
elapsed = time.time() - start_time
# 状态码
if response.status_code == 200:
print(f"\n{GREEN}✓ 请求成功{RESET} - 状态码: {response.status_code} - 耗时: {elapsed*1000:.0f}ms")
else:
print(f"\n{RED}✗ 请求失败{RESET} - 状态码: {response.status_code}")
print(f"{RED}{response.text}{RESET}")
return
data = response.json()
documents = data.get("documents", [])
total = data.get("total", 0)
# 基本统计
print(f"\n{CYAN}📊 查询结果统计:{RESET}")
print(f" • 总文档数: {total}")
print(f" • 当前页: {data.get('page', 0)}/{data.get('total_pages', 0)}")
print(f" • 每页数量: {data.get('page_size', 0)}")
print(f" • 返回文档数: {len(documents)}")
if len(documents) == 0:
print(f"\n{YELLOW}⚠ 未找到任何文档{RESET}")
return
# 显示文档列表
print(f"\n{CYAN}📄 文档列表:{RESET}")
for idx, doc in enumerate(documents, 1):
name = doc.get('name', 'N/A')
status = doc.get('status', 'N/A')
audit = doc.get('audit_status', 'N/A')
version = doc.get('version_number', 'N/A')
total_ver = doc.get('total_versions', 'N/A')
# 审核状态颜色
audit_color = RESET
if audit == 1:
audit_color = GREEN
elif audit == 0:
audit_color = YELLOW
elif audit in [-1, -2]:
audit_color = RED
print(f" {idx}. {name}")
print(f" └─ 状态:{status} | 审核:{audit_color}{audit}{RESET} | 版本:v{version}/{total_ver}")
# 详细信息
if show_details:
print_subheader("📖 文档详细信息")
for idx, doc in enumerate(documents, 1):
print(f"\n{MAGENTA}{BOLD}▼ 文档 {idx}: {doc.get('name')}{RESET}")
# 基本信息
print(f"\n {CYAN}📄 基本信息:{RESET}")
print(f" • ID: {doc.get('id')}")
print(f" • 文件大小: {doc.get('file_size', 0):,} bytes ({doc.get('file_size', 0)/1024/1024:.2f} MB)")
print(f" • 创建时间: {doc.get('created_at')}")
print(f" • 上传时间: {doc.get('upload_time')}")
print(f" • 文档类型ID: {doc.get('type_id')}")
# 评查统计
print(f"\n {CYAN}📊 评查统计:{RESET}")
print(f" • 总评查点: {doc.get('total_evaluation_points', 0)}")
print(f"{GREEN}通过: {doc.get('pass_count', 0)}{RESET}")
print(f"{YELLOW}警告: {doc.get('warning_count', 0)}{RESET}")
print(f"{RED}错误: {doc.get('error_count', 0)}{RESET}")
print(f"{MAGENTA}需人工: {doc.get('manual_count', 0)}{RESET}")
print(f"{CYAN}问题总数: {doc.get('issue_count', 0)}{RESET}")
# 版本信息
history = doc.get('history_versions', [])
print(f"\n {CYAN}📚 版本信息:{RESET}")
print(f" • 当前版本: v{doc.get('version_number')}")
print(f" • 总版本数: {doc.get('total_versions')}")
print(f" • 历史版本数: {len(history)}")
if len(history) > 0:
for h_idx, h_ver in enumerate(history, 1):
print(f" └─ 历史 {h_idx}: v{h_ver.get('version_number')} (ID:{h_ver.get('id')})")
print(f" ├─ 创建: {h_ver.get('created_at')}")
print(f" ├─ 评查: {GREEN}{h_ver.get('pass_count', 0)}通过{RESET} / {YELLOW}{h_ver.get('warning_count', 0)}警告{RESET} / {RED}{h_ver.get('error_count', 0)}错误{RESET}")
print(f" └─ 问题: {h_ver.get('issue_count', 0)}")
# 问题消息
warning_msgs = doc.get('warning_messages', [])
error_msgs = doc.get('error_messages', [])
manual_msgs = doc.get('manual_messages', [])
if len(warning_msgs) > 0:
print(f"\n {YELLOW}⚠️ 警告消息 ({len(warning_msgs)}条):{RESET}")
for i, msg in enumerate(warning_msgs[:3], 1): # 只显示前3条
print(f" {i}. {msg}")
if len(warning_msgs) > 3:
print(f" ... 还有 {len(warning_msgs) - 3} 条警告")
if len(error_msgs) > 0:
print(f"\n {RED}❌ 错误消息 ({len(error_msgs)}条):{RESET}")
for i, msg in enumerate(error_msgs, 1):
print(f" {i}. {msg}")
if len(manual_msgs) > 0:
print(f"\n {MAGENTA}👤 人工确认消息 ({len(manual_msgs)}条):{RESET}")
for i, msg in enumerate(manual_msgs[:3], 1): # 只显示前3条
print(f" {i}. {msg}")
if len(manual_msgs) > 3:
print(f" ... 还有 {len(manual_msgs) - 3} 条消息")
# 显示完整JSON
if show_full_json:
print_subheader("📝 完整JSON响应")
print(json.dumps(data, indent=2, ensure_ascii=False))
print(f"\n{GREEN}{''*100}{RESET}")
def main():
"""主测试流程"""
print_header("🔬 文档列表API综合测试套件")
print(f"{CYAN}测试时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}{RESET}\n")
# 定义测试场景
test_scenarios = [
{
"title": "测试1: 获取所有文档",
"params": {"page": 1, "page_size": 10},
"show_details": True,
"show_full_json": False
},
{
"title": "测试2: 文档名称搜索(包含''",
"params": {"page": 1, "page_size": 10, "name": ""},
"show_details": False,
"show_full_json": False
},
{
"title": "测试3: 文件状态过滤(已完成)",
"params": {"page": 1, "page_size": 10, "status": "Processed"},
"show_details": False,
"show_full_json": False
},
{
"title": "测试4: 审核状态过滤(待审核=0",
"params": {"page": 1, "page_size": 10, "audit_status": 0},
"show_details": True,
"show_full_json": False
},
{
"title": "测试5: 审核状态过滤(通过=1",
"params": {"page": 1, "page_size": 10, "audit_status": 1},
"show_details": False,
"show_full_json": False
},
{
"title": "测试6: 时间范围(今天)",
"params": {
"page": 1,
"page_size": 10,
"start_time": datetime.now().strftime("%Y-%m-%d"),
"end_time": datetime.now().strftime("%Y-%m-%d")
},
"show_details": False,
"show_full_json": False
},
{
"title": "测试7: 时间范围(最近7天)",
"params": {
"page": 1,
"page_size": 10,
"start_time": (datetime.now() - timedelta(days=7)).strftime("%Y-%m-%d"),
"end_time": datetime.now().strftime("%Y-%m-%d")
},
"show_details": False,
"show_full_json": False
},
{
"title": "测试8: 文档类型过滤(type_id=3",
"params": {"page": 1, "page_size": 10, "type_id": 3},
"show_details": False,
"show_full_json": False
},
{
"title": "测试9: 组合过滤(名称+状态+审核)",
"params": {
"page": 1,
"page_size": 10,
"name": "pdf",
"status": "Processed",
"audit_status": 2
},
"show_details": False,
"show_full_json": False
},
{
"title": "测试10: 完整JSON输出示例",
"params": {"page": 1, "page_size": 2},
"show_details": False,
"show_full_json": True
}
]
# 执行所有测试
for scenario in test_scenarios:
test_scenario(
scenario["title"],
scenario["params"],
scenario.get("show_full_json", False),
scenario.get("show_details", True)
)
print() # 空行分隔
# 汇总
print_header("✅ 所有测试完成")
print(f"{GREEN}共执行 {len(test_scenarios)} 个测试场景{RESET}\n")
if __name__ == "__main__":
main()