diff --git a/.coveragerc b/.coveragerc index 233acc43635..5dda2979211 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1055,11 +1055,6 @@ omit = homeassistant/components/point/alarm_control_panel.py homeassistant/components/point/binary_sensor.py homeassistant/components/point/sensor.py - homeassistant/components/poolsense/__init__.py - homeassistant/components/poolsense/binary_sensor.py - homeassistant/components/poolsense/coordinator.py - homeassistant/components/poolsense/entity.py - homeassistant/components/poolsense/sensor.py homeassistant/components/powerwall/__init__.py homeassistant/components/progettihwsw/__init__.py homeassistant/components/progettihwsw/binary_sensor.py diff --git a/tests/components/poolsense/conftest.py b/tests/components/poolsense/conftest.py index d188eaef1ca..1095fb66a40 100644 --- a/tests/components/poolsense/conftest.py +++ b/tests/components/poolsense/conftest.py @@ -1,6 +1,7 @@ """Common fixtures for the Poolsense tests.""" from collections.abc import Generator +from datetime import UTC, datetime from unittest.mock import AsyncMock, patch import pytest @@ -36,6 +37,19 @@ def mock_poolsense_client() -> Generator[AsyncMock, None, None]: ): client = mock_client.return_value client.test_poolsense_credentials.return_value = True + client.get_poolsense_data.return_value = { + "Chlorine": 20, + "pH": 5, + "Water Temp": 6, + "Battery": 80, + "Last Seen": datetime(2021, 1, 1, 0, 0, 0, tzinfo=UTC), + "Chlorine High": 30, + "Chlorine Low": 20, + "pH High": 7, + "pH Low": 4, + "pH Status": "red", + "Chlorine Status": "red", + } yield client diff --git a/tests/components/poolsense/snapshots/test_binary_sensor.ambr b/tests/components/poolsense/snapshots/test_binary_sensor.ambr new file mode 100644 index 00000000000..8a6d39332d4 --- /dev/null +++ b/tests/components/poolsense/snapshots/test_binary_sensor.ambr @@ -0,0 +1,97 @@ +# serializer version: 1 +# name: test_all_entities[binary_sensor.test_test_com_chlorine_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.test_test_com_chlorine_status', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Chlorine status', + 'platform': 'poolsense', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'chlorine_status', + 'unique_id': 'test@test.com-Chlorine Status', + 'unit_of_measurement': None, + }) +# --- +# name: test_all_entities[binary_sensor.test_test_com_chlorine_status-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'attribution': 'PoolSense Data', + 'device_class': 'problem', + 'friendly_name': 'test@test.com Chlorine status', + }), + 'context': , + 'entity_id': 'binary_sensor.test_test_com_chlorine_status', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'on', + }) +# --- +# name: test_all_entities[binary_sensor.test_test_com_ph_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.test_test_com_ph_status', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'pH status', + 'platform': 'poolsense', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'ph_status', + 'unique_id': 'test@test.com-pH Status', + 'unit_of_measurement': None, + }) +# --- +# name: test_all_entities[binary_sensor.test_test_com_ph_status-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'attribution': 'PoolSense Data', + 'device_class': 'problem', + 'friendly_name': 'test@test.com pH status', + }), + 'context': , + 'entity_id': 'binary_sensor.test_test_com_ph_status', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'on', + }) +# --- diff --git a/tests/components/poolsense/snapshots/test_sensor.ambr b/tests/components/poolsense/snapshots/test_sensor.ambr new file mode 100644 index 00000000000..9029f1f24aa --- /dev/null +++ b/tests/components/poolsense/snapshots/test_sensor.ambr @@ -0,0 +1,433 @@ +# serializer version: 1 +# name: test_all_entities[sensor.test_test_com_battery-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.test_test_com_battery', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Battery', + 'platform': 'poolsense', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': None, + 'unique_id': 'test@test.com-Battery', + 'unit_of_measurement': '%', + }) +# --- +# name: test_all_entities[sensor.test_test_com_battery-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'attribution': 'PoolSense Data', + 'device_class': 'battery', + 'friendly_name': 'test@test.com Battery', + 'unit_of_measurement': '%', + }), + 'context': , + 'entity_id': 'sensor.test_test_com_battery', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '80', + }) +# --- +# name: test_all_entities[sensor.test_test_com_chlorine-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.test_test_com_chlorine', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Chlorine', + 'platform': 'poolsense', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'chlorine', + 'unique_id': 'test@test.com-Chlorine', + 'unit_of_measurement': , + }) +# --- +# name: test_all_entities[sensor.test_test_com_chlorine-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'attribution': 'PoolSense Data', + 'friendly_name': 'test@test.com Chlorine', + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.test_test_com_chlorine', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '20', + }) +# --- +# name: test_all_entities[sensor.test_test_com_chlorine_high-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.test_test_com_chlorine_high', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Chlorine high', + 'platform': 'poolsense', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'chlorine_high', + 'unique_id': 'test@test.com-Chlorine High', + 'unit_of_measurement': , + }) +# --- +# name: test_all_entities[sensor.test_test_com_chlorine_high-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'attribution': 'PoolSense Data', + 'friendly_name': 'test@test.com Chlorine high', + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.test_test_com_chlorine_high', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '30', + }) +# --- +# name: test_all_entities[sensor.test_test_com_chlorine_low-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.test_test_com_chlorine_low', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Chlorine low', + 'platform': 'poolsense', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'chlorine_low', + 'unique_id': 'test@test.com-Chlorine Low', + 'unit_of_measurement': , + }) +# --- +# name: test_all_entities[sensor.test_test_com_chlorine_low-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'attribution': 'PoolSense Data', + 'friendly_name': 'test@test.com Chlorine low', + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.test_test_com_chlorine_low', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '20', + }) +# --- +# name: test_all_entities[sensor.test_test_com_last_seen-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.test_test_com_last_seen', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Last seen', + 'platform': 'poolsense', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'last_seen', + 'unique_id': 'test@test.com-Last Seen', + 'unit_of_measurement': None, + }) +# --- +# name: test_all_entities[sensor.test_test_com_last_seen-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'attribution': 'PoolSense Data', + 'device_class': 'timestamp', + 'friendly_name': 'test@test.com Last seen', + }), + 'context': , + 'entity_id': 'sensor.test_test_com_last_seen', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '2021-01-01T00:00:00+00:00', + }) +# --- +# name: test_all_entities[sensor.test_test_com_ph-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.test_test_com_ph', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'pH', + 'platform': 'poolsense', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': None, + 'unique_id': 'test@test.com-pH', + 'unit_of_measurement': None, + }) +# --- +# name: test_all_entities[sensor.test_test_com_ph-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'attribution': 'PoolSense Data', + 'device_class': 'ph', + 'friendly_name': 'test@test.com pH', + }), + 'context': , + 'entity_id': 'sensor.test_test_com_ph', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '5', + }) +# --- +# name: test_all_entities[sensor.test_test_com_ph_high-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.test_test_com_ph_high', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'pH high', + 'platform': 'poolsense', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'ph_high', + 'unique_id': 'test@test.com-pH High', + 'unit_of_measurement': None, + }) +# --- +# name: test_all_entities[sensor.test_test_com_ph_high-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'attribution': 'PoolSense Data', + 'friendly_name': 'test@test.com pH high', + }), + 'context': , + 'entity_id': 'sensor.test_test_com_ph_high', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '7', + }) +# --- +# name: test_all_entities[sensor.test_test_com_ph_low-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.test_test_com_ph_low', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'pH low', + 'platform': 'poolsense', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'ph_low', + 'unique_id': 'test@test.com-pH Low', + 'unit_of_measurement': None, + }) +# --- +# name: test_all_entities[sensor.test_test_com_ph_low-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'attribution': 'PoolSense Data', + 'friendly_name': 'test@test.com pH low', + }), + 'context': , + 'entity_id': 'sensor.test_test_com_ph_low', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '4', + }) +# --- +# name: test_all_entities[sensor.test_test_com_temperature-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.test_test_com_temperature', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Temperature', + 'platform': 'poolsense', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'water_temp', + 'unique_id': 'test@test.com-Water Temp', + 'unit_of_measurement': , + }) +# --- +# name: test_all_entities[sensor.test_test_com_temperature-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'attribution': 'PoolSense Data', + 'device_class': 'temperature', + 'friendly_name': 'test@test.com Temperature', + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.test_test_com_temperature', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '6', + }) +# --- diff --git a/tests/components/poolsense/test_binary_sensor.py b/tests/components/poolsense/test_binary_sensor.py new file mode 100644 index 00000000000..4d10413c124 --- /dev/null +++ b/tests/components/poolsense/test_binary_sensor.py @@ -0,0 +1,31 @@ +"""Test the PoolSense binary sensor module.""" + +from unittest.mock import AsyncMock, patch + +from syrupy import SnapshotAssertion + +from homeassistant.const import Platform +from homeassistant.core import HomeAssistant +from homeassistant.helpers import entity_registry as er + +from . import setup_integration + +from tests.common import MockConfigEntry, snapshot_platform + + +async def test_all_entities( + hass: HomeAssistant, + snapshot: SnapshotAssertion, + mock_poolsense_client: AsyncMock, + mock_config_entry: MockConfigEntry, + entity_registry: er.EntityRegistry, +) -> None: + """Test all entities.""" + with patch( + "homeassistant.components.poolsense.PLATFORMS", + [Platform.BINARY_SENSOR], + ): + await setup_integration(hass, mock_config_entry) + await snapshot_platform( + hass, entity_registry, snapshot, mock_config_entry.entry_id + ) diff --git a/tests/components/poolsense/test_sensor.py b/tests/components/poolsense/test_sensor.py new file mode 100644 index 00000000000..7f088eee6a3 --- /dev/null +++ b/tests/components/poolsense/test_sensor.py @@ -0,0 +1,31 @@ +"""Test the PoolSense sensor module.""" + +from unittest.mock import AsyncMock, patch + +from syrupy import SnapshotAssertion + +from homeassistant.const import Platform +from homeassistant.core import HomeAssistant +from homeassistant.helpers import entity_registry as er + +from . import setup_integration + +from tests.common import MockConfigEntry, snapshot_platform + + +async def test_all_entities( + hass: HomeAssistant, + snapshot: SnapshotAssertion, + mock_poolsense_client: AsyncMock, + mock_config_entry: MockConfigEntry, + entity_registry: er.EntityRegistry, +) -> None: + """Test all entities.""" + with patch( + "homeassistant.components.poolsense.PLATFORMS", + [Platform.SENSOR], + ): + await setup_integration(hass, mock_config_entry) + await snapshot_platform( + hass, entity_registry, snapshot, mock_config_entry.entry_id + )