Add tests for initial state of OpenUV sensors (#146464)

This is a followup to #146408 to add test coverage.
This commit is contained in:
Whitney Young 2025-06-10 10:28:29 -07:00 committed by GitHub
parent 936d56f9af
commit 87ce683b39
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 652 additions and 1 deletions

View File

@ -24,6 +24,14 @@ TEST_LATITUDE = 51.528308
TEST_LONGITUDE = -0.3817765
@pytest.fixture
async def set_time_zone(hass: HomeAssistant) -> None:
"""Set the time zone for the tests."""
# Set our timezone to CST/Regina so we can check calculations
# This keeps UTC-6 all year round
await hass.config.async_set_time_zone("America/Regina")
@pytest.fixture
def mock_setup_entry() -> Generator[AsyncMock]:
"""Override async_setup_entry."""
@ -37,6 +45,8 @@ def mock_setup_entry() -> Generator[AsyncMock]:
def client_fixture(data_protection_window, data_uv_index):
"""Define a mock Client object."""
return Mock(
latitude=TEST_LATITUDE,
longitude=TEST_LONGITUDE,
uv_index=AsyncMock(return_value=data_uv_index),
uv_protection_window=AsyncMock(return_value=data_protection_window),
)
@ -81,7 +91,7 @@ def data_uv_index_fixture():
@pytest.fixture(name="mock_pyopenuv")
async def mock_pyopenuv_fixture(client):
async def mock_pyopenuv_fixture(client, set_time_zone):
"""Define a fixture to patch pyopenuv."""
with (
patch(

View File

@ -0,0 +1,53 @@
# serializer version: 1
# name: test_binary_sensors[binary_sensor.openuv_protection_window-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'binary_sensor',
'entity_category': None,
'entity_id': 'binary_sensor.openuv_protection_window',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Protection window',
'platform': 'openuv',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'protection_window',
'unique_id': '51.528308_-0.3817765_uv_protection_window',
'unit_of_measurement': None,
})
# ---
# name: test_binary_sensors[binary_sensor.openuv_protection_window-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'end_time': datetime.datetime(2018, 7, 30, 16, 47, 49, 750000, tzinfo=zoneinfo.ZoneInfo(key='America/Regina')),
'end_uv': 3.6483,
'friendly_name': 'OpenUV Protection window',
'start_time': datetime.datetime(2018, 7, 30, 9, 17, 49, 750000, tzinfo=zoneinfo.ZoneInfo(key='America/Regina')),
'start_uv': 3.2509,
}),
'context': <ANY>,
'entity_id': 'binary_sensor.openuv_protection_window',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'off',
})
# ---

View File

@ -0,0 +1,534 @@
# serializer version: 1
# name: test_sensors[sensor.openuv_current_ozone_level-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.openuv_current_ozone_level',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Current ozone level',
'platform': 'openuv',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'current_ozone_level',
'unique_id': '51.528308_-0.3817765_current_ozone_level',
'unit_of_measurement': 'du',
})
# ---
# name: test_sensors[sensor.openuv_current_ozone_level-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'OpenUV Current ozone level',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': 'du',
}),
'context': <ANY>,
'entity_id': 'sensor.openuv_current_ozone_level',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '300.7',
})
# ---
# name: test_sensors[sensor.openuv_current_uv_index-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.openuv_current_uv_index',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Current UV index',
'platform': 'openuv',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'current_uv_index',
'unique_id': '51.528308_-0.3817765_current_uv_index',
'unit_of_measurement': 'UV index',
})
# ---
# name: test_sensors[sensor.openuv_current_uv_index-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'OpenUV Current UV index',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': 'UV index',
}),
'context': <ANY>,
'entity_id': 'sensor.openuv_current_uv_index',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '8.2342',
})
# ---
# name: test_sensors[sensor.openuv_current_uv_level-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'options': list([
'extreme',
'very_high',
'high',
'moderate',
'low',
]),
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.openuv_current_uv_level',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <SensorDeviceClass.ENUM: 'enum'>,
'original_icon': None,
'original_name': 'Current UV level',
'platform': 'openuv',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'current_uv_level',
'unique_id': '51.528308_-0.3817765_current_uv_level',
'unit_of_measurement': None,
})
# ---
# name: test_sensors[sensor.openuv_current_uv_level-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'enum',
'friendly_name': 'OpenUV Current UV level',
'options': list([
'extreme',
'very_high',
'high',
'moderate',
'low',
]),
}),
'context': <ANY>,
'entity_id': 'sensor.openuv_current_uv_level',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'very_high',
})
# ---
# name: test_sensors[sensor.openuv_max_uv_index-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.openuv_max_uv_index',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Max UV index',
'platform': 'openuv',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'max_uv_index',
'unique_id': '51.528308_-0.3817765_max_uv_index',
'unit_of_measurement': 'UV index',
})
# ---
# name: test_sensors[sensor.openuv_max_uv_index-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'OpenUV Max UV index',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'time': datetime.datetime(2018, 7, 30, 13, 7, 11, 505000, tzinfo=zoneinfo.ZoneInfo(key='America/Regina')),
'unit_of_measurement': 'UV index',
}),
'context': <ANY>,
'entity_id': 'sensor.openuv_max_uv_index',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '10.3335',
})
# ---
# name: test_sensors[sensor.openuv_skin_type_1_safe_exposure_time-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.openuv_skin_type_1_safe_exposure_time',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Skin type 1 safe exposure time',
'platform': 'openuv',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'skin_type_1_safe_exposure_time',
'unique_id': '51.528308_-0.3817765_safe_exposure_time_type_1',
'unit_of_measurement': <UnitOfTime.MINUTES: 'min'>,
})
# ---
# name: test_sensors[sensor.openuv_skin_type_1_safe_exposure_time-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'OpenUV Skin type 1 safe exposure time',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': <UnitOfTime.MINUTES: 'min'>,
}),
'context': <ANY>,
'entity_id': 'sensor.openuv_skin_type_1_safe_exposure_time',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '20',
})
# ---
# name: test_sensors[sensor.openuv_skin_type_2_safe_exposure_time-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.openuv_skin_type_2_safe_exposure_time',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Skin type 2 safe exposure time',
'platform': 'openuv',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'skin_type_2_safe_exposure_time',
'unique_id': '51.528308_-0.3817765_safe_exposure_time_type_2',
'unit_of_measurement': <UnitOfTime.MINUTES: 'min'>,
})
# ---
# name: test_sensors[sensor.openuv_skin_type_2_safe_exposure_time-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'OpenUV Skin type 2 safe exposure time',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': <UnitOfTime.MINUTES: 'min'>,
}),
'context': <ANY>,
'entity_id': 'sensor.openuv_skin_type_2_safe_exposure_time',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '24',
})
# ---
# name: test_sensors[sensor.openuv_skin_type_3_safe_exposure_time-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.openuv_skin_type_3_safe_exposure_time',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Skin type 3 safe exposure time',
'platform': 'openuv',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'skin_type_3_safe_exposure_time',
'unique_id': '51.528308_-0.3817765_safe_exposure_time_type_3',
'unit_of_measurement': <UnitOfTime.MINUTES: 'min'>,
})
# ---
# name: test_sensors[sensor.openuv_skin_type_3_safe_exposure_time-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'OpenUV Skin type 3 safe exposure time',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': <UnitOfTime.MINUTES: 'min'>,
}),
'context': <ANY>,
'entity_id': 'sensor.openuv_skin_type_3_safe_exposure_time',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '32',
})
# ---
# name: test_sensors[sensor.openuv_skin_type_4_safe_exposure_time-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.openuv_skin_type_4_safe_exposure_time',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Skin type 4 safe exposure time',
'platform': 'openuv',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'skin_type_4_safe_exposure_time',
'unique_id': '51.528308_-0.3817765_safe_exposure_time_type_4',
'unit_of_measurement': <UnitOfTime.MINUTES: 'min'>,
})
# ---
# name: test_sensors[sensor.openuv_skin_type_4_safe_exposure_time-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'OpenUV Skin type 4 safe exposure time',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': <UnitOfTime.MINUTES: 'min'>,
}),
'context': <ANY>,
'entity_id': 'sensor.openuv_skin_type_4_safe_exposure_time',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '40',
})
# ---
# name: test_sensors[sensor.openuv_skin_type_5_safe_exposure_time-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.openuv_skin_type_5_safe_exposure_time',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Skin type 5 safe exposure time',
'platform': 'openuv',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'skin_type_5_safe_exposure_time',
'unique_id': '51.528308_-0.3817765_safe_exposure_time_type_5',
'unit_of_measurement': <UnitOfTime.MINUTES: 'min'>,
})
# ---
# name: test_sensors[sensor.openuv_skin_type_5_safe_exposure_time-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'OpenUV Skin type 5 safe exposure time',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': <UnitOfTime.MINUTES: 'min'>,
}),
'context': <ANY>,
'entity_id': 'sensor.openuv_skin_type_5_safe_exposure_time',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '65',
})
# ---
# name: test_sensors[sensor.openuv_skin_type_6_safe_exposure_time-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.openuv_skin_type_6_safe_exposure_time',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Skin type 6 safe exposure time',
'platform': 'openuv',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'skin_type_6_safe_exposure_time',
'unique_id': '51.528308_-0.3817765_safe_exposure_time_type_6',
'unit_of_measurement': <UnitOfTime.MINUTES: 'min'>,
})
# ---
# name: test_sensors[sensor.openuv_skin_type_6_safe_exposure_time-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'OpenUV Skin type 6 safe exposure time',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': <UnitOfTime.MINUTES: 'min'>,
}),
'context': <ANY>,
'entity_id': 'sensor.openuv_skin_type_6_safe_exposure_time',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '121',
})
# ---

View File

@ -0,0 +1,27 @@
"""Test OpenUV binary sensors."""
from typing import Literal
from unittest.mock import patch
from syrupy.assertion 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, snapshot_platform
async def test_binary_sensors(
hass: HomeAssistant,
config_entry: MockConfigEntry,
mock_pyopenuv: Literal[None],
snapshot: SnapshotAssertion,
entity_registry: er.EntityRegistry,
) -> None:
"""Test all binary sensors created by the integration."""
with patch("homeassistant.components.openuv.PLATFORMS", [Platform.BINARY_SENSOR]):
assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()
await snapshot_platform(hass, entity_registry, snapshot, config_entry.entry_id)

View File

@ -0,0 +1,27 @@
"""Test OpenUV sensors."""
from typing import Literal
from unittest.mock import patch
from syrupy.assertion 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, snapshot_platform
async def test_sensors(
hass: HomeAssistant,
config_entry: MockConfigEntry,
mock_pyopenuv: Literal[None],
snapshot: SnapshotAssertion,
entity_registry: er.EntityRegistry,
) -> None:
"""Test all sensors created by the integration."""
with patch("homeassistant.components.openuv.PLATFORMS", [Platform.SENSOR]):
assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()
await snapshot_platform(hass, entity_registry, snapshot, config_entry.entry_id)