Skip to content

Commit 995cde7

Browse files
test(seo): add success path tests for og_images router
- test_get_branded_impl_image_success: generates branded image from DB - test_get_spec_collage_success: generates collage from DB with quality sorting - test Cache-Control headers on cached responses 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent ceae15b commit 995cde7

1 file changed

Lines changed: 79 additions & 5 deletions

File tree

tests/unit/api/test_routers.py

Lines changed: 79 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -594,9 +594,7 @@ def test_get_branded_impl_image_cached(self, db_client) -> None:
594594
client, _ = db_client
595595

596596
cached_bytes = b"fake png data"
597-
with (
598-
patch("api.routers.og_images.get_cache", return_value=cached_bytes),
599-
):
597+
with patch("api.routers.og_images.get_cache", return_value=cached_bytes):
600598
response = client.get("/og/scatter-basic/matplotlib.png")
601599
assert response.status_code == 200
602600
assert response.headers["content-type"] == "image/png"
@@ -643,13 +641,89 @@ def test_get_spec_collage_cached(self, db_client) -> None:
643641
client, _ = db_client
644642

645643
cached_bytes = b"fake collage png data"
644+
with patch("api.routers.og_images.get_cache", return_value=cached_bytes):
645+
response = client.get("/og/scatter-basic.png")
646+
assert response.status_code == 200
647+
assert response.headers["content-type"] == "image/png"
648+
assert response.content == cached_bytes
649+
650+
def test_get_branded_impl_image_success(self, db_client, mock_spec) -> None:
651+
"""Should generate branded image when not cached."""
652+
client, _ = db_client
653+
654+
fake_image_bytes = b"fake source image"
655+
fake_branded_bytes = b"fake branded png"
656+
657+
mock_spec_repo = MagicMock()
658+
mock_spec_repo.get_by_id = AsyncMock(return_value=mock_spec)
659+
660+
with (
661+
patch("api.routers.og_images.get_cache", return_value=None),
662+
patch("api.routers.og_images.set_cache"),
663+
patch("api.routers.og_images.SpecRepository", return_value=mock_spec_repo),
664+
patch("api.routers.og_images._fetch_image", new_callable=AsyncMock, return_value=fake_image_bytes),
665+
patch("api.routers.og_images.create_branded_og_image", return_value=fake_branded_bytes),
666+
):
667+
response = client.get("/og/scatter-basic/matplotlib.png")
668+
assert response.status_code == 200
669+
assert response.headers["content-type"] == "image/png"
670+
assert response.headers["cache-control"] == "public, max-age=3600"
671+
assert response.content == fake_branded_bytes
672+
673+
def test_get_spec_collage_success(self, db_client) -> None:
674+
"""Should generate collage when not cached."""
675+
client, _ = db_client
676+
677+
# Create mock implementations with different quality scores
678+
mock_impls = []
679+
for i, lib in enumerate(["matplotlib", "seaborn", "plotly"]):
680+
impl = MagicMock()
681+
impl.library_id = lib
682+
impl.preview_url = f"https://example.com/{lib}.png"
683+
impl.quality_score = 90 - i * 5 # 90, 85, 80
684+
mock_impls.append(impl)
685+
686+
mock_spec = MagicMock()
687+
mock_spec.id = "scatter-basic"
688+
mock_spec.impls = mock_impls
689+
690+
mock_spec_repo = MagicMock()
691+
mock_spec_repo.get_by_id = AsyncMock(return_value=mock_spec)
692+
693+
fake_collage_bytes = b"fake collage png"
694+
646695
with (
647-
patch("api.routers.og_images.get_cache", return_value=cached_bytes),
696+
patch("api.routers.og_images.get_cache", return_value=None),
697+
patch("api.routers.og_images.set_cache"),
698+
patch("api.routers.og_images.SpecRepository", return_value=mock_spec_repo),
699+
patch("api.routers.og_images._fetch_image", new_callable=AsyncMock, return_value=b"fake image"),
700+
patch("api.routers.og_images.create_og_collage", return_value=fake_collage_bytes),
648701
):
649702
response = client.get("/og/scatter-basic.png")
650703
assert response.status_code == 200
651704
assert response.headers["content-type"] == "image/png"
652-
assert response.content == cached_bytes
705+
assert response.headers["cache-control"] == "public, max-age=3600"
706+
assert response.content == fake_collage_bytes
707+
708+
def test_get_branded_impl_image_cached_has_cache_control(self, db_client) -> None:
709+
"""Cached response should include Cache-Control header."""
710+
client, _ = db_client
711+
712+
cached_bytes = b"fake png data"
713+
with patch("api.routers.og_images.get_cache", return_value=cached_bytes):
714+
response = client.get("/og/scatter-basic/matplotlib.png")
715+
assert response.status_code == 200
716+
assert response.headers["cache-control"] == "public, max-age=3600"
717+
718+
def test_get_spec_collage_cached_has_cache_control(self, db_client) -> None:
719+
"""Cached collage response should include Cache-Control header."""
720+
client, _ = db_client
721+
722+
cached_bytes = b"fake collage png data"
723+
with patch("api.routers.og_images.get_cache", return_value=cached_bytes):
724+
response = client.get("/og/scatter-basic.png")
725+
assert response.status_code == 200
726+
assert response.headers["cache-control"] == "public, max-age=3600"
653727

654728

655729
class TestPlotsRouter:

0 commit comments

Comments
 (0)