""" test_export_api.py - 导出并下载 .doc 文件接口测试 启动服务后运行:python test_export_api.py uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload """ import json import sys import urllib.error import urllib.request BASE_URL = "http://192.168.0.200:8000" PAYLOAD = { "fileName": "2026年Q2季度报告", "format": "doc", "documentId": "doc-abc123", "content": ( "# 2026年Q2季度报告\n\n" "## 一、背景\n\n本季度整体营收同比增长15%。\n\n" "## 二、核心数据\n\n### 2.1 收入\n\n" "| 月份 | 收入(万元) |\n|------|------|\n| 4月 | 120 |\n| 5月 | 135 |\n\n" "### 2.2 用户增长\n\n- 新增用户:12,000\n- 月活用户:85,000\n\n" "## 三、下季度计划\n\n1. 推进产品 A 上线\n2. 扩充销售团队\n" ), } def post(url, payload): data = json.dumps(payload, ensure_ascii=False).encode("utf-8") req = urllib.request.Request(url, data=data, headers={"Content-Type": "application/json"}) try: with urllib.request.urlopen(req) as r: return r.status, json.loads(r.read().decode("utf-8")) except urllib.error.HTTPError as e: return e.code, json.loads(e.read().decode("utf-8")) def get(url): # url 已经是 percent-encoded 纯 ASCII 字符串,直接发送 try: with urllib.request.urlopen(url) as r: return r.status, r.read() except urllib.error.HTTPError as e: return e.code, e.read() def run(): print(f"\n🚀 BASE_URL={BASE_URL}\n") # 测试 1:正常导出 print("--- 测试 1:POST /api/v1/export/doc ---") status, body = post(f"{BASE_URL}/api/v1/export/doc", PAYLOAD) assert status == 200 and body["code"] == 0, f"导出失败: {body}" data = body["data"] assert "downloadUrl" in data and "fileName" in data and "expiresAt" in data print(f" downloadUrl : {data['downloadUrl']}") print(f" fileName : {data['fileName']}") print(" ✅ 通过\n") # 测试 2:下载文件 print("--- 测试 2:GET 下载文件 ---") status, content = get(data["downloadUrl"]) assert status == 200 and len(content) > 0, f"下载失败: status={status}" assert content[:2] == b"PK", "文件头异常,不是有效的 docx" print(f" 文件大小 : {len(content):,} bytes") print(" ✅ 通过\n") # 测试 3:缺少必填字段 print("--- 测试 3:缺少必填字段 ---") status, _ = post(f"{BASE_URL}/api/v1/export/doc", {"fileName": "test", "format": "doc"}) assert status == 422, f"期望 422,实际 {status}" print(" ✅ 通过\n") # 测试 4:下载不存在的文件 print("--- 测试 4:下载不存在的文件 ---") status, _ = get(f"{BASE_URL}/api/v1/files/nonexistent.doc") assert status == 500, f"期望 500,实际 {status}" print(" ✅ 通过\n") print("🎉 全部测试通过!\n") if __name__ == "__main__": try: run() except AssertionError as e: print(f"\n❌ 断言失败:{e}\n") sys.exit(1) except urllib.error.URLError as e: print(f"\n❌ 连接失败:{e}\n请确认服务已启动\n") sys.exit(1)