From aad93fd5779932944f50d4f683cc0cb1b7dfd937 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Fri, 24 Apr 2026 18:41:39 +0200 Subject: [PATCH] Add tests asserting condition features (#168881) --- .../alarm_control_panel/test_condition.py | 31 +++++++++++++++++ .../assist_satellite/test_condition.py | 28 +++++++++++++++ tests/components/battery/test_condition.py | 28 +++++++++++++++ tests/components/calendar/test_condition.py | 25 ++++++++++++++ tests/components/climate/test_condition.py | 29 ++++++++++++++++ tests/components/counter/test_condition.py | 28 +++++++++++++++ tests/components/cover/test_condition.py | 34 +++++++++++++++++++ tests/components/door/test_condition.py | 26 ++++++++++++++ tests/components/fan/test_condition.py | 26 ++++++++++++++ .../components/garage_door/test_condition.py | 26 ++++++++++++++ tests/components/gate/test_condition.py | 26 ++++++++++++++ tests/components/humidifier/test_condition.py | 28 +++++++++++++++ tests/components/humidity/test_condition.py | 28 +++++++++++++++ .../components/illuminance/test_condition.py | 26 ++++++++++++++ tests/components/lawn_mower/test_condition.py | 29 ++++++++++++++++ tests/components/light/test_condition.py | 26 ++++++++++++++ tests/components/lock/test_condition.py | 28 +++++++++++++++ .../components/media_player/test_condition.py | 29 ++++++++++++++++ tests/components/moisture/test_condition.py | 26 ++++++++++++++ tests/components/motion/test_condition.py | 26 ++++++++++++++ tests/components/occupancy/test_condition.py | 26 ++++++++++++++ tests/components/power/test_condition.py | 33 ++++++++++++++++++ tests/components/remote/test_condition.py | 26 ++++++++++++++ tests/components/schedule/test_condition.py | 26 ++++++++++++++ tests/components/select/test_condition.py | 25 ++++++++++++++ tests/components/siren/test_condition.py | 26 ++++++++++++++ tests/components/switch/test_condition.py | 26 ++++++++++++++ .../components/temperature/test_condition.py | 33 ++++++++++++++++++ tests/components/text/test_condition.py | 25 ++++++++++++++ tests/components/timer/test_condition.py | 27 +++++++++++++++ tests/components/todo/test_condition.py | 25 ++++++++++++++ tests/components/update/test_condition.py | 26 ++++++++++++++ tests/components/vacuum/test_condition.py | 29 ++++++++++++++++ tests/components/valve/test_condition.py | 26 ++++++++++++++ .../components/water_heater/test_condition.py | 26 ++++++++++++++ tests/components/window/test_condition.py | 26 ++++++++++++++ 36 files changed, 984 insertions(+) diff --git a/tests/components/alarm_control_panel/test_condition.py b/tests/components/alarm_control_panel/test_condition.py index 5ecbc088d99..22e215126ea 100644 --- a/tests/components/alarm_control_panel/test_condition.py +++ b/tests/components/alarm_control_panel/test_condition.py @@ -16,6 +16,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, other_states, parametrize_condition_states_all, parametrize_condition_states_any, @@ -49,6 +50,36 @@ async def test_alarm_control_panel_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("alarm_control_panel.is_armed", {}, True, False), + ("alarm_control_panel.is_armed_away", {}, True, True), + ("alarm_control_panel.is_armed_home", {}, True, True), + ("alarm_control_panel.is_armed_night", {}, True, True), + ("alarm_control_panel.is_armed_vacation", {}, True, True), + ("alarm_control_panel.is_disarmed", {}, True, True), + ("alarm_control_panel.is_triggered", {}, True, True), + ], +) +async def test_alarm_control_panel_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that alarm_control_panel conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/assist_satellite/test_condition.py b/tests/components/assist_satellite/test_condition.py index 26c43ec7db9..3594c3ba3e9 100644 --- a/tests/components/assist_satellite/test_condition.py +++ b/tests/components/assist_satellite/test_condition.py @@ -12,6 +12,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, other_states, parametrize_condition_states_all, parametrize_condition_states_any, @@ -42,6 +43,33 @@ async def test_assist_satellite_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("assist_satellite.is_idle", {}, True, True), + ("assist_satellite.is_listening", {}, True, True), + ("assist_satellite.is_processing", {}, True, True), + ("assist_satellite.is_responding", {}, True, True), + ], +) +async def test_assist_satellite_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that assist_satellite conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/battery/test_condition.py b/tests/components/battery/test_condition.py index 8c828c0add8..dd8606171c8 100644 --- a/tests/components/battery/test_condition.py +++ b/tests/components/battery/test_condition.py @@ -17,6 +17,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, parametrize_condition_states_all, parametrize_condition_states_any, parametrize_numerical_condition_above_below_all, @@ -57,6 +58,33 @@ async def test_battery_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("battery.is_low", {}, True, True), + ("battery.is_not_low", {}, True, True), + ("battery.is_charging", {}, True, True), + ("battery.is_not_charging", {}, True, True), + ], +) +async def test_battery_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that battery conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/calendar/test_condition.py b/tests/components/calendar/test_condition.py index 05b7c711314..2f49b982bc5 100644 --- a/tests/components/calendar/test_condition.py +++ b/tests/components/calendar/test_condition.py @@ -12,6 +12,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, parametrize_condition_states_all, parametrize_condition_states_any, parametrize_target_entities, @@ -38,6 +39,30 @@ async def test_calendar_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("calendar.is_event_active", {}, True, True), + ], +) +async def test_calendar_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that calendar conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/climate/test_condition.py b/tests/components/climate/test_condition.py index 13bf598241a..b943a0005d9 100644 --- a/tests/components/climate/test_condition.py +++ b/tests/components/climate/test_condition.py @@ -22,6 +22,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, assert_numerical_condition_unit_conversion, other_states, parametrize_condition_states_all, @@ -59,6 +60,34 @@ async def test_climate_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("climate.is_off", {}, True, True), + ("climate.is_on", {}, True, False), + ("climate.is_cooling", {}, True, False), + ("climate.is_drying", {}, True, False), + ("climate.is_heating", {}, True, False), + ], +) +async def test_climate_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that climate conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/counter/test_condition.py b/tests/components/counter/test_condition.py index c25695edbfb..36d89889f86 100644 --- a/tests/components/counter/test_condition.py +++ b/tests/components/counter/test_condition.py @@ -11,6 +11,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, parametrize_condition_states_all, parametrize_condition_states_any, parametrize_target_entities, @@ -31,6 +32,33 @@ async def test_counter_condition_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, "counter.is_value") +_PLAIN_THRESHOLD = {"threshold": {"type": "above", "value": {"number": 50}}} + + +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("counter.is_value", _PLAIN_THRESHOLD, True, False), + ], +) +async def test_counter_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that counter conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/cover/test_condition.py b/tests/components/cover/test_condition.py index 2ee5f034e82..d33d8a1974f 100644 --- a/tests/components/cover/test_condition.py +++ b/tests/components/cover/test_condition.py @@ -13,6 +13,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, create_target_condition, parametrize_condition_states_all, parametrize_condition_states_any, @@ -50,6 +51,39 @@ async def test_cover_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("cover.awning_is_closed", {}, True, False), + ("cover.awning_is_open", {}, True, False), + ("cover.blind_is_closed", {}, True, False), + ("cover.blind_is_open", {}, True, False), + ("cover.curtain_is_closed", {}, True, False), + ("cover.curtain_is_open", {}, True, False), + ("cover.shade_is_closed", {}, True, False), + ("cover.shade_is_open", {}, True, False), + ("cover.shutter_is_closed", {}, True, False), + ("cover.shutter_is_open", {}, True, False), + ], +) +async def test_cover_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that cover conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/door/test_condition.py b/tests/components/door/test_condition.py index 7c267a8df8b..1b8eb9d675a 100644 --- a/tests/components/door/test_condition.py +++ b/tests/components/door/test_condition.py @@ -13,6 +13,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, create_target_condition, parametrize_condition_states_all, parametrize_condition_states_any, @@ -47,6 +48,31 @@ async def test_door_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("door.is_closed", {}, True, False), + ("door.is_open", {}, True, False), + ], +) +async def test_door_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that door conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + # --- binary_sensor tests --- diff --git a/tests/components/fan/test_condition.py b/tests/components/fan/test_condition.py index 425af847667..d3cde640af8 100644 --- a/tests/components/fan/test_condition.py +++ b/tests/components/fan/test_condition.py @@ -12,6 +12,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, parametrize_condition_states_all, parametrize_condition_states_any, parametrize_target_entities, @@ -39,6 +40,31 @@ async def test_fan_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("fan.is_off", {}, True, True), + ("fan.is_on", {}, True, True), + ], +) +async def test_fan_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that fan conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/garage_door/test_condition.py b/tests/components/garage_door/test_condition.py index f85aa719f16..68b3993c6e9 100644 --- a/tests/components/garage_door/test_condition.py +++ b/tests/components/garage_door/test_condition.py @@ -13,6 +13,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, create_target_condition, parametrize_condition_states_all, parametrize_condition_states_any, @@ -47,6 +48,31 @@ async def test_garage_door_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("garage_door.is_closed", {}, True, False), + ("garage_door.is_open", {}, True, False), + ], +) +async def test_garage_door_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that garage_door conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + # --- binary_sensor tests --- diff --git a/tests/components/gate/test_condition.py b/tests/components/gate/test_condition.py index 85d072fca71..1ed3d1ecfed 100644 --- a/tests/components/gate/test_condition.py +++ b/tests/components/gate/test_condition.py @@ -13,6 +13,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, create_target_condition, parametrize_condition_states_all, parametrize_condition_states_any, @@ -41,6 +42,31 @@ async def test_gate_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("gate.is_closed", {}, True, False), + ("gate.is_open", {}, True, False), + ], +) +async def test_gate_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that gate conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/humidifier/test_condition.py b/tests/components/humidifier/test_condition.py index b45f8882964..76d4acabaad 100644 --- a/tests/components/humidifier/test_condition.py +++ b/tests/components/humidifier/test_condition.py @@ -30,6 +30,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, parametrize_condition_states_all, parametrize_condition_states_any, parametrize_numerical_attribute_condition_above_below_all, @@ -63,6 +64,33 @@ async def test_humidifier_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("humidifier.is_off", {}, True, True), + ("humidifier.is_on", {}, True, True), + ("humidifier.is_drying", {}, True, False), + ("humidifier.is_humidifying", {}, True, False), + ], +) +async def test_humidifier_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that humidifier conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/humidity/test_condition.py b/tests/components/humidity/test_condition.py index f878dfe14a0..d62065853da 100644 --- a/tests/components/humidity/test_condition.py +++ b/tests/components/humidity/test_condition.py @@ -20,6 +20,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, parametrize_numerical_attribute_condition_above_below_all, parametrize_numerical_attribute_condition_above_below_any, parametrize_numerical_condition_above_below_all, @@ -68,6 +69,33 @@ async def test_humidity_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +_PLAIN_THRESHOLD = {"threshold": {"type": "above", "value": {"number": 50}}} + + +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("humidity.is_value", _PLAIN_THRESHOLD, True, False), + ], +) +async def test_humidity_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that humidity conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/illuminance/test_condition.py b/tests/components/illuminance/test_condition.py index d82a29581c3..614ea7146ff 100644 --- a/tests/components/illuminance/test_condition.py +++ b/tests/components/illuminance/test_condition.py @@ -17,6 +17,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, parametrize_condition_states_all, parametrize_condition_states_any, parametrize_numerical_condition_above_below_all, @@ -55,6 +56,31 @@ async def test_illuminance_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("illuminance.is_detected", {}, True, True), + ("illuminance.is_not_detected", {}, True, True), + ], +) +async def test_illuminance_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that illuminance conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/lawn_mower/test_condition.py b/tests/components/lawn_mower/test_condition.py index 25bdf62d8fa..27ab7503a00 100644 --- a/tests/components/lawn_mower/test_condition.py +++ b/tests/components/lawn_mower/test_condition.py @@ -12,6 +12,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, other_states, parametrize_condition_states_all, parametrize_condition_states_any, @@ -43,6 +44,34 @@ async def test_lawn_mower_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("lawn_mower.is_docked", {}, True, True), + ("lawn_mower.is_encountering_an_error", {}, True, True), + ("lawn_mower.is_mowing", {}, True, True), + ("lawn_mower.is_paused", {}, True, True), + ("lawn_mower.is_returning", {}, True, True), + ], +) +async def test_lawn_mower_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that lawn_mower conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/light/test_condition.py b/tests/components/light/test_condition.py index 6851527aee2..e52d9b60f62 100644 --- a/tests/components/light/test_condition.py +++ b/tests/components/light/test_condition.py @@ -13,6 +13,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, parametrize_condition_states_all, parametrize_condition_states_any, parametrize_target_entities, @@ -151,6 +152,31 @@ async def test_light_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("light.is_off", {}, True, True), + ("light.is_on", {}, True, True), + ], +) +async def test_light_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that light conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/lock/test_condition.py b/tests/components/lock/test_condition.py index 73d51620974..d2a009b5a5c 100644 --- a/tests/components/lock/test_condition.py +++ b/tests/components/lock/test_condition.py @@ -12,6 +12,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, other_states, parametrize_condition_states_all, parametrize_condition_states_any, @@ -42,6 +43,33 @@ async def test_lock_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("lock.is_jammed", {}, True, True), + ("lock.is_locked", {}, True, True), + ("lock.is_open", {}, True, True), + ("lock.is_unlocked", {}, True, True), + ], +) +async def test_lock_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that lock conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/media_player/test_condition.py b/tests/components/media_player/test_condition.py index 2dded050bfd..55ed770ea0d 100644 --- a/tests/components/media_player/test_condition.py +++ b/tests/components/media_player/test_condition.py @@ -12,6 +12,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, other_states, parametrize_condition_states_all, parametrize_condition_states_any, @@ -43,6 +44,34 @@ async def test_media_player_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("media_player.is_off", {}, True, True), + ("media_player.is_on", {}, True, False), + ("media_player.is_not_playing", {}, True, False), + ("media_player.is_paused", {}, True, True), + ("media_player.is_playing", {}, True, True), + ], +) +async def test_media_player_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that media_player conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/moisture/test_condition.py b/tests/components/moisture/test_condition.py index 65d7e7c76d0..7c636a7c90b 100644 --- a/tests/components/moisture/test_condition.py +++ b/tests/components/moisture/test_condition.py @@ -17,6 +17,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, parametrize_condition_states_all, parametrize_condition_states_any, parametrize_numerical_condition_above_below_all, @@ -55,6 +56,31 @@ async def test_moisture_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("moisture.is_detected", {}, True, True), + ("moisture.is_not_detected", {}, True, True), + ], +) +async def test_moisture_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that moisture conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/motion/test_condition.py b/tests/components/motion/test_condition.py index b4b3c717e03..dda997d9118 100644 --- a/tests/components/motion/test_condition.py +++ b/tests/components/motion/test_condition.py @@ -12,6 +12,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, create_target_condition, parametrize_condition_states_all, parametrize_condition_states_any, @@ -40,6 +41,31 @@ async def test_motion_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("motion.is_detected", {}, True, True), + ("motion.is_not_detected", {}, True, True), + ], +) +async def test_motion_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that motion conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/occupancy/test_condition.py b/tests/components/occupancy/test_condition.py index f4753d06acd..1e06a88bfb9 100644 --- a/tests/components/occupancy/test_condition.py +++ b/tests/components/occupancy/test_condition.py @@ -12,6 +12,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, create_target_condition, parametrize_condition_states_all, parametrize_condition_states_any, @@ -40,6 +41,31 @@ async def test_occupancy_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("occupancy.is_detected", {}, True, True), + ("occupancy.is_not_detected", {}, True, True), + ], +) +async def test_occupancy_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that occupancy conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/power/test_condition.py b/tests/components/power/test_condition.py index e5bff95dff5..3e9b7cf4a57 100644 --- a/tests/components/power/test_condition.py +++ b/tests/components/power/test_condition.py @@ -12,6 +12,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, assert_numerical_condition_unit_conversion, parametrize_numerical_condition_above_below_all, parametrize_numerical_condition_above_below_any, @@ -37,6 +38,38 @@ async def test_power_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +_WATT_THRESHOLD = { + "threshold": { + "type": "above", + "value": {"number": 50, "unit_of_measurement": "W"}, + } +} + + +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("power.is_value", _WATT_THRESHOLD, True, False), + ], +) +async def test_power_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that power conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/remote/test_condition.py b/tests/components/remote/test_condition.py index b3052de5bd7..04c187f0dd6 100644 --- a/tests/components/remote/test_condition.py +++ b/tests/components/remote/test_condition.py @@ -12,6 +12,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, parametrize_condition_states_all, parametrize_condition_states_any, parametrize_target_entities, @@ -39,6 +40,31 @@ async def test_remote_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("remote.is_off", {}, True, True), + ("remote.is_on", {}, True, True), + ], +) +async def test_remote_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that remote conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/schedule/test_condition.py b/tests/components/schedule/test_condition.py index e9eb1fcf61c..107d8318377 100644 --- a/tests/components/schedule/test_condition.py +++ b/tests/components/schedule/test_condition.py @@ -13,6 +13,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, parametrize_condition_states_all, parametrize_condition_states_any, parametrize_target_entities, @@ -40,6 +41,31 @@ async def test_schedule_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("schedule.is_off", {}, True, True), + ("schedule.is_on", {}, True, True), + ], +) +async def test_schedule_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that schedule conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/select/test_condition.py b/tests/components/select/test_condition.py index edd97c41ee2..1d97b13113a 100644 --- a/tests/components/select/test_condition.py +++ b/tests/components/select/test_condition.py @@ -16,6 +16,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, create_target_condition, parametrize_condition_states_all, parametrize_condition_states_any, @@ -47,6 +48,30 @@ async def test_select_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("select.is_option_selected", {"option": ["option_a"]}, True, False), + ], +) +async def test_select_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that select conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/siren/test_condition.py b/tests/components/siren/test_condition.py index 8da90f57b97..3399208cf7a 100644 --- a/tests/components/siren/test_condition.py +++ b/tests/components/siren/test_condition.py @@ -12,6 +12,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, parametrize_condition_states_all, parametrize_condition_states_any, parametrize_target_entities, @@ -39,6 +40,31 @@ async def test_siren_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("siren.is_off", {}, True, True), + ("siren.is_on", {}, True, True), + ], +) +async def test_siren_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that siren conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/switch/test_condition.py b/tests/components/switch/test_condition.py index 16154bc027e..7a7cdbc4aa4 100644 --- a/tests/components/switch/test_condition.py +++ b/tests/components/switch/test_condition.py @@ -12,6 +12,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, create_target_condition, parametrize_condition_states_all, parametrize_condition_states_any, @@ -46,6 +47,31 @@ async def test_switch_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("switch.is_off", {}, True, True), + ("switch.is_on", {}, True, True), + ], +) +async def test_switch_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that switch conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/temperature/test_condition.py b/tests/components/temperature/test_condition.py index 96199ea2c88..fc78895e758 100644 --- a/tests/components/temperature/test_condition.py +++ b/tests/components/temperature/test_condition.py @@ -14,6 +14,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, assert_numerical_condition_unit_conversion, parametrize_numerical_attribute_condition_above_below_all, parametrize_numerical_attribute_condition_above_below_any, @@ -61,6 +62,38 @@ async def test_temperature_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +_CELSIUS_THRESHOLD = { + "threshold": { + "type": "above", + "value": {"number": 20, "unit_of_measurement": "\u00b0C"}, + } +} + + +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("temperature.is_value", _CELSIUS_THRESHOLD, True, False), + ], +) +async def test_temperature_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that temperature conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/text/test_condition.py b/tests/components/text/test_condition.py index 292a5e0b5bc..ebe761e4421 100644 --- a/tests/components/text/test_condition.py +++ b/tests/components/text/test_condition.py @@ -21,6 +21,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, parametrize_condition_states_all, parametrize_condition_states_any, parametrize_target_entities, @@ -48,6 +49,30 @@ async def test_text_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("text.is_equal_to", {"value": "hello"}, True, False), + ], +) +async def test_text_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that text conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + CONDITION_STATES_ANY = [ *parametrize_condition_states_any( condition="text.is_equal_to", diff --git a/tests/components/timer/test_condition.py b/tests/components/timer/test_condition.py index 3a60edca4c0..781c088cf03 100644 --- a/tests/components/timer/test_condition.py +++ b/tests/components/timer/test_condition.py @@ -12,6 +12,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, parametrize_condition_states_all, parametrize_condition_states_any, parametrize_target_entities, @@ -40,6 +41,32 @@ async def test_timer_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("timer.is_active", {}, True, True), + ("timer.is_paused", {}, True, True), + ("timer.is_idle", {}, True, True), + ], +) +async def test_timer_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that timer conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/todo/test_condition.py b/tests/components/todo/test_condition.py index 26a0ef33566..9723d1cc2a0 100644 --- a/tests/components/todo/test_condition.py +++ b/tests/components/todo/test_condition.py @@ -11,6 +11,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, parametrize_condition_states_all, parametrize_condition_states_any, parametrize_target_entities, @@ -38,6 +39,30 @@ async def test_todo_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("todo.all_completed", {}, True, True), + ], +) +async def test_todo_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that todo conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/update/test_condition.py b/tests/components/update/test_condition.py index e8e839d3a14..6344828f8a1 100644 --- a/tests/components/update/test_condition.py +++ b/tests/components/update/test_condition.py @@ -12,6 +12,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, parametrize_condition_states_all, parametrize_condition_states_any, parametrize_target_entities, @@ -39,6 +40,31 @@ async def test_update_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("update.is_available", {}, True, True), + ("update.is_not_available", {}, True, True), + ], +) +async def test_update_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that update conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/vacuum/test_condition.py b/tests/components/vacuum/test_condition.py index 7d3abfc3811..366a882e117 100644 --- a/tests/components/vacuum/test_condition.py +++ b/tests/components/vacuum/test_condition.py @@ -12,6 +12,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, other_states, parametrize_condition_states_all, parametrize_condition_states_any, @@ -43,6 +44,34 @@ async def test_vacuum_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("vacuum.is_cleaning", {}, True, True), + ("vacuum.is_docked", {}, True, True), + ("vacuum.is_encountering_an_error", {}, True, True), + ("vacuum.is_paused", {}, True, True), + ("vacuum.is_returning", {}, True, True), + ], +) +async def test_vacuum_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that vacuum conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/valve/test_condition.py b/tests/components/valve/test_condition.py index 5ec78a90229..20b52236f5f 100644 --- a/tests/components/valve/test_condition.py +++ b/tests/components/valve/test_condition.py @@ -13,6 +13,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, parametrize_condition_states_all, parametrize_condition_states_any, parametrize_target_entities, @@ -40,6 +41,31 @@ async def test_valve_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("valve.is_open", {}, True, False), + ("valve.is_closed", {}, True, False), + ], +) +async def test_valve_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that valve conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/water_heater/test_condition.py b/tests/components/water_heater/test_condition.py index f4965ec70b3..0ddf476a58c 100644 --- a/tests/components/water_heater/test_condition.py +++ b/tests/components/water_heater/test_condition.py @@ -26,6 +26,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, assert_numerical_condition_unit_conversion, parametrize_condition_states_all, parametrize_condition_states_any, @@ -71,6 +72,31 @@ async def test_water_heater_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("water_heater.is_off", {}, True, True), + ("water_heater.is_on", {}, True, False), + ], +) +async def test_water_heater_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that water_heater conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + @pytest.mark.usefixtures("enable_labs_preview_features") @pytest.mark.parametrize( ("condition_target_config", "entity_id", "entities_in_target"), diff --git a/tests/components/window/test_condition.py b/tests/components/window/test_condition.py index 5e64d10b0e6..65bbe3f73f1 100644 --- a/tests/components/window/test_condition.py +++ b/tests/components/window/test_condition.py @@ -13,6 +13,7 @@ from tests.components.common import ( assert_condition_behavior_all, assert_condition_behavior_any, assert_condition_gated_by_labs_flag, + assert_condition_options_supported, create_target_condition, parametrize_condition_states_all, parametrize_condition_states_any, @@ -47,6 +48,31 @@ async def test_window_conditions_gated_by_labs_flag( await assert_condition_gated_by_labs_flag(hass, caplog, condition) +@pytest.mark.usefixtures("enable_labs_preview_features") +@pytest.mark.parametrize( + ("condition_key", "base_options", "supports_behavior", "supports_duration"), + [ + ("window.is_closed", {}, True, False), + ("window.is_open", {}, True, False), + ], +) +async def test_window_condition_options_validation( + hass: HomeAssistant, + condition_key: str, + base_options: dict[str, Any] | None, + supports_behavior: bool, + supports_duration: bool, +) -> None: + """Test that window conditions support the expected options.""" + await assert_condition_options_supported( + hass, + condition_key, + base_options, + supports_behavior=supports_behavior, + supports_duration=supports_duration, + ) + + # --- binary_sensor tests ---