core/tests/helpers/test_translation.py

131 lines
4.4 KiB
Python

"""Test the translation helper."""
# pylint: disable=protected-access
from os import path
from unittest.mock import patch
import pytest
from homeassistant.generated import config_flows
import homeassistant.helpers.translation as translation
from homeassistant.setup import async_setup_component
from tests.common import mock_coro
@pytest.fixture
def mock_config_flows():
"""Mock the config flows."""
flows = []
with patch.object(config_flows, "FLOWS", flows):
yield flows
def test_flatten():
"""Test the flatten function."""
data = {"parent1": {"child1": "data1", "child2": "data2"}, "parent2": "data3"}
flattened = translation.flatten(data)
assert flattened == {
"parent1.child1": "data1",
"parent1.child2": "data2",
"parent2": "data3",
}
async def test_component_translation_file(hass):
"""Test the component translation file function."""
assert await async_setup_component(
hass,
"switch",
{"switch": [{"platform": "test"}, {"platform": "test_embedded"}]},
)
assert await async_setup_component(hass, "test_standalone", {"test_standalone"})
assert await async_setup_component(hass, "test_package", {"test_package"})
assert path.normpath(
await translation.component_translation_file(hass, "switch.test", "en")
) == path.normpath(
hass.config.path("custom_components", "test", ".translations", "switch.en.json")
)
assert path.normpath(
await translation.component_translation_file(hass, "switch.test_embedded", "en")
) == path.normpath(
hass.config.path(
"custom_components", "test_embedded", ".translations", "switch.en.json"
)
)
assert (
await translation.component_translation_file(hass, "test_standalone", "en")
is None
)
assert path.normpath(
await translation.component_translation_file(hass, "test_package", "en")
) == path.normpath(
hass.config.path(
"custom_components", "test_package", ".translations", "en.json"
)
)
def test_load_translations_files(hass):
"""Test the load translation files function."""
# Test one valid and one invalid file
file1 = hass.config.path(
"custom_components", "test", ".translations", "switch.en.json"
)
file2 = hass.config.path(
"custom_components", "test", ".translations", "invalid.json"
)
assert translation.load_translations_files(
{"switch.test": file1, "invalid": file2}
) == {
"switch.test": {"state": {"string1": "Value 1", "string2": "Value 2"}},
"invalid": {},
}
async def test_get_translations(hass, mock_config_flows):
"""Test the get translations helper."""
translations = await translation.async_get_translations(hass, "en")
assert translations == {}
assert await async_setup_component(hass, "switch", {"switch": {"platform": "test"}})
translations = await translation.async_get_translations(hass, "en")
assert translations["component.switch.state.string1"] == "Value 1"
assert translations["component.switch.state.string2"] == "Value 2"
translations = await translation.async_get_translations(hass, "de")
assert translations["component.switch.state.string1"] == "German Value 1"
assert translations["component.switch.state.string2"] == "German Value 2"
# Test a partial translation
translations = await translation.async_get_translations(hass, "es")
assert translations["component.switch.state.string1"] == "Spanish Value 1"
assert translations["component.switch.state.string2"] == "Value 2"
# Test that an untranslated language falls back to English.
translations = await translation.async_get_translations(hass, "invalid-language")
assert translations["component.switch.state.string1"] == "Value 1"
assert translations["component.switch.state.string2"] == "Value 2"
async def test_get_translations_loads_config_flows(hass, mock_config_flows):
"""Test the get translations helper loads config flow translations."""
mock_config_flows.append("component1")
with patch.object(
translation, "component_translation_file", return_value=mock_coro("bla.json")
), patch.object(
translation,
"load_translations_files",
return_value={"component1": {"hello": "world"}},
):
translations = await translation.async_get_translations(hass, "en")
assert translations == {"component.component1.hello": "world"}