test_media_service.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. from __future__ import annotations
  2. from acquisition.media.service import stabilize_media_urls
  3. def test_stabilize_media_urls_keeps_order_and_positions():
  4. calls = []
  5. def uploader(url: str, media_type: str) -> str:
  6. calls.append((url, media_type))
  7. return f"https://cdn.test/{media_type}/{len(calls)}"
  8. rows = stabilize_media_urls(
  9. image_urls=["https://src.test/a.jpg", "", "https://src.test/b.jpg"],
  10. video_urls=["https://src.test/c.mp4"],
  11. uploader=uploader,
  12. )
  13. assert [(row.media_type, row.position) for row in rows] == [
  14. ("image", 1),
  15. ("image", 2),
  16. ("video", 3),
  17. ]
  18. assert rows[0].source_url == "https://src.test/a.jpg"
  19. assert rows[0].cdn_url == "https://cdn.test/image/1"
  20. assert rows[-1].cdn_url == "https://cdn.test/video/3"
  21. assert calls == [
  22. ("https://src.test/a.jpg", "image"),
  23. ("https://src.test/b.jpg", "image"),
  24. ("https://src.test/c.mp4", "video"),
  25. ]
  26. def test_stabilize_media_urls_falls_back_to_source_on_upload_error():
  27. def uploader(url: str, media_type: str) -> str:
  28. raise RuntimeError(f"{media_type} upload failed")
  29. rows = stabilize_media_urls(
  30. image_urls=["https://src.test/a.jpg"],
  31. video_urls=["https://src.test/c.mp4"],
  32. uploader=uploader,
  33. )
  34. assert [row.cdn_url for row in rows] == [
  35. "https://src.test/a.jpg",
  36. "https://src.test/c.mp4",
  37. ]
  38. assert [row.status for row in rows] == ["ready", "ready"]
  39. def test_stabilize_video_retries_then_uses_cdn():
  40. calls = []
  41. sleeps = []
  42. def uploader(url: str, media_type: str) -> str:
  43. calls.append((url, media_type))
  44. if len(calls) < 3:
  45. raise RuntimeError("temporary oss failure")
  46. return "https://cdn.test/video.mp4"
  47. rows = stabilize_media_urls(
  48. video_urls=["https://src.test/c.mp4"],
  49. uploader=uploader,
  50. video_fallback_to_source=False,
  51. video_retry_delays_seconds=(5, 10),
  52. sleep=sleeps.append,
  53. )
  54. assert len(calls) == 3
  55. assert sleeps == [5, 10]
  56. assert rows[0].cdn_url == "https://cdn.test/video.mp4"
  57. assert rows[0].status == "ready"
  58. def test_stabilize_video_strict_mode_does_not_fallback_to_source():
  59. calls = []
  60. sleeps = []
  61. def uploader(url: str, media_type: str) -> str:
  62. calls.append((url, media_type))
  63. return url
  64. rows = stabilize_media_urls(
  65. video_urls=["https://src.test/c.mp4"],
  66. uploader=uploader,
  67. video_fallback_to_source=False,
  68. video_retry_delays_seconds=(5, 10),
  69. sleep=sleeps.append,
  70. )
  71. assert len(calls) == 3
  72. assert sleeps == [5, 10]
  73. assert rows[0].source_url == "https://src.test/c.mp4"
  74. assert rows[0].cdn_url == ""
  75. assert rows[0].status == "failed"
  76. assert rows[0].error_message == "oss_upload_returned_source_url"