test_oss_upload.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. from __future__ import annotations
  2. import httpx
  3. from content_agent.integrations.oss_upload import upload_video_from_url
  4. class FakeResponse:
  5. def __init__(self, body, *, status_code=200):
  6. self._body = body
  7. self.status_code = status_code
  8. self.request = httpx.Request("POST", "http://oss.test/upload")
  9. def raise_for_status(self):
  10. if self.status_code >= 400:
  11. response = httpx.Response(self.status_code, request=self.request)
  12. raise httpx.HTTPStatusError("bad", request=self.request, response=response)
  13. def json(self):
  14. return self._body
  15. def test_upload_video_from_url_parses_oss_object():
  16. seen = {}
  17. def post(*args, **kwargs):
  18. seen.update({"args": args, **kwargs})
  19. return FakeResponse(
  20. {
  21. "status": 0,
  22. "msg": "ok",
  23. "oss_object": {
  24. "cdn_url": "https://res.example/video.mp4",
  25. "oss_object_key": "crawler/video/a.mp4",
  26. "save_oss_timestamp": 123,
  27. },
  28. }
  29. )
  30. result = upload_video_from_url(
  31. "https://source.example/video.mp4",
  32. project="content-agent",
  33. referer={"Referer": "https://www.douyin.com/"},
  34. http_post=post,
  35. endpoint="http://oss.test/upload",
  36. )
  37. assert result["status"] == "ok"
  38. assert result["oss_url"] == "https://res.example/video.mp4"
  39. assert result["oss_object_key"] == "crawler/video/a.mp4"
  40. assert seen["json"]["src_type"] == "video"
  41. assert seen["json"]["use_proxy"] is True
  42. assert seen["json"]["project"] == "content-agent"
  43. assert "referer" not in seen["json"]
  44. assert result["oss_payload_mode"] == "no_referer"
  45. def test_upload_video_from_url_failure_is_returned_not_raised():
  46. result = upload_video_from_url(
  47. "https://source.example/video.mp4",
  48. http_post=lambda *a, **k: FakeResponse({}, status_code=500),
  49. endpoint="http://oss.test/upload",
  50. )
  51. assert result["status"] == "failed"
  52. assert result["failure_type"] == "oss_upload_http_error"
  53. assert result["http_status_code"] == 500
  54. assert result["error_message"] == "bad"
  55. assert result["oss_payload_mode"] == "no_referer"
  56. def test_upload_video_from_url_read_timeout_keeps_diagnostics():
  57. def post(*args, **kwargs):
  58. raise httpx.ReadTimeout("slow")
  59. result = upload_video_from_url(
  60. "https://source.example/video.mp4",
  61. http_post=post,
  62. endpoint="http://oss.test/upload",
  63. timeout_seconds=123,
  64. )
  65. assert result["status"] == "failed"
  66. assert result["failure_type"] == "oss_upload_http_error"
  67. assert result["exception_type"] == "ReadTimeout"
  68. assert result["response_absent"] is True
  69. assert result["endpoint_host"] == "oss.test"
  70. assert result["read_timeout_seconds"] == 300.0
  71. assert result["attempt_timeout_seconds"] == 123
  72. def test_upload_video_from_url_invalid_response_keeps_summary():
  73. result = upload_video_from_url(
  74. "https://source.example/video.mp4",
  75. http_post=lambda *a, **k: FakeResponse(
  76. {"status": 10000, "msg": "bad", "oss_object": None}
  77. ),
  78. endpoint="http://oss.test/upload",
  79. )
  80. assert result["status"] == "failed"
  81. assert result["failure_type"] == "oss_upload_response_invalid"
  82. assert result["oss_payload_mode"] == "no_referer"
  83. assert result["oss_response_summary"] == {
  84. "status": 10000,
  85. "msg": "bad",
  86. "oss_object_present": False,
  87. "oss_object_has_cdn_url": False,
  88. }