diff --git a/tests/helpers/test_service.py b/tests/helpers/test_service.py index 60fe87db9d2..3e7d8e6ef03 100644 --- a/tests/helpers/test_service.py +++ b/tests/helpers/test_service.py @@ -971,6 +971,83 @@ async def test_async_get_all_descriptions_dot_keys(hass: HomeAssistant) -> None: } +async def test_async_get_all_descriptions_filter(hass: HomeAssistant) -> None: + """Test async_get_all_descriptions with filters.""" + service_descriptions = """ + test_service: + target: + entity: + domain: alarm_control_panel + supported_features: + - alarm_control_panel.AlarmControlPanelEntityFeature.ARM_HOME + fields: + temperature: + filter: + supported_features: + - alarm_control_panel.AlarmControlPanelEntityFeature.ARM_HOME + attribute: + supported_color_modes: + - light.ColorMode.COLOR_TEMP + selector: + number: + """ + + domain = "test_domain" + + hass.services.async_register(domain, "test_service", lambda call: None) + mock_integration(hass, MockModule(domain), top_level_files={"services.yaml"}) + assert await async_setup_component(hass, domain, {}) + + def load_yaml(fname, secrets=None): + with io.StringIO(service_descriptions) as file: + return parse_yaml(file) + + with ( + patch( + "homeassistant.helpers.service._load_services_files", + side_effect=service._load_services_files, + ) as proxy_load_services_files, + patch( + "homeassistant.util.yaml.loader.load_yaml", + side_effect=load_yaml, + ) as mock_load_yaml, + ): + descriptions = await service.async_get_all_descriptions(hass) + + mock_load_yaml.assert_called_once_with("services.yaml", None) + assert proxy_load_services_files.mock_calls[0][1][1] == unordered( + [ + await async_get_integration(hass, domain), + ] + ) + + test_service_schema = { + "description": "", + "fields": { + "temperature": { + "filter": { + "attribute": {"supported_color_modes": ["color_temp"]}, + "supported_features": [1], + }, + "selector": {"number": None}, + }, + }, + "name": "", + "target": { + "entity": [ + { + "domain": ["alarm_control_panel"], + "supported_features": [1], + }, + ], + }, + } + + assert descriptions == { + "test_domain": {"test_service": test_service_schema}, + } + + async def test_async_get_all_descriptions_failing_integration( hass: HomeAssistant, caplog: pytest.LogCaptureFixture ) -> None: