diff --git a/tests/conftest.py b/tests/conftest.py index cd79ec3ec5b..c732634e16a 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1270,9 +1270,11 @@ def evict_faked_translations(translations_once) -> Generator[_patch]: component_paths = components.__path__ for call in mock_component_strings.mock_calls: + _components: set[str] = call.args[2] integrations: dict[str, loader.Integration] = call.args[3] - for domain, integration in integrations.items(): - if any( + for domain in _components: + # If the integration exists, don't evict from cache + if (integration := integrations.get(domain)) and any( pathlib.Path(f"{component_path}/{domain}") == integration.file_path for component_path in component_paths ): diff --git a/tests/test_test_fixtures.py b/tests/test_test_fixtures.py index 3f1f481928a..4e319f41ce6 100644 --- a/tests/test_test_fixtures.py +++ b/tests/test_test_fixtures.py @@ -1,6 +1,6 @@ """Test test fixture configuration.""" -from collections.abc import Generator +from collections.abc import Callable, Generator from http import HTTPStatus import pathlib import socket @@ -90,17 +90,36 @@ async def test_evict_faked_translations_assumptions(hass: HomeAssistant) -> None assert integration.file_path == pathlib.Path("custom_components/test") -async def test_evict_faked_translations(hass: HomeAssistant, translations_once) -> None: - """Test the evict_faked_translations fixture.""" +@pytest.mark.parametrize( + "prepare_integration", + [ + # Fake integration backed by a module + lambda hass: mock_integration(hass, MockModule("test"), built_in=True), + # fake integration not backed by a module + lambda hass: None, + ], +) +async def test_evict_faked_translations( + hass: HomeAssistant, + translations_once, + prepare_integration: Callable[[HomeAssistant], None], +) -> None: + """Test the evict_faked_translations fixture. + + In this test, we load translations for a fake integration, then ensure that + after the fixture is torn down, only the real integration remains in the + translations cache. + """ cache: translation._TranslationsCacheData = translations_once.kwargs["return_value"] fake_domain = "test" real_domain = "homeassistant" - # Evict the real domain from the cache in case it's been loaded before - cache.loaded["en"].discard(real_domain) + if "en" in cache.loaded: + # Evict the real domain from the cache in case it's been loaded before + cache.loaded["en"].discard(real_domain) - assert fake_domain not in cache.loaded["en"] - assert real_domain not in cache.loaded["en"] + assert fake_domain not in cache.loaded["en"] + assert real_domain not in cache.loaded["en"] # The evict_faked_translations fixture has module scope, so we set it up and # tear it down manually @@ -110,7 +129,8 @@ async def test_evict_faked_translations(hass: HomeAssistant, translations_once) # Set up the evict_faked_translations fixture next(gen) - mock_integration(hass, MockModule(fake_domain), built_in=True) + # Try loading translations for mock integration + prepare_integration(hass) await translation.async_load_integrations(hass, {fake_domain, real_domain}) assert fake_domain in cache.loaded["en"] assert real_domain in cache.loaded["en"]