| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- """
- 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)
|