From be2cee228cc50cd9558a80f7a56b1d5b515ec03b Mon Sep 17 00:00:00 2001 From: Erik Montnemery <erik@montnemery.com> Date: Mon, 13 Nov 2023 11:21:37 +0100 Subject: [PATCH] Add tests for package errors (#103902) --- .../basic/configuration.yaml | 0 .../basic_include/configuration.yaml | 0 .../integrations/adr_0007_1.yaml | 0 .../integrations/adr_0007_2.yaml | 0 .../integrations/adr_0007_3.yaml | 0 .../integrations/iot_domain.yaml | 0 .../include_dir_list/configuration.yaml | 0 .../iot_domain/iot_domain_1.yaml | 0 .../iot_domain/iot_domain_2.yaml | 0 .../iot_domain/iot_domain_3.yaml | 0 .../include_dir_merge_list/configuration.yaml | 0 .../iot_domain/iot_domain_1.yaml | 0 .../iot_domain/iot_domain_2.yaml | 0 .../packages/configuration.yaml | 0 .../configuration.yaml | 0 .../integrations/adr_0007_1.yaml | 0 .../integrations/adr_0007_2.yaml | 0 .../integrations/adr_0007_3.yaml | 0 .../integrations/iot_domain.yaml | 0 .../packages/configuration.yaml | 21 +++ .../configuration.yaml | 7 + .../integrations/adr_0007_1.yaml | 3 + .../integrations/adr_0007_2.yaml | 3 + .../integrations/adr_0007_3_1.yaml | 3 + .../integrations/adr_0007_3_2.yaml | 2 + tests/snapshots/test_config.ambr | 42 ++++-- tests/test_config.py | 134 ++++++++++++------ 27 files changed, 160 insertions(+), 55 deletions(-) rename tests/fixtures/core/config/{ => component_validation}/basic/configuration.yaml (100%) rename tests/fixtures/core/config/{ => component_validation}/basic_include/configuration.yaml (100%) rename tests/fixtures/core/config/{ => component_validation}/basic_include/integrations/adr_0007_1.yaml (100%) rename tests/fixtures/core/config/{ => component_validation}/basic_include/integrations/adr_0007_2.yaml (100%) rename tests/fixtures/core/config/{ => component_validation}/basic_include/integrations/adr_0007_3.yaml (100%) rename tests/fixtures/core/config/{ => component_validation}/basic_include/integrations/iot_domain.yaml (100%) rename tests/fixtures/core/config/{ => component_validation}/include_dir_list/configuration.yaml (100%) rename tests/fixtures/core/config/{ => component_validation}/include_dir_list/iot_domain/iot_domain_1.yaml (100%) rename tests/fixtures/core/config/{ => component_validation}/include_dir_list/iot_domain/iot_domain_2.yaml (100%) rename tests/fixtures/core/config/{ => component_validation}/include_dir_list/iot_domain/iot_domain_3.yaml (100%) rename tests/fixtures/core/config/{ => component_validation}/include_dir_merge_list/configuration.yaml (100%) rename tests/fixtures/core/config/{ => component_validation}/include_dir_merge_list/iot_domain/iot_domain_1.yaml (100%) rename tests/fixtures/core/config/{ => component_validation}/include_dir_merge_list/iot_domain/iot_domain_2.yaml (100%) rename tests/fixtures/core/config/{ => component_validation}/packages/configuration.yaml (100%) rename tests/fixtures/core/config/{ => component_validation}/packages_include_dir_named/configuration.yaml (100%) rename tests/fixtures/core/config/{ => component_validation}/packages_include_dir_named/integrations/adr_0007_1.yaml (100%) rename tests/fixtures/core/config/{ => component_validation}/packages_include_dir_named/integrations/adr_0007_2.yaml (100%) rename tests/fixtures/core/config/{ => component_validation}/packages_include_dir_named/integrations/adr_0007_3.yaml (100%) rename tests/fixtures/core/config/{ => component_validation}/packages_include_dir_named/integrations/iot_domain.yaml (100%) create mode 100644 tests/fixtures/core/config/package_errors/packages/configuration.yaml create mode 100644 tests/fixtures/core/config/package_errors/packages_include_dir_named/configuration.yaml create mode 100644 tests/fixtures/core/config/package_errors/packages_include_dir_named/integrations/adr_0007_1.yaml create mode 100644 tests/fixtures/core/config/package_errors/packages_include_dir_named/integrations/adr_0007_2.yaml create mode 100644 tests/fixtures/core/config/package_errors/packages_include_dir_named/integrations/adr_0007_3_1.yaml create mode 100644 tests/fixtures/core/config/package_errors/packages_include_dir_named/integrations/adr_0007_3_2.yaml diff --git a/tests/fixtures/core/config/basic/configuration.yaml b/tests/fixtures/core/config/component_validation/basic/configuration.yaml similarity index 100% rename from tests/fixtures/core/config/basic/configuration.yaml rename to tests/fixtures/core/config/component_validation/basic/configuration.yaml diff --git a/tests/fixtures/core/config/basic_include/configuration.yaml b/tests/fixtures/core/config/component_validation/basic_include/configuration.yaml similarity index 100% rename from tests/fixtures/core/config/basic_include/configuration.yaml rename to tests/fixtures/core/config/component_validation/basic_include/configuration.yaml diff --git a/tests/fixtures/core/config/basic_include/integrations/adr_0007_1.yaml b/tests/fixtures/core/config/component_validation/basic_include/integrations/adr_0007_1.yaml similarity index 100% rename from tests/fixtures/core/config/basic_include/integrations/adr_0007_1.yaml rename to tests/fixtures/core/config/component_validation/basic_include/integrations/adr_0007_1.yaml diff --git a/tests/fixtures/core/config/basic_include/integrations/adr_0007_2.yaml b/tests/fixtures/core/config/component_validation/basic_include/integrations/adr_0007_2.yaml similarity index 100% rename from tests/fixtures/core/config/basic_include/integrations/adr_0007_2.yaml rename to tests/fixtures/core/config/component_validation/basic_include/integrations/adr_0007_2.yaml diff --git a/tests/fixtures/core/config/basic_include/integrations/adr_0007_3.yaml b/tests/fixtures/core/config/component_validation/basic_include/integrations/adr_0007_3.yaml similarity index 100% rename from tests/fixtures/core/config/basic_include/integrations/adr_0007_3.yaml rename to tests/fixtures/core/config/component_validation/basic_include/integrations/adr_0007_3.yaml diff --git a/tests/fixtures/core/config/basic_include/integrations/iot_domain.yaml b/tests/fixtures/core/config/component_validation/basic_include/integrations/iot_domain.yaml similarity index 100% rename from tests/fixtures/core/config/basic_include/integrations/iot_domain.yaml rename to tests/fixtures/core/config/component_validation/basic_include/integrations/iot_domain.yaml diff --git a/tests/fixtures/core/config/include_dir_list/configuration.yaml b/tests/fixtures/core/config/component_validation/include_dir_list/configuration.yaml similarity index 100% rename from tests/fixtures/core/config/include_dir_list/configuration.yaml rename to tests/fixtures/core/config/component_validation/include_dir_list/configuration.yaml diff --git a/tests/fixtures/core/config/include_dir_list/iot_domain/iot_domain_1.yaml b/tests/fixtures/core/config/component_validation/include_dir_list/iot_domain/iot_domain_1.yaml similarity index 100% rename from tests/fixtures/core/config/include_dir_list/iot_domain/iot_domain_1.yaml rename to tests/fixtures/core/config/component_validation/include_dir_list/iot_domain/iot_domain_1.yaml diff --git a/tests/fixtures/core/config/include_dir_list/iot_domain/iot_domain_2.yaml b/tests/fixtures/core/config/component_validation/include_dir_list/iot_domain/iot_domain_2.yaml similarity index 100% rename from tests/fixtures/core/config/include_dir_list/iot_domain/iot_domain_2.yaml rename to tests/fixtures/core/config/component_validation/include_dir_list/iot_domain/iot_domain_2.yaml diff --git a/tests/fixtures/core/config/include_dir_list/iot_domain/iot_domain_3.yaml b/tests/fixtures/core/config/component_validation/include_dir_list/iot_domain/iot_domain_3.yaml similarity index 100% rename from tests/fixtures/core/config/include_dir_list/iot_domain/iot_domain_3.yaml rename to tests/fixtures/core/config/component_validation/include_dir_list/iot_domain/iot_domain_3.yaml diff --git a/tests/fixtures/core/config/include_dir_merge_list/configuration.yaml b/tests/fixtures/core/config/component_validation/include_dir_merge_list/configuration.yaml similarity index 100% rename from tests/fixtures/core/config/include_dir_merge_list/configuration.yaml rename to tests/fixtures/core/config/component_validation/include_dir_merge_list/configuration.yaml diff --git a/tests/fixtures/core/config/include_dir_merge_list/iot_domain/iot_domain_1.yaml b/tests/fixtures/core/config/component_validation/include_dir_merge_list/iot_domain/iot_domain_1.yaml similarity index 100% rename from tests/fixtures/core/config/include_dir_merge_list/iot_domain/iot_domain_1.yaml rename to tests/fixtures/core/config/component_validation/include_dir_merge_list/iot_domain/iot_domain_1.yaml diff --git a/tests/fixtures/core/config/include_dir_merge_list/iot_domain/iot_domain_2.yaml b/tests/fixtures/core/config/component_validation/include_dir_merge_list/iot_domain/iot_domain_2.yaml similarity index 100% rename from tests/fixtures/core/config/include_dir_merge_list/iot_domain/iot_domain_2.yaml rename to tests/fixtures/core/config/component_validation/include_dir_merge_list/iot_domain/iot_domain_2.yaml diff --git a/tests/fixtures/core/config/packages/configuration.yaml b/tests/fixtures/core/config/component_validation/packages/configuration.yaml similarity index 100% rename from tests/fixtures/core/config/packages/configuration.yaml rename to tests/fixtures/core/config/component_validation/packages/configuration.yaml diff --git a/tests/fixtures/core/config/packages_include_dir_named/configuration.yaml b/tests/fixtures/core/config/component_validation/packages_include_dir_named/configuration.yaml similarity index 100% rename from tests/fixtures/core/config/packages_include_dir_named/configuration.yaml rename to tests/fixtures/core/config/component_validation/packages_include_dir_named/configuration.yaml diff --git a/tests/fixtures/core/config/packages_include_dir_named/integrations/adr_0007_1.yaml b/tests/fixtures/core/config/component_validation/packages_include_dir_named/integrations/adr_0007_1.yaml similarity index 100% rename from tests/fixtures/core/config/packages_include_dir_named/integrations/adr_0007_1.yaml rename to tests/fixtures/core/config/component_validation/packages_include_dir_named/integrations/adr_0007_1.yaml diff --git a/tests/fixtures/core/config/packages_include_dir_named/integrations/adr_0007_2.yaml b/tests/fixtures/core/config/component_validation/packages_include_dir_named/integrations/adr_0007_2.yaml similarity index 100% rename from tests/fixtures/core/config/packages_include_dir_named/integrations/adr_0007_2.yaml rename to tests/fixtures/core/config/component_validation/packages_include_dir_named/integrations/adr_0007_2.yaml diff --git a/tests/fixtures/core/config/packages_include_dir_named/integrations/adr_0007_3.yaml b/tests/fixtures/core/config/component_validation/packages_include_dir_named/integrations/adr_0007_3.yaml similarity index 100% rename from tests/fixtures/core/config/packages_include_dir_named/integrations/adr_0007_3.yaml rename to tests/fixtures/core/config/component_validation/packages_include_dir_named/integrations/adr_0007_3.yaml diff --git a/tests/fixtures/core/config/packages_include_dir_named/integrations/iot_domain.yaml b/tests/fixtures/core/config/component_validation/packages_include_dir_named/integrations/iot_domain.yaml similarity index 100% rename from tests/fixtures/core/config/packages_include_dir_named/integrations/iot_domain.yaml rename to tests/fixtures/core/config/component_validation/packages_include_dir_named/integrations/iot_domain.yaml diff --git a/tests/fixtures/core/config/package_errors/packages/configuration.yaml b/tests/fixtures/core/config/package_errors/packages/configuration.yaml new file mode 100644 index 00000000000..498eca0edac --- /dev/null +++ b/tests/fixtures/core/config/package_errors/packages/configuration.yaml @@ -0,0 +1,21 @@ +# adr007_1 should be a dict, this will cause a package error +adr_0007_1: + - host: blah.com + +homeassistant: + packages: + pack_1: + # This is correct, but root config is wrong + adr_0007_1: + port: 8080 + pack_2: + # Should not be a list + adr_0007_2: + - host: blah.com + pack_3: + # Host duplicated in pack_4 + adr_0007_3: + host: blah.com + pack_4: + adr_0007_3: + host: blah.com diff --git a/tests/fixtures/core/config/package_errors/packages_include_dir_named/configuration.yaml b/tests/fixtures/core/config/package_errors/packages_include_dir_named/configuration.yaml new file mode 100644 index 00000000000..85ffc610758 --- /dev/null +++ b/tests/fixtures/core/config/package_errors/packages_include_dir_named/configuration.yaml @@ -0,0 +1,7 @@ +# adr007_1 should be a dict, this will cause a package error +adr_0007_1: + - host: blah.com + +homeassistant: + # Load packages + packages: !include_dir_named integrations diff --git a/tests/fixtures/core/config/package_errors/packages_include_dir_named/integrations/adr_0007_1.yaml b/tests/fixtures/core/config/package_errors/packages_include_dir_named/integrations/adr_0007_1.yaml new file mode 100644 index 00000000000..09cbdaa1bf8 --- /dev/null +++ b/tests/fixtures/core/config/package_errors/packages_include_dir_named/integrations/adr_0007_1.yaml @@ -0,0 +1,3 @@ +# This is correct, but root config is wrong +adr_0007_1: + port: 8080 diff --git a/tests/fixtures/core/config/package_errors/packages_include_dir_named/integrations/adr_0007_2.yaml b/tests/fixtures/core/config/package_errors/packages_include_dir_named/integrations/adr_0007_2.yaml new file mode 100644 index 00000000000..c1ab9d84c48 --- /dev/null +++ b/tests/fixtures/core/config/package_errors/packages_include_dir_named/integrations/adr_0007_2.yaml @@ -0,0 +1,3 @@ +# Should not be a list +adr_0007_2: + - host: blah.com diff --git a/tests/fixtures/core/config/package_errors/packages_include_dir_named/integrations/adr_0007_3_1.yaml b/tests/fixtures/core/config/package_errors/packages_include_dir_named/integrations/adr_0007_3_1.yaml new file mode 100644 index 00000000000..1b524ae6ec1 --- /dev/null +++ b/tests/fixtures/core/config/package_errors/packages_include_dir_named/integrations/adr_0007_3_1.yaml @@ -0,0 +1,3 @@ +# Host duplicated in adr_0007_3_2.yaml +adr_0007_3: + host: blah.com diff --git a/tests/fixtures/core/config/package_errors/packages_include_dir_named/integrations/adr_0007_3_2.yaml b/tests/fixtures/core/config/package_errors/packages_include_dir_named/integrations/adr_0007_3_2.yaml new file mode 100644 index 00000000000..5e28092d6c0 --- /dev/null +++ b/tests/fixtures/core/config/package_errors/packages_include_dir_named/integrations/adr_0007_3_2.yaml @@ -0,0 +1,2 @@ +adr_0007_3: + host: blah.com diff --git a/tests/snapshots/test_config.ambr b/tests/snapshots/test_config.ambr index 5a8831e2140..b94116f7bca 100644 --- a/tests/snapshots/test_config.ambr +++ b/tests/snapshots/test_config.ambr @@ -1,45 +1,59 @@ # serializer version: 1 # name: test_component_config_validation_error[basic] list([ - "Invalid config for [iot_domain.non_adr_0007]: expected str for dictionary value @ data['option1']. Got 123. (See <BASE_PATH>/fixtures/core/config/basic/configuration.yaml, line 6). ", - "Invalid config for [iot_domain]: required key not provided @ data['platform']. Got None. (See <BASE_PATH>/fixtures/core/config/basic/configuration.yaml, line 9). ", + "Invalid config for [iot_domain.non_adr_0007]: expected str for dictionary value @ data['option1']. Got 123. (See <BASE_PATH>/fixtures/core/config/component_validation/basic/configuration.yaml, line 6). ", + "Invalid config for [iot_domain]: required key not provided @ data['platform']. Got None. (See <BASE_PATH>/fixtures/core/config/component_validation/basic/configuration.yaml, line 9). ", "Invalid config for [adr_0007_2]: required key not provided @ data['adr_0007_2']['host']. Got None. (See ?, line ?). ", - "Invalid config for [adr_0007_3]: expected int for dictionary value @ data['adr_0007_3']['port']. Got 'foo'. (See <BASE_PATH>/fixtures/core/config/basic/configuration.yaml, line 20). ", + "Invalid config for [adr_0007_3]: expected int for dictionary value @ data['adr_0007_3']['port']. Got 'foo'. (See <BASE_PATH>/fixtures/core/config/component_validation/basic/configuration.yaml, line 20). ", ]) # --- # name: test_component_config_validation_error[basic_include] list([ - "Invalid config for [iot_domain.non_adr_0007]: expected str for dictionary value @ data['option1']. Got 123. (See <BASE_PATH>/fixtures/core/config/basic_include/integrations/iot_domain.yaml, line 5). ", - "Invalid config for [iot_domain]: required key not provided @ data['platform']. Got None. (See <BASE_PATH>/fixtures/core/config/basic_include/integrations/iot_domain.yaml, line 8). ", + "Invalid config for [iot_domain.non_adr_0007]: expected str for dictionary value @ data['option1']. Got 123. (See <BASE_PATH>/fixtures/core/config/component_validation/basic_include/integrations/iot_domain.yaml, line 5). ", + "Invalid config for [iot_domain]: required key not provided @ data['platform']. Got None. (See <BASE_PATH>/fixtures/core/config/component_validation/basic_include/integrations/iot_domain.yaml, line 8). ", "Invalid config for [adr_0007_2]: required key not provided @ data['adr_0007_2']['host']. Got None. (See ?, line ?). ", - "Invalid config for [adr_0007_3]: expected int for dictionary value @ data['adr_0007_3']['port']. Got 'foo'. (See <BASE_PATH>/fixtures/core/config/basic_include/configuration.yaml, line 4). ", + "Invalid config for [adr_0007_3]: expected int for dictionary value @ data['adr_0007_3']['port']. Got 'foo'. (See <BASE_PATH>/fixtures/core/config/component_validation/basic_include/configuration.yaml, line 4). ", ]) # --- # name: test_component_config_validation_error[include_dir_list] list([ - "Invalid config for [iot_domain.non_adr_0007]: expected str for dictionary value @ data['option1']. Got 123. (See <BASE_PATH>/fixtures/core/config/include_dir_list/iot_domain/iot_domain_2.yaml, line 2). ", - "Invalid config for [iot_domain]: required key not provided @ data['platform']. Got None. (See <BASE_PATH>/fixtures/core/config/include_dir_list/iot_domain/iot_domain_3.yaml, line 2). ", + "Invalid config for [iot_domain.non_adr_0007]: expected str for dictionary value @ data['option1']. Got 123. (See <BASE_PATH>/fixtures/core/config/component_validation/include_dir_list/iot_domain/iot_domain_2.yaml, line 2). ", + "Invalid config for [iot_domain]: required key not provided @ data['platform']. Got None. (See <BASE_PATH>/fixtures/core/config/component_validation/include_dir_list/iot_domain/iot_domain_3.yaml, line 2). ", ]) # --- # name: test_component_config_validation_error[include_dir_merge_list] list([ - "Invalid config for [iot_domain.non_adr_0007]: expected str for dictionary value @ data['option1']. Got 123. (See <BASE_PATH>/fixtures/core/config/include_dir_merge_list/iot_domain/iot_domain_2.yaml, line 2). ", - "Invalid config for [iot_domain]: required key not provided @ data['platform']. Got None. (See <BASE_PATH>/fixtures/core/config/include_dir_merge_list/iot_domain/iot_domain_2.yaml, line 5). ", + "Invalid config for [iot_domain.non_adr_0007]: expected str for dictionary value @ data['option1']. Got 123. (See <BASE_PATH>/fixtures/core/config/component_validation/include_dir_merge_list/iot_domain/iot_domain_2.yaml, line 2). ", + "Invalid config for [iot_domain]: required key not provided @ data['platform']. Got None. (See <BASE_PATH>/fixtures/core/config/component_validation/include_dir_merge_list/iot_domain/iot_domain_2.yaml, line 5). ", ]) # --- # name: test_component_config_validation_error[packages] list([ - "Invalid config for [iot_domain.non_adr_0007]: expected str for dictionary value @ data['option1']. Got 123. (See <BASE_PATH>/fixtures/core/config/packages/configuration.yaml, line 11). ", - "Invalid config for [iot_domain]: required key not provided @ data['platform']. Got None. (See <BASE_PATH>/fixtures/core/config/packages/configuration.yaml, line 16). ", + "Invalid config for [iot_domain.non_adr_0007]: expected str for dictionary value @ data['option1']. Got 123. (See <BASE_PATH>/fixtures/core/config/component_validation/packages/configuration.yaml, line 11). ", + "Invalid config for [iot_domain]: required key not provided @ data['platform']. Got None. (See <BASE_PATH>/fixtures/core/config/component_validation/packages/configuration.yaml, line 16). ", "Invalid config for [adr_0007_2]: required key not provided @ data['adr_0007_2']['host']. Got None. (See ?, line ?). ", "Invalid config for [adr_0007_3]: expected int for dictionary value @ data['adr_0007_3']['port']. Got 'foo'. (See ?, line ?). ", ]) # --- # name: test_component_config_validation_error[packages_include_dir_named] list([ - "Invalid config for [iot_domain.non_adr_0007]: expected str for dictionary value @ data['option1']. Got 123. (See <BASE_PATH>/fixtures/core/config/packages_include_dir_named/integrations/iot_domain.yaml, line 6). ", - "Invalid config for [iot_domain]: required key not provided @ data['platform']. Got None. (See <BASE_PATH>/fixtures/core/config/packages_include_dir_named/integrations/iot_domain.yaml, line 9). ", + "Invalid config for [iot_domain.non_adr_0007]: expected str for dictionary value @ data['option1']. Got 123. (See <BASE_PATH>/fixtures/core/config/component_validation/packages_include_dir_named/integrations/iot_domain.yaml, line 6). ", + "Invalid config for [iot_domain]: required key not provided @ data['platform']. Got None. (See <BASE_PATH>/fixtures/core/config/component_validation/packages_include_dir_named/integrations/iot_domain.yaml, line 9). ", "Invalid config for [adr_0007_2]: required key not provided @ data['adr_0007_2']['host']. Got None. (See ?, line ?). ", "Invalid config for [adr_0007_3]: expected int for dictionary value @ data['adr_0007_3']['port']. Got 'foo'. (See ?, line ?). ", ]) # --- +# name: test_package_merge_error[packages] + list([ + 'Package pack_1 setup failed. Integration adr_0007_1 cannot be merged. Dict expected in main config. (See <BASE_PATH>/fixtures/core/config/package_errors/packages/configuration.yaml:9). ', + 'Package pack_2 setup failed. Integration adr_0007_2 cannot be merged. Expected a dict. (See <BASE_PATH>/fixtures/core/config/package_errors/packages/configuration.yaml:13). ', + "Package pack_4 setup failed. Integration adr_0007_3 has duplicate key 'host' (See <BASE_PATH>/fixtures/core/config/package_errors/packages/configuration.yaml:20). ", + ]) +# --- +# name: test_package_merge_error[packages_include_dir_named] + list([ + 'Package adr_0007_1 setup failed. Integration adr_0007_1 cannot be merged. Dict expected in main config. (See <BASE_PATH>/fixtures/core/config/package_errors/packages_include_dir_named/integrations/adr_0007_1.yaml:2). ', + 'Package adr_0007_2 setup failed. Integration adr_0007_2 cannot be merged. Expected a dict. (See <BASE_PATH>/fixtures/core/config/package_errors/packages_include_dir_named/integrations/adr_0007_2.yaml:2). ', + "Package adr_0007_3_2 setup failed. Integration adr_0007_3 has duplicate key 'host' (See <BASE_PATH>/fixtures/core/config/package_errors/packages_include_dir_named/integrations/adr_0007_3_2.yaml:1). ", + ]) +# --- diff --git a/tests/test_config.py b/tests/test_config.py index 83ab670387c..e8e45413117 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -33,7 +33,7 @@ from homeassistant.core import ConfigSource, HomeAssistant, HomeAssistantError from homeassistant.helpers import config_validation as cv, issue_registry as ir import homeassistant.helpers.check_config as check_config from homeassistant.helpers.entity import Entity -from homeassistant.loader import async_get_integration +from homeassistant.loader import Integration, async_get_integration from homeassistant.util.unit_system import ( _CONF_UNIT_SYSTEM_US_CUSTOMARY, METRIC_SYSTEM, @@ -94,6 +94,66 @@ def teardown(): os.remove(SAFE_MODE_PATH) +IOT_DOMAIN_PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({vol.Remove("old"): str}) + + +@pytest.fixture +async def mock_iot_domain_integration(hass: HomeAssistant) -> Integration: + """Mock an integration which provides an IoT domain.""" + comp_platform_schema = cv.PLATFORM_SCHEMA.extend({vol.Remove("old"): str}) + comp_platform_schema_base = comp_platform_schema.extend({}, extra=vol.ALLOW_EXTRA) + + return mock_integration( + hass, + MockModule( + "iot_domain", + platform_schema_base=comp_platform_schema_base, + platform_schema=comp_platform_schema, + ), + ) + + +@pytest.fixture +async def mock_non_adr_0007_integration(hass) -> None: + """Mock a non-ADR-0007 compliant integration with iot_domain platform. + + The integration allows setting up iot_domain entities under the iot_domain's + configuration key + """ + + test_platform_schema = IOT_DOMAIN_PLATFORM_SCHEMA.extend({"option1": str}) + mock_platform( + hass, + "non_adr_0007.iot_domain", + MockPlatform(platform_schema=test_platform_schema), + ) + + +@pytest.fixture +async def mock_adr_0007_integrations(hass) -> list[Integration]: + """Mock ADR-0007 compliant integrations.""" + integrations = [] + for domain in ["adr_0007_1", "adr_0007_2", "adr_0007_3"]: + adr_0007_config_schema = vol.Schema( + { + domain: vol.Schema( + { + vol.Required("host"): str, + vol.Required("port", default=8080): int, + } + ) + }, + extra=vol.ALLOW_EXTRA, + ) + integrations.append( + mock_integration( + hass, + MockModule(domain, config_schema=adr_0007_config_schema), + ) + ) + return integrations + + async def test_create_default_config(hass: HomeAssistant) -> None: """Test creation of default config.""" assert not os.path.isfile(YAML_PATH) @@ -1425,52 +1485,16 @@ async def test_component_config_validation_error( hass: HomeAssistant, caplog: pytest.LogCaptureFixture, config_dir: str, + mock_iot_domain_integration: Integration, + mock_non_adr_0007_integration: None, + mock_adr_0007_integrations: list[Integration], snapshot: SnapshotAssertion, ) -> None: """Test schema error in component.""" - comp_platform_schema = cv.PLATFORM_SCHEMA.extend({vol.Remove("old"): str}) - comp_platform_schema_base = comp_platform_schema.extend({}, extra=vol.ALLOW_EXTRA) - - # Mock an integration which provides an IoT domain - mock_integration( - hass, - MockModule( - "iot_domain", - platform_schema_base=comp_platform_schema_base, - platform_schema=comp_platform_schema, - ), - ) - - # Mock a non-ADR-0007 compliant integration which allows setting up - # iot_domain entities under the iot_domain's configuration key - test_platform_schema = comp_platform_schema.extend({"option1": str}) - mock_platform( - hass, - "non_adr_0007.iot_domain", - MockPlatform(platform_schema=test_platform_schema), - ) - - # Mock an ADR-0007 compliant integration - for domain in ["adr_0007_1", "adr_0007_2", "adr_0007_3"]: - adr_0007_config_schema = vol.Schema( - { - domain: vol.Schema( - { - vol.Required("host"): str, - vol.Required("port", default=8080): int, - } - ) - }, - extra=vol.ALLOW_EXTRA, - ) - mock_integration( - hass, - MockModule(domain, config_schema=adr_0007_config_schema), - ) base_path = os.path.dirname(__file__) hass.config.config_dir = os.path.join( - base_path, "fixtures", "core", "config", config_dir + base_path, "fixtures", "core", "config", "component_validation", config_dir ) config = await config_util.async_hass_config_yaml(hass) @@ -1488,3 +1512,31 @@ async def test_component_config_validation_error( if record.levelno == logging.ERROR ] assert error_records == snapshot + + +@pytest.mark.parametrize( + "config_dir", + ["packages", "packages_include_dir_named"], +) +async def test_package_merge_error( + hass: HomeAssistant, + caplog: pytest.LogCaptureFixture, + config_dir: str, + mock_iot_domain_integration: Integration, + mock_non_adr_0007_integration: None, + mock_adr_0007_integrations: list[Integration], + snapshot: SnapshotAssertion, +) -> None: + """Test schema error in component.""" + base_path = os.path.dirname(__file__) + hass.config.config_dir = os.path.join( + base_path, "fixtures", "core", "config", "package_errors", config_dir + ) + await config_util.async_hass_config_yaml(hass) + + error_records = [ + record.message.replace(base_path, "<BASE_PATH>") + for record in caplog.get_records("call") + if record.levelno == logging.ERROR + ] + assert error_records == snapshot -- GitLab