@@ -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
655729class TestPlotsRouter :
0 commit comments