"""Plan-based engine gating and the expanded /languages endpoint.""" import pytest from models.subscription import PlanType from routes.translate_routes import ( _allowed_providers_for_plan, _image_translation_allowed_for_plan, _plan_from_user, ) class _FakeUser: def __init__(self, plan): self.plan = plan class TestAllowedProviders: def test_free_gets_google_only(self): assert _allowed_providers_for_plan(PlanType.FREE) == {"google"} def test_starter_adds_deepl(self): assert _allowed_providers_for_plan(PlanType.STARTER) == {"google", "deepl"} def test_pro_adds_cloud_and_openrouter(self): allowed = _allowed_providers_for_plan(PlanType.PRO) assert {"google_cloud", "openrouter"} <= allowed assert "openai" not in allowed def test_business_adds_premium_and_xai(self): allowed = _allowed_providers_for_plan(PlanType.BUSINESS) assert {"openrouter_premium", "openai", "zai"} <= allowed def test_enterprise_has_all(self): enterprise = _allowed_providers_for_plan(PlanType.ENTERPRISE) assert enterprise >= _allowed_providers_for_plan(PlanType.BUSINESS) class TestImageTranslationGate: @pytest.mark.parametrize("plan", [PlanType.FREE, PlanType.STARTER]) def test_refused_below_pro(self, plan): assert _image_translation_allowed_for_plan(plan) is False @pytest.mark.parametrize("plan", [PlanType.PRO, PlanType.BUSINESS, PlanType.ENTERPRISE]) def test_allowed_from_pro(self, plan): assert _image_translation_allowed_for_plan(plan) is True class TestPlanFromUser: def test_anonymous_is_free(self): assert _plan_from_user(None) is PlanType.FREE def test_enum_plan_passthrough(self): assert _plan_from_user(_FakeUser(PlanType.PRO)) is PlanType.PRO def test_string_plan_accepted(self): assert _plan_from_user(_FakeUser("pro")) is PlanType.PRO def test_garbage_falls_back_to_free(self): assert _plan_from_user(_FakeUser("nonsense")) is PlanType.FREE class TestLanguagesEndpoint: @pytest.mark.asyncio async def test_exposes_at_least_60_languages(self): from routes.legacy_routes import get_supported_languages response = await get_supported_languages() langs = response["supported_languages"] assert response["count"] >= 60 assert len(langs) >= 60 @pytest.mark.asyncio async def test_no_auto_and_canonical_chinese(self): from routes.legacy_routes import get_supported_languages langs = (await get_supported_languages())["supported_languages"] assert "auto" not in langs assert "zh-CN" in langs and "zh-TW" in langs @pytest.mark.asyncio async def test_every_language_has_a_name(self): from routes.legacy_routes import get_supported_languages langs = (await get_supported_languages())["supported_languages"] assert all(name and name != code.upper() for code, name in langs.items())