test_export_api.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. """
  2. test_export_api.py - 导出并下载 .doc 文件接口测试
  3. 启动服务后运行:python test_export_api.py
  4. uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
  5. """
  6. import json
  7. import sys
  8. import urllib.error
  9. import urllib.request
  10. BASE_URL = "http://192.168.0.200:8000"
  11. PAYLOAD = {
  12. "fileName": "2026年Q2季度报告",
  13. "format": "doc",
  14. "documentId": "doc-abc123",
  15. "content": (
  16. "# 2026年Q2季度报告\n\n"
  17. "## 一、背景\n\n本季度整体营收同比增长15%。\n\n"
  18. "## 二、核心数据\n\n### 2.1 收入\n\n"
  19. "| 月份 | 收入(万元) |\n|------|------|\n| 4月 | 120 |\n| 5月 | 135 |\n\n"
  20. "### 2.2 用户增长\n\n- 新增用户:12,000\n- 月活用户:85,000\n\n"
  21. "## 三、下季度计划\n\n1. 推进产品 A 上线\n2. 扩充销售团队\n"
  22. ),
  23. }
  24. def post(url, payload):
  25. data = json.dumps(payload, ensure_ascii=False).encode("utf-8")
  26. req = urllib.request.Request(url, data=data, headers={"Content-Type": "application/json"})
  27. try:
  28. with urllib.request.urlopen(req) as r:
  29. return r.status, json.loads(r.read().decode("utf-8"))
  30. except urllib.error.HTTPError as e:
  31. return e.code, json.loads(e.read().decode("utf-8"))
  32. def get(url):
  33. # url 已经是 percent-encoded 纯 ASCII 字符串,直接发送
  34. try:
  35. with urllib.request.urlopen(url) as r:
  36. return r.status, r.read()
  37. except urllib.error.HTTPError as e:
  38. return e.code, e.read()
  39. def run():
  40. print(f"\n🚀 BASE_URL={BASE_URL}\n")
  41. # 测试 1:正常导出
  42. print("--- 测试 1:POST /api/v1/export/doc ---")
  43. status, body = post(f"{BASE_URL}/api/v1/export/doc", PAYLOAD)
  44. assert status == 200 and body["code"] == 0, f"导出失败: {body}"
  45. data = body["data"]
  46. assert "downloadUrl" in data and "fileName" in data and "expiresAt" in data
  47. print(f" downloadUrl : {data['downloadUrl']}")
  48. print(f" fileName : {data['fileName']}")
  49. print(" ✅ 通过\n")
  50. # 测试 2:下载文件
  51. print("--- 测试 2:GET 下载文件 ---")
  52. status, content = get(data["downloadUrl"])
  53. assert status == 200 and len(content) > 0, f"下载失败: status={status}"
  54. assert content[:2] == b"PK", "文件头异常,不是有效的 docx"
  55. print(f" 文件大小 : {len(content):,} bytes")
  56. print(" ✅ 通过\n")
  57. # 测试 3:缺少必填字段
  58. print("--- 测试 3:缺少必填字段 ---")
  59. status, _ = post(f"{BASE_URL}/api/v1/export/doc", {"fileName": "test", "format": "doc"})
  60. assert status == 422, f"期望 422,实际 {status}"
  61. print(" ✅ 通过\n")
  62. # 测试 4:下载不存在的文件
  63. print("--- 测试 4:下载不存在的文件 ---")
  64. status, _ = get(f"{BASE_URL}/api/v1/files/nonexistent.doc")
  65. assert status == 500, f"期望 500,实际 {status}"
  66. print(" ✅ 通过\n")
  67. print("🎉 全部测试通过!\n")
  68. if __name__ == "__main__":
  69. try:
  70. run()
  71. except AssertionError as e:
  72. print(f"\n❌ 断言失败:{e}\n")
  73. sys.exit(1)
  74. except urllib.error.URLError as e:
  75. print(f"\n❌ 连接失败:{e}\n请确认服务已启动\n")
  76. sys.exit(1)