diff --git a/tests/components/drop_connect/snapshots/test_binary_sensor.ambr b/tests/components/drop_connect/snapshots/test_binary_sensor.ambr new file mode 100644 index 00000000000..f822cd5e252 --- /dev/null +++ b/tests/components/drop_connect/snapshots/test_binary_sensor.ambr @@ -0,0 +1,358 @@ +# serializer version: 1 +# name: test_sensors[hub][binary_sensor.hub_drop_1_c0ffee_leak_detected-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'binary_sensor', + 'entity_category': None, + 'entity_id': 'binary_sensor.hub_drop_1_c0ffee_leak_detected', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': 'mdi:pipe-leak', + 'original_name': 'Leak detected', + 'platform': 'drop_connect', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'leak', + 'unique_id': 'DROP-1_C0FFEE_255_leak', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensors[hub][binary_sensor.hub_drop_1_c0ffee_leak_detected-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'moisture', + 'friendly_name': 'Hub DROP-1_C0FFEE Leak detected', + 'icon': 'mdi:pipe-leak', + }), + 'context': , + 'entity_id': 'binary_sensor.hub_drop_1_c0ffee_leak_detected', + 'last_changed': , + 'last_updated': , + 'state': 'off', + }) +# --- +# name: test_sensors[hub][binary_sensor.hub_drop_1_c0ffee_notification_unread-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'binary_sensor', + 'entity_category': None, + 'entity_id': 'binary_sensor.hub_drop_1_c0ffee_notification_unread', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': 'mdi:bell-ring', + 'original_name': 'Notification unread', + 'platform': 'drop_connect', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'pending_notification', + 'unique_id': 'DROP-1_C0FFEE_255_pending_notification', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensors[hub][binary_sensor.hub_drop_1_c0ffee_notification_unread-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Hub DROP-1_C0FFEE Notification unread', + 'icon': 'mdi:bell-ring', + }), + 'context': , + 'entity_id': 'binary_sensor.hub_drop_1_c0ffee_notification_unread', + 'last_changed': , + 'last_updated': , + 'state': 'on', + }) +# --- +# name: test_sensors[leak][binary_sensor.leak_detector_leak_detected-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'binary_sensor', + 'entity_category': None, + 'entity_id': 'binary_sensor.leak_detector_leak_detected', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': 'mdi:pipe-leak', + 'original_name': 'Leak detected', + 'platform': 'drop_connect', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'leak', + 'unique_id': 'DROP-1_C0FFEE_20_leak', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensors[leak][binary_sensor.leak_detector_leak_detected-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'moisture', + 'friendly_name': 'Leak Detector Leak detected', + 'icon': 'mdi:pipe-leak', + }), + 'context': , + 'entity_id': 'binary_sensor.leak_detector_leak_detected', + 'last_changed': , + 'last_updated': , + 'state': 'on', + }) +# --- +# name: test_sensors[protection_valve][binary_sensor.protection_valve_leak_detected-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'binary_sensor', + 'entity_category': None, + 'entity_id': 'binary_sensor.protection_valve_leak_detected', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': 'mdi:pipe-leak', + 'original_name': 'Leak detected', + 'platform': 'drop_connect', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'leak', + 'unique_id': 'DROP-1_C0FFEE_78_leak', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensors[protection_valve][binary_sensor.protection_valve_leak_detected-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'moisture', + 'friendly_name': 'Protection Valve Leak detected', + 'icon': 'mdi:pipe-leak', + }), + 'context': , + 'entity_id': 'binary_sensor.protection_valve_leak_detected', + 'last_changed': , + 'last_updated': , + 'state': 'on', + }) +# --- +# name: test_sensors[pump_controller][binary_sensor.pump_controller_leak_detected-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'binary_sensor', + 'entity_category': None, + 'entity_id': 'binary_sensor.pump_controller_leak_detected', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': 'mdi:pipe-leak', + 'original_name': 'Leak detected', + 'platform': 'drop_connect', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'leak', + 'unique_id': 'DROP-1_C0FFEE_83_leak', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensors[pump_controller][binary_sensor.pump_controller_leak_detected-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'moisture', + 'friendly_name': 'Pump Controller Leak detected', + 'icon': 'mdi:pipe-leak', + }), + 'context': , + 'entity_id': 'binary_sensor.pump_controller_leak_detected', + 'last_changed': , + 'last_updated': , + 'state': 'on', + }) +# --- +# name: test_sensors[pump_controller][binary_sensor.pump_controller_pump_status-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'binary_sensor', + 'entity_category': None, + 'entity_id': 'binary_sensor.pump_controller_pump_status', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': 'mdi:water-pump', + 'original_name': 'Pump status', + 'platform': 'drop_connect', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'pump', + 'unique_id': 'DROP-1_C0FFEE_83_pump', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensors[pump_controller][binary_sensor.pump_controller_pump_status-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Pump Controller Pump status', + 'icon': 'mdi:water-pump', + }), + 'context': , + 'entity_id': 'binary_sensor.pump_controller_pump_status', + 'last_changed': , + 'last_updated': , + 'state': 'on', + }) +# --- +# name: test_sensors[ro_filter][binary_sensor.ro_filter_leak_detected-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'binary_sensor', + 'entity_category': None, + 'entity_id': 'binary_sensor.ro_filter_leak_detected', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': 'mdi:pipe-leak', + 'original_name': 'Leak detected', + 'platform': 'drop_connect', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'leak', + 'unique_id': 'DROP-1_C0FFEE_255_leak', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensors[ro_filter][binary_sensor.ro_filter_leak_detected-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'moisture', + 'friendly_name': 'RO Filter Leak detected', + 'icon': 'mdi:pipe-leak', + }), + 'context': , + 'entity_id': 'binary_sensor.ro_filter_leak_detected', + 'last_changed': , + 'last_updated': , + 'state': 'on', + }) +# --- +# name: test_sensors[softener][binary_sensor.softener_reserve_capacity_in_use-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'binary_sensor', + 'entity_category': None, + 'entity_id': 'binary_sensor.softener_reserve_capacity_in_use', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': 'mdi:water', + 'original_name': 'Reserve capacity in use', + 'platform': 'drop_connect', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'reserve_in_use', + 'unique_id': 'DROP-1_C0FFEE_0_reserve_in_use', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensors[softener][binary_sensor.softener_reserve_capacity_in_use-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Softener Reserve capacity in use', + 'icon': 'mdi:water', + }), + 'context': , + 'entity_id': 'binary_sensor.softener_reserve_capacity_in_use', + 'last_changed': , + 'last_updated': , + 'state': 'on', + }) +# --- diff --git a/tests/components/drop_connect/test_binary_sensor.py b/tests/components/drop_connect/test_binary_sensor.py index 2f54e8fb791..895921291ef 100644 --- a/tests/components/drop_connect/test_binary_sensor.py +++ b/tests/components/drop_connect/test_binary_sensor.py @@ -1,7 +1,13 @@ """Test DROP binary sensor entities.""" -from homeassistant.const import STATE_OFF, STATE_ON +from unittest.mock import patch + +import pytest +from syrupy import SnapshotAssertion + +from homeassistant.const import STATE_OFF, Platform from homeassistant.core import HomeAssistant +from homeassistant.helpers import entity_registry as er from .common import ( TEST_DATA_HUB, @@ -19,9 +25,6 @@ from .common import ( TEST_DATA_RO_FILTER, TEST_DATA_RO_FILTER_RESET, TEST_DATA_RO_FILTER_TOPIC, - TEST_DATA_SALT, - TEST_DATA_SALT_RESET, - TEST_DATA_SALT_TOPIC, TEST_DATA_SOFTENER, TEST_DATA_SOFTENER_RESET, TEST_DATA_SOFTENER_TOPIC, @@ -30,167 +33,104 @@ from .common import ( config_entry_protection_valve, config_entry_pump_controller, config_entry_ro_filter, - config_entry_salt, config_entry_softener, ) -from tests.common import async_fire_mqtt_message +from tests.common import MockConfigEntry, async_fire_mqtt_message from tests.typing import MqttMockHAClient -async def test_binary_sensors_hub( - hass: HomeAssistant, mqtt_mock: MqttMockHAClient +@pytest.mark.parametrize( + ("config_entry", "topic", "reset", "data"), + [ + (config_entry_hub(), TEST_DATA_HUB_TOPIC, TEST_DATA_HUB_RESET, TEST_DATA_HUB), + ( + config_entry_leak(), + TEST_DATA_LEAK_TOPIC, + TEST_DATA_LEAK_RESET, + TEST_DATA_LEAK, + ), + ( + config_entry_softener(), + TEST_DATA_SOFTENER_TOPIC, + TEST_DATA_SOFTENER_RESET, + TEST_DATA_SOFTENER, + ), + ( + config_entry_protection_valve(), + TEST_DATA_PROTECTION_VALVE_TOPIC, + TEST_DATA_PROTECTION_VALVE_RESET, + TEST_DATA_PROTECTION_VALVE, + ), + ( + config_entry_pump_controller(), + TEST_DATA_PUMP_CONTROLLER_TOPIC, + TEST_DATA_PUMP_CONTROLLER_RESET, + TEST_DATA_PUMP_CONTROLLER, + ), + ( + config_entry_ro_filter(), + TEST_DATA_RO_FILTER_TOPIC, + TEST_DATA_RO_FILTER_RESET, + TEST_DATA_RO_FILTER, + ), + ], + ids=[ + "hub", + "leak", + "softener", + "protection_valve", + "pump_controller", + "ro_filter", + ], +) +async def test_sensors( + hass: HomeAssistant, + mqtt_mock: MqttMockHAClient, + entity_registry: er.EntityRegistry, + snapshot: SnapshotAssertion, + config_entry: MockConfigEntry, + topic: str, + reset: str, + data: str, ) -> None: - """Test DROP binary sensors for hubs.""" - entry = config_entry_hub() - entry.add_to_hass(hass) - assert await hass.config_entries.async_setup(entry.entry_id) + """Test DROP sensors.""" + config_entry.add_to_hass(hass) - pending_notifications_sensor_name = ( - "binary_sensor.hub_drop_1_c0ffee_notification_unread" + with patch( + "homeassistant.components.drop_connect.PLATFORMS", [Platform.BINARY_SENSOR] + ): + assert await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + + entity_entries = er.async_entries_for_config_entry( + entity_registry, config_entry.entry_id ) - assert hass.states.get(pending_notifications_sensor_name).state == STATE_OFF - leak_sensor_name = "binary_sensor.hub_drop_1_c0ffee_leak_detected" - assert hass.states.get(leak_sensor_name).state == STATE_OFF - async_fire_mqtt_message(hass, TEST_DATA_HUB_TOPIC, TEST_DATA_HUB_RESET) + assert entity_entries + for entity_entry in entity_entries: + assert hass.states.get(entity_entry.entity_id).state == STATE_OFF + + async_fire_mqtt_message(hass, topic, reset) await hass.async_block_till_done() - assert hass.states.get(pending_notifications_sensor_name).state == STATE_OFF - assert hass.states.get(leak_sensor_name).state == STATE_OFF - async_fire_mqtt_message(hass, TEST_DATA_HUB_TOPIC, TEST_DATA_HUB) - await hass.async_block_till_done() - assert hass.states.get(pending_notifications_sensor_name).state == STATE_ON - assert hass.states.get(leak_sensor_name).state == STATE_OFF - - -async def test_binary_sensors_salt( - hass: HomeAssistant, mqtt_mock: MqttMockHAClient -) -> None: - """Test DROP binary sensors for salt sensors.""" - entry = config_entry_salt() - entry.add_to_hass(hass) - assert await hass.config_entries.async_setup(entry.entry_id) - - salt_sensor_name = "binary_sensor.salt_sensor_salt_low" - assert hass.states.get(salt_sensor_name).state == STATE_OFF - - async_fire_mqtt_message(hass, TEST_DATA_SALT_TOPIC, TEST_DATA_SALT_RESET) - await hass.async_block_till_done() - assert hass.states.get(salt_sensor_name).state == STATE_OFF - - async_fire_mqtt_message(hass, TEST_DATA_SALT_TOPIC, TEST_DATA_SALT) - await hass.async_block_till_done() - assert hass.states.get(salt_sensor_name).state == STATE_ON - - -async def test_binary_sensors_leak( - hass: HomeAssistant, mqtt_mock: MqttMockHAClient -) -> None: - """Test DROP binary sensors for leak detectors.""" - entry = config_entry_leak() - entry.add_to_hass(hass) - assert await hass.config_entries.async_setup(entry.entry_id) - - leak_sensor_name = "binary_sensor.leak_detector_leak_detected" - assert hass.states.get(leak_sensor_name).state == STATE_OFF - - async_fire_mqtt_message(hass, TEST_DATA_LEAK_TOPIC, TEST_DATA_LEAK_RESET) - await hass.async_block_till_done() - assert hass.states.get(leak_sensor_name).state == STATE_OFF - - async_fire_mqtt_message(hass, TEST_DATA_LEAK_TOPIC, TEST_DATA_LEAK) - await hass.async_block_till_done() - assert hass.states.get(leak_sensor_name).state == STATE_ON - - -async def test_binary_sensors_softener( - hass: HomeAssistant, mqtt_mock: MqttMockHAClient -) -> None: - """Test DROP binary sensors for softeners.""" - entry = config_entry_softener() - entry.add_to_hass(hass) - assert await hass.config_entries.async_setup(entry.entry_id) - - reserve_in_use_sensor_name = "binary_sensor.softener_reserve_capacity_in_use" - assert hass.states.get(reserve_in_use_sensor_name).state == STATE_OFF - - async_fire_mqtt_message(hass, TEST_DATA_SOFTENER_TOPIC, TEST_DATA_SOFTENER_RESET) - await hass.async_block_till_done() - assert hass.states.get(reserve_in_use_sensor_name).state == STATE_OFF - - async_fire_mqtt_message(hass, TEST_DATA_SOFTENER_TOPIC, TEST_DATA_SOFTENER) - await hass.async_block_till_done() - assert hass.states.get(reserve_in_use_sensor_name).state == STATE_ON - - -async def test_binary_sensors_protection_valve( - hass: HomeAssistant, mqtt_mock: MqttMockHAClient -) -> None: - """Test DROP binary sensors for protection valves.""" - entry = config_entry_protection_valve() - entry.add_to_hass(hass) - assert await hass.config_entries.async_setup(entry.entry_id) - - leak_sensor_name = "binary_sensor.protection_valve_leak_detected" - assert hass.states.get(leak_sensor_name).state == STATE_OFF - - async_fire_mqtt_message( - hass, TEST_DATA_PROTECTION_VALVE_TOPIC, TEST_DATA_PROTECTION_VALVE_RESET + entity_entries = er.async_entries_for_config_entry( + entity_registry, config_entry.entry_id ) - await hass.async_block_till_done() - assert hass.states.get(leak_sensor_name).state == STATE_OFF - async_fire_mqtt_message( - hass, TEST_DATA_PROTECTION_VALVE_TOPIC, TEST_DATA_PROTECTION_VALVE + assert entity_entries + for entity_entry in entity_entries: + assert hass.states.get(entity_entry.entity_id).state == STATE_OFF + + async_fire_mqtt_message(hass, topic, data) + await hass.async_block_till_done() + + entity_entries = er.async_entries_for_config_entry( + entity_registry, config_entry.entry_id ) - await hass.async_block_till_done() - assert hass.states.get(leak_sensor_name).state == STATE_ON - - -async def test_binary_sensors_pump_controller( - hass: HomeAssistant, mqtt_mock: MqttMockHAClient -) -> None: - """Test DROP binary sensors for pump controllers.""" - entry = config_entry_pump_controller() - entry.add_to_hass(hass) - assert await hass.config_entries.async_setup(entry.entry_id) - - leak_sensor_name = "binary_sensor.pump_controller_leak_detected" - assert hass.states.get(leak_sensor_name).state == STATE_OFF - pump_sensor_name = "binary_sensor.pump_controller_pump_status" - assert hass.states.get(pump_sensor_name).state == STATE_OFF - - async_fire_mqtt_message( - hass, TEST_DATA_PUMP_CONTROLLER_TOPIC, TEST_DATA_PUMP_CONTROLLER_RESET - ) - await hass.async_block_till_done() - assert hass.states.get(leak_sensor_name).state == STATE_OFF - assert hass.states.get(pump_sensor_name).state == STATE_OFF - - async_fire_mqtt_message( - hass, TEST_DATA_PUMP_CONTROLLER_TOPIC, TEST_DATA_PUMP_CONTROLLER - ) - await hass.async_block_till_done() - assert hass.states.get(leak_sensor_name).state == STATE_ON - assert hass.states.get(pump_sensor_name).state == STATE_ON - - -async def test_binary_sensors_ro_filter( - hass: HomeAssistant, mqtt_mock: MqttMockHAClient -) -> None: - """Test DROP binary sensors for RO filters.""" - entry = config_entry_ro_filter() - entry.add_to_hass(hass) - assert await hass.config_entries.async_setup(entry.entry_id) - - leak_sensor_name = "binary_sensor.ro_filter_leak_detected" - assert hass.states.get(leak_sensor_name).state == STATE_OFF - - async_fire_mqtt_message(hass, TEST_DATA_RO_FILTER_TOPIC, TEST_DATA_RO_FILTER_RESET) - await hass.async_block_till_done() - assert hass.states.get(leak_sensor_name).state == STATE_OFF - - async_fire_mqtt_message(hass, TEST_DATA_RO_FILTER_TOPIC, TEST_DATA_RO_FILTER) - await hass.async_block_till_done() - assert hass.states.get(leak_sensor_name).state == STATE_ON + assert entity_entries + for entity_entry in entity_entries: + assert entity_entry == snapshot(name=f"{entity_entry.entity_id}-entry") + assert hass.states.get(entity_entry.entity_id) == snapshot( + name=f"{entity_entry.entity_id}-state" + )