Allow parameterizing YAML config in tests (#87981)
* Add fixture to parameterize yaml config * Apply to more tests * Re-add @fixture label * Add fixtures to patch yaml content and targets * Typo * Improve docstr Co-authored-by: epenet <6771947+epenet@users.noreply.github.com> * Update references to mock_yaml_configuration * Apply new fixtures * Apply to check_config tests * Follow up comments * Rename fixtures, update docstr * Split paths * Patch load_yaml_config_file instead * sort * Fix tests * improve docst * Rename fixtures * sorting Co-authored-by: epenet <6771947+epenet@users.noreply.github.com> * Improve docstr Co-authored-by: epenet <6771947+epenet@users.noreply.github.com> * Improve docstr Co-authored-by: epenet <6771947+epenet@users.noreply.github.com> * Improve docstr Co-authored-by: epenet <6771947+epenet@users.noreply.github.com> * Improve docstr Co-authored-by: Erik Montnemery <erik@montnemery.com> * Improve docstr Co-authored-by: Erik Montnemery <erik@montnemery.com> * Improve docstr Co-authored-by: Erik Montnemery <erik@montnemery.com> --------- Co-authored-by: epenet <6771947+epenet@users.noreply.github.com> Co-authored-by: Erik Montnemery <erik@montnemery.com>
This commit is contained in:
parent
1759f58fc1
commit
4f6a25b470
8 changed files with 498 additions and 383 deletions
|
@ -6,7 +6,7 @@ import pytest
|
|||
from homeassistant.config import YAML_CONFIG_FILE
|
||||
import homeassistant.scripts.check_config as check_config
|
||||
|
||||
from tests.common import get_test_config_dir, patch_yaml_files
|
||||
from tests.common import get_test_config_dir
|
||||
|
||||
BASE_CONFIG = (
|
||||
"homeassistant:\n"
|
||||
|
@ -43,114 +43,118 @@ def normalize_yaml_files(check_dict):
|
|||
return [key.replace(root, "...") for key in sorted(check_dict["yaml_files"].keys())]
|
||||
|
||||
|
||||
def test_bad_core_config(mock_is_file, event_loop) -> None:
|
||||
@pytest.mark.parametrize("hass_config_yaml", [BAD_CORE_CONFIG])
|
||||
def test_bad_core_config(mock_is_file, event_loop, mock_hass_config_yaml: None) -> None:
|
||||
"""Test a bad core config setup."""
|
||||
files = {YAML_CONFIG_FILE: BAD_CORE_CONFIG}
|
||||
with patch_yaml_files(files):
|
||||
res = check_config.check(get_test_config_dir())
|
||||
assert res["except"].keys() == {"homeassistant"}
|
||||
assert res["except"]["homeassistant"][1] == {"unit_system": "bad"}
|
||||
res = check_config.check(get_test_config_dir())
|
||||
assert res["except"].keys() == {"homeassistant"}
|
||||
assert res["except"]["homeassistant"][1] == {"unit_system": "bad"}
|
||||
|
||||
|
||||
def test_config_platform_valid(mock_is_file, event_loop) -> None:
|
||||
@pytest.mark.parametrize("hass_config_yaml", [BASE_CONFIG + "light:\n platform: demo"])
|
||||
def test_config_platform_valid(
|
||||
mock_is_file, event_loop, mock_hass_config_yaml: None
|
||||
) -> None:
|
||||
"""Test a valid platform setup."""
|
||||
files = {YAML_CONFIG_FILE: BASE_CONFIG + "light:\n platform: demo"}
|
||||
with patch_yaml_files(files):
|
||||
res = check_config.check(get_test_config_dir())
|
||||
assert res["components"].keys() == {"homeassistant", "light"}
|
||||
assert res["components"]["light"] == [{"platform": "demo"}]
|
||||
assert res["except"] == {}
|
||||
assert res["secret_cache"] == {}
|
||||
assert res["secrets"] == {}
|
||||
assert len(res["yaml_files"]) == 1
|
||||
res = check_config.check(get_test_config_dir())
|
||||
assert res["components"].keys() == {"homeassistant", "light"}
|
||||
assert res["components"]["light"] == [{"platform": "demo"}]
|
||||
assert res["except"] == {}
|
||||
assert res["secret_cache"] == {}
|
||||
assert res["secrets"] == {}
|
||||
assert len(res["yaml_files"]) == 1
|
||||
|
||||
|
||||
def test_component_platform_not_found(mock_is_file, event_loop) -> None:
|
||||
@pytest.mark.parametrize(
|
||||
("hass_config_yaml", "platforms", "error"),
|
||||
[
|
||||
(
|
||||
BASE_CONFIG + "beer:",
|
||||
{"homeassistant"},
|
||||
"Integration error: beer - Integration 'beer' not found.",
|
||||
),
|
||||
(
|
||||
BASE_CONFIG + "light:\n platform: beer",
|
||||
{"homeassistant", "light"},
|
||||
"Platform error light.beer - Integration 'beer' not found.",
|
||||
),
|
||||
],
|
||||
)
|
||||
def test_component_platform_not_found(
|
||||
mock_is_file, event_loop, mock_hass_config_yaml: None, platforms, error
|
||||
) -> None:
|
||||
"""Test errors if component or platform not found."""
|
||||
# Make sure they don't exist
|
||||
files = {YAML_CONFIG_FILE: BASE_CONFIG + "beer:"}
|
||||
with patch_yaml_files(files):
|
||||
res = check_config.check(get_test_config_dir())
|
||||
assert res["components"].keys() == {"homeassistant"}
|
||||
assert res["except"] == {
|
||||
check_config.ERROR_STR: [
|
||||
"Integration error: beer - Integration 'beer' not found."
|
||||
]
|
||||
res = check_config.check(get_test_config_dir())
|
||||
assert res["components"].keys() == platforms
|
||||
assert res["except"] == {check_config.ERROR_STR: [error]}
|
||||
assert res["secret_cache"] == {}
|
||||
assert res["secrets"] == {}
|
||||
assert len(res["yaml_files"]) == 1
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"hass_config_yaml_files",
|
||||
[
|
||||
{
|
||||
get_test_config_dir(YAML_CONFIG_FILE): BASE_CONFIG
|
||||
+ "http:\n cors_allowed_origins: !secret http_pw",
|
||||
get_test_config_dir(
|
||||
"secrets.yaml"
|
||||
): "logger: debug\nhttp_pw: http://google.com",
|
||||
}
|
||||
assert res["secret_cache"] == {}
|
||||
assert res["secrets"] == {}
|
||||
assert len(res["yaml_files"]) == 1
|
||||
|
||||
files = {YAML_CONFIG_FILE: BASE_CONFIG + "light:\n platform: beer"}
|
||||
with patch_yaml_files(files):
|
||||
res = check_config.check(get_test_config_dir())
|
||||
assert res["components"].keys() == {"homeassistant", "light"}
|
||||
assert res["components"]["light"] == []
|
||||
assert res["except"] == {
|
||||
check_config.ERROR_STR: [
|
||||
"Platform error light.beer - Integration 'beer' not found."
|
||||
]
|
||||
}
|
||||
assert res["secret_cache"] == {}
|
||||
assert res["secrets"] == {}
|
||||
assert len(res["yaml_files"]) == 1
|
||||
|
||||
|
||||
def test_secrets(mock_is_file, event_loop) -> None:
|
||||
],
|
||||
)
|
||||
def test_secrets(mock_is_file, event_loop, mock_hass_config_yaml: None) -> None:
|
||||
"""Test secrets config checking method."""
|
||||
secrets_path = get_test_config_dir("secrets.yaml")
|
||||
res = check_config.check(get_test_config_dir(), True)
|
||||
|
||||
files = {
|
||||
get_test_config_dir(YAML_CONFIG_FILE): BASE_CONFIG
|
||||
+ "http:\n cors_allowed_origins: !secret http_pw",
|
||||
secrets_path: "logger: debug\nhttp_pw: http://google.com",
|
||||
assert res["except"] == {}
|
||||
assert res["components"].keys() == {"homeassistant", "http"}
|
||||
assert res["components"]["http"] == {
|
||||
"cors_allowed_origins": ["http://google.com"],
|
||||
"ip_ban_enabled": True,
|
||||
"login_attempts_threshold": -1,
|
||||
"server_port": 8123,
|
||||
"ssl_profile": "modern",
|
||||
}
|
||||
|
||||
with patch_yaml_files(files):
|
||||
res = check_config.check(get_test_config_dir(), True)
|
||||
|
||||
assert res["except"] == {}
|
||||
assert res["components"].keys() == {"homeassistant", "http"}
|
||||
assert res["components"]["http"] == {
|
||||
"cors_allowed_origins": ["http://google.com"],
|
||||
"ip_ban_enabled": True,
|
||||
"login_attempts_threshold": -1,
|
||||
"server_port": 8123,
|
||||
"ssl_profile": "modern",
|
||||
}
|
||||
assert res["secret_cache"] == {secrets_path: {"http_pw": "http://google.com"}}
|
||||
assert res["secrets"] == {"http_pw": "http://google.com"}
|
||||
assert normalize_yaml_files(res) == [
|
||||
".../configuration.yaml",
|
||||
".../secrets.yaml",
|
||||
]
|
||||
assert res["secret_cache"] == {
|
||||
get_test_config_dir("secrets.yaml"): {"http_pw": "http://google.com"}
|
||||
}
|
||||
assert res["secrets"] == {"http_pw": "http://google.com"}
|
||||
assert normalize_yaml_files(res) == [
|
||||
".../configuration.yaml",
|
||||
".../secrets.yaml",
|
||||
]
|
||||
|
||||
|
||||
def test_package_invalid(mock_is_file, event_loop) -> None:
|
||||
@pytest.mark.parametrize(
|
||||
"hass_config_yaml", [BASE_CONFIG + ' packages:\n p1:\n group: ["a"]']
|
||||
)
|
||||
def test_package_invalid(mock_is_file, event_loop, mock_hass_config_yaml: None) -> None:
|
||||
"""Test an invalid package."""
|
||||
files = {YAML_CONFIG_FILE: BASE_CONFIG + ' packages:\n p1:\n group: ["a"]'}
|
||||
with patch_yaml_files(files):
|
||||
res = check_config.check(get_test_config_dir())
|
||||
res = check_config.check(get_test_config_dir())
|
||||
|
||||
assert res["except"].keys() == {"homeassistant.packages.p1.group"}
|
||||
assert res["except"]["homeassistant.packages.p1.group"][1] == {"group": ["a"]}
|
||||
assert len(res["except"]) == 1
|
||||
assert res["components"].keys() == {"homeassistant"}
|
||||
assert len(res["components"]) == 1
|
||||
assert res["secret_cache"] == {}
|
||||
assert res["secrets"] == {}
|
||||
assert len(res["yaml_files"]) == 1
|
||||
assert res["except"].keys() == {"homeassistant.packages.p1.group"}
|
||||
assert res["except"]["homeassistant.packages.p1.group"][1] == {"group": ["a"]}
|
||||
assert len(res["except"]) == 1
|
||||
assert res["components"].keys() == {"homeassistant"}
|
||||
assert len(res["components"]) == 1
|
||||
assert res["secret_cache"] == {}
|
||||
assert res["secrets"] == {}
|
||||
assert len(res["yaml_files"]) == 1
|
||||
|
||||
|
||||
def test_bootstrap_error(event_loop) -> None:
|
||||
@pytest.mark.parametrize(
|
||||
"hass_config_yaml", [BASE_CONFIG + "automation: !include no.yaml"]
|
||||
)
|
||||
def test_bootstrap_error(event_loop, mock_hass_config_yaml: None) -> None:
|
||||
"""Test a valid platform setup."""
|
||||
files = {YAML_CONFIG_FILE: BASE_CONFIG + "automation: !include no.yaml"}
|
||||
with patch_yaml_files(files):
|
||||
res = check_config.check(get_test_config_dir(YAML_CONFIG_FILE))
|
||||
err = res["except"].pop(check_config.ERROR_STR)
|
||||
assert len(err) == 1
|
||||
assert res["except"] == {}
|
||||
assert res["components"] == {} # No components, load failed
|
||||
assert res["secret_cache"] == {}
|
||||
assert res["secrets"] == {}
|
||||
assert res["yaml_files"] == {}
|
||||
res = check_config.check(get_test_config_dir(YAML_CONFIG_FILE))
|
||||
err = res["except"].pop(check_config.ERROR_STR)
|
||||
assert len(err) == 1
|
||||
assert res["except"] == {}
|
||||
assert res["components"] == {} # No components, load failed
|
||||
assert res["secret_cache"] == {}
|
||||
assert res["secrets"] == {}
|
||||
assert res["yaml_files"] == {}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue