Skip to content

Commit

Permalink
Add sensor tests to Streamlabs water (home-assistant#107065)
Browse files Browse the repository at this point in the history
  • Loading branch information
joostlek authored Jan 4, 2024
1 parent 254abee commit 333711d
Show file tree
Hide file tree
Showing 7 changed files with 254 additions and 0 deletions.
6 changes: 6 additions & 0 deletions homeassistant/components/streamlabswater/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,13 @@ class StreamLabsDailyUsage(CoordinatorEntity[StreamlabsCoordinator], SensorEntit

_attr_device_class = SensorDeviceClass.WATER
_attr_native_unit_of_measurement = UnitOfVolume.GALLONS
_key = "daily_usage"

def __init__(self, coordinator: StreamlabsCoordinator, location_id: str) -> None:
"""Initialize the daily water usage device."""
super().__init__(coordinator)
self._location_id = location_id
self._attr_unique_id = f"{location_id}-{self._key}"

@property
def location_data(self) -> StreamlabsData:
Expand All @@ -69,6 +71,8 @@ def native_value(self) -> float:
class StreamLabsMonthlyUsage(StreamLabsDailyUsage):
"""Monitors the monthly water usage."""

_key = "monthly_usage"

@property
def name(self) -> str:
"""Return the name for monthly usage."""
Expand All @@ -83,6 +87,8 @@ def native_value(self) -> float:
class StreamLabsYearlyUsage(StreamLabsDailyUsage):
"""Monitors the yearly water usage."""

_key = "yearly_usage"

@property
def name(self) -> str:
"""Return the name for yearly usage."""
Expand Down
14 changes: 14 additions & 0 deletions tests/components/streamlabswater/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,15 @@
"""Tests for the StreamLabs integration."""
from homeassistant.core import HomeAssistant
from homeassistant.util.unit_system import IMPERIAL_SYSTEM

from tests.common import MockConfigEntry


async def setup_integration(hass: HomeAssistant, config_entry: MockConfigEntry) -> None:
"""Fixture for setting up the component."""
config_entry.add_to_hass(hass)

hass.config.units = IMPERIAL_SYSTEM

await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()
35 changes: 35 additions & 0 deletions tests/components/streamlabswater/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,12 @@
from unittest.mock import AsyncMock, patch

import pytest
from streamlabswater.streamlabswater import StreamlabsClient

from homeassistant.components.streamlabswater import DOMAIN
from homeassistant.const import CONF_API_KEY

from tests.common import MockConfigEntry, load_json_object_fixture


@pytest.fixture
Expand All @@ -12,3 +18,32 @@ def mock_setup_entry() -> Generator[AsyncMock, None, None]:
"homeassistant.components.streamlabswater.async_setup_entry", return_value=True
) as mock_setup_entry:
yield mock_setup_entry


@pytest.fixture
def mock_config_entry() -> MockConfigEntry:
"""Create a mock StreamLabs config entry."""
return MockConfigEntry(
domain=DOMAIN,
title="StreamLabs",
data={CONF_API_KEY: "abc"},
)


@pytest.fixture(name="streamlabswater")
def mock_streamlabswater() -> Generator[AsyncMock, None, None]:
"""Mock the StreamLabs client."""

locations = load_json_object_fixture("streamlabswater/get_locations.json")

water_usage = load_json_object_fixture("streamlabswater/water_usage.json")

mock = AsyncMock(spec=StreamlabsClient)
mock.get_locations.return_value = locations
mock.get_water_usage_summary.return_value = water_usage

with patch(
"homeassistant.components.streamlabswater.StreamlabsClient",
return_value=mock,
) as mock_client:
yield mock_client
24 changes: 24 additions & 0 deletions tests/components/streamlabswater/fixtures/get_locations.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{
"pageCount": 1,
"perPage": 50,
"page": 1,
"total": 1,
"locations": [
{
"locationId": "945e7c52-854a-41e1-8524-50c6993277e1",
"name": "Water Monitor",
"homeAway": "home",
"devices": [
{
"deviceId": "09bec87a-fff2-4b8a-bc00-86d5928f19f3",
"type": "monitor",
"calibrated": true,
"connected": true
}
],
"alerts": [],
"subscriptionIds": [],
"active": true
}
]
}
6 changes: 6 additions & 0 deletions tests/components/streamlabswater/fixtures/water_usage.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"thisYear": 65432.389256934,
"today": 200.44691536,
"units": "gallons",
"thisMonth": 420.514099294
}
136 changes: 136 additions & 0 deletions tests/components/streamlabswater/snapshots/test_sensor.ambr
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
# serializer version: 1
# name: test_all_entities[sensor.water_monitor_daily_water-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.water_monitor_daily_water',
'has_entity_name': False,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'name': None,
'options': dict({
}),
'original_device_class': <SensorDeviceClass.WATER: 'water'>,
'original_icon': None,
'original_name': 'Water Monitor Daily Water',
'platform': 'streamlabswater',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': '945e7c52-854a-41e1-8524-50c6993277e1-daily_usage',
'unit_of_measurement': <UnitOfVolume.GALLONS: 'gal'>,
})
# ---
# name: test_all_entities[sensor.water_monitor_daily_water-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'water',
'friendly_name': 'Water Monitor Daily Water',
'unit_of_measurement': <UnitOfVolume.GALLONS: 'gal'>,
}),
'context': <ANY>,
'entity_id': 'sensor.water_monitor_daily_water',
'last_changed': <ANY>,
'last_updated': <ANY>,
'state': '200.4',
})
# ---
# name: test_all_entities[sensor.water_monitor_monthly_water-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.water_monitor_monthly_water',
'has_entity_name': False,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'name': None,
'options': dict({
}),
'original_device_class': <SensorDeviceClass.WATER: 'water'>,
'original_icon': None,
'original_name': 'Water Monitor Monthly Water',
'platform': 'streamlabswater',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': '945e7c52-854a-41e1-8524-50c6993277e1-monthly_usage',
'unit_of_measurement': <UnitOfVolume.GALLONS: 'gal'>,
})
# ---
# name: test_all_entities[sensor.water_monitor_monthly_water-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'water',
'friendly_name': 'Water Monitor Monthly Water',
'unit_of_measurement': <UnitOfVolume.GALLONS: 'gal'>,
}),
'context': <ANY>,
'entity_id': 'sensor.water_monitor_monthly_water',
'last_changed': <ANY>,
'last_updated': <ANY>,
'state': '420.5',
})
# ---
# name: test_all_entities[sensor.water_monitor_yearly_water-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.water_monitor_yearly_water',
'has_entity_name': False,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'name': None,
'options': dict({
}),
'original_device_class': <SensorDeviceClass.WATER: 'water'>,
'original_icon': None,
'original_name': 'Water Monitor Yearly Water',
'platform': 'streamlabswater',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': '945e7c52-854a-41e1-8524-50c6993277e1-yearly_usage',
'unit_of_measurement': <UnitOfVolume.GALLONS: 'gal'>,
})
# ---
# name: test_all_entities[sensor.water_monitor_yearly_water-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'water',
'friendly_name': 'Water Monitor Yearly Water',
'unit_of_measurement': <UnitOfVolume.GALLONS: 'gal'>,
}),
'context': <ANY>,
'entity_id': 'sensor.water_monitor_yearly_water',
'last_changed': <ANY>,
'last_updated': <ANY>,
'state': '65432.4',
})
# ---
33 changes: 33 additions & 0 deletions tests/components/streamlabswater/test_sensor.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
"""Tests for the Streamlabs Water sensor platform."""
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 tests.common import MockConfigEntry
from tests.components.streamlabswater import setup_integration


async def test_all_entities(
hass: HomeAssistant,
snapshot: SnapshotAssertion,
streamlabswater: AsyncMock,
mock_config_entry: MockConfigEntry,
entity_registry: er.EntityRegistry,
) -> None:
"""Test all entities."""
with patch("homeassistant.components.streamlabswater.PLATFORMS", [Platform.SENSOR]):
await setup_integration(hass, mock_config_entry)
entity_entries = er.async_entries_for_config_entry(
entity_registry, mock_config_entry.entry_id
)

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"
)

0 comments on commit 333711d

Please sign in to comment.