test_oss_upload.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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_invalid_response_keeps_summary():
  57. result = upload_video_from_url(
  58. "https://source.example/video.mp4",
  59. http_post=lambda *a, **k: FakeResponse(
  60. {"status": 10000, "msg": "bad", "oss_object": None}
  61. ),
  62. endpoint="http://oss.test/upload",
  63. )
  64. assert result["status"] == "failed"
  65. assert result["failure_type"] == "oss_upload_response_invalid"
  66. assert result["oss_payload_mode"] == "no_referer"
  67. assert result["oss_response_summary"] == {
  68. "status": 10000,
  69. "msg": "bad",
  70. "oss_object_present": False,
  71. "oss_object_has_cdn_url": False,
  72. }