from unittest import mock from starlette.testclient import TestClient from email_campaigns.fonts.services.google_fonts import GoogleFont _FONT = GoogleFont( name="Roboto", fallback_font="Arial", generic_font_family="sans-serif", css_font_family="'Roboto', Arial, sans-serif", url="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,700;1,400;1,700&display=swap", ) def test_get_google_fonts_returns_font_list( client: TestClient, google_fonts_cache_mock: mock.MagicMock, ) -> None: google_fonts_cache_mock.search.return_value = [_FONT] response = client.get("/fonts/google") assert response.status_code == 200 assert response.json() == [ { "name": "Roboto", "fallbackFont": "Arial", "genericFontFamily": "sans-serif", "cssFontFamily": "'Roboto', Arial, sans-serif", "url": _FONT.url, } ] def test_get_google_fonts_passes_search_and_limit_to_cache( client: TestClient, google_fonts_cache_mock: mock.MagicMock, ) -> None: response = client.get("/fonts/google", params={"search": "robot", "limit": 5}) assert response.status_code == 200 google_fonts_cache_mock.search.assert_called_once_with("robot", 5) def test_get_google_fonts_default_limit( client: TestClient, google_fonts_cache_mock: mock.MagicMock, ) -> None: client.get("/fonts/google") _, limit = google_fonts_cache_mock.search.call_args.args assert limit == 100 def test_get_google_fonts_populates_cache_on_miss( client: TestClient, google_fonts_cache_mock: mock.MagicMock, google_fonts_service_mock: mock.MagicMock, ) -> None: google_fonts_cache_mock.is_populated.return_value = False google_fonts_service_mock.get_fonts.return_value = [_FONT] client.get("/fonts/google") google_fonts_service_mock.get_fonts.assert_called_once() google_fonts_cache_mock.populate.assert_called_once_with([_FONT])