From d50e4f6645aa1781d067f4ad8cbd44c5c2d59c4f Mon Sep 17 00:00:00 2001 From: Sid <27780930+autinerd@users.noreply.github.com> Date: Wed, 6 Mar 2024 20:22:08 +0100 Subject: [PATCH] Add snapshot tests to webmin (#112518) add snapshot tests to webmin --- .coveragerc | 1 - tests/components/webmin/conftest.py | 19 +- .../webmin/snapshots/test_sensor.ambr | 369 ++++++++++++++++++ tests/components/webmin/test_init.py | 16 +- tests/components/webmin/test_sensor.py | 28 ++ 5 files changed, 417 insertions(+), 16 deletions(-) create mode 100644 tests/components/webmin/snapshots/test_sensor.ambr create mode 100644 tests/components/webmin/test_sensor.py diff --git a/.coveragerc b/.coveragerc index 55179b740cf..72021c60ac1 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1592,7 +1592,6 @@ omit = homeassistant/components/weatherflow_cloud/const.py homeassistant/components/weatherflow_cloud/coordinator.py homeassistant/components/weatherflow_cloud/weather.py - homeassistant/components/webmin/sensor.py homeassistant/components/wiffi/__init__.py homeassistant/components/wiffi/binary_sensor.py homeassistant/components/wiffi/sensor.py diff --git a/tests/components/webmin/conftest.py b/tests/components/webmin/conftest.py index 196ce40408d..b41e31be574 100644 --- a/tests/components/webmin/conftest.py +++ b/tests/components/webmin/conftest.py @@ -4,7 +4,7 @@ from unittest.mock import AsyncMock, patch import pytest -from homeassistant.components.webmin.const import DEFAULT_PORT +from homeassistant.components.webmin.const import DEFAULT_PORT, DOMAIN from homeassistant.const import ( CONF_HOST, CONF_PASSWORD, @@ -13,6 +13,9 @@ from homeassistant.const import ( CONF_USERNAME, CONF_VERIFY_SSL, ) +from homeassistant.core import HomeAssistant + +from tests.common import MockConfigEntry, load_json_object_fixture TEST_USER_INPUT = { CONF_HOST: "192.168.1.1", @@ -31,3 +34,17 @@ def mock_setup_entry() -> Generator[AsyncMock, None, None]: "homeassistant.components.webmin.async_setup_entry", return_value=True ) as mock_setup: yield mock_setup + + +async def async_init_integration(hass: HomeAssistant) -> MockConfigEntry: + """Set up the Webmin integration in Home Assistant.""" + entry = MockConfigEntry(domain=DOMAIN, options=TEST_USER_INPUT, title="name") + entry.add_to_hass(hass) + + with patch( + "homeassistant.components.webmin.helpers.WebminInstance.update", + return_value=load_json_object_fixture("webmin_update.json", DOMAIN), + ): + await hass.config_entries.async_setup(entry.entry_id) + await hass.async_block_till_done() + return entry diff --git a/tests/components/webmin/snapshots/test_sensor.ambr b/tests/components/webmin/snapshots/test_sensor.ambr new file mode 100644 index 00000000000..285bcdf1f9b --- /dev/null +++ b/tests/components/webmin/snapshots/test_sensor.ambr @@ -0,0 +1,369 @@ +# serializer version: 1 +# name: test_sensor[sensor.192_168_1_1_load_15m-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.192_168_1_1_load_15m', + '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': 'Load (15m)', + 'platform': 'webmin', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'load_15m', + 'unique_id': '12:34:56:78:9a:bc_load_15m', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensor[sensor.192_168_1_1_load_15m-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': '192.168.1.1 Load (15m)', + 'state_class': , + }), + 'context': , + 'entity_id': 'sensor.192_168_1_1_load_15m', + 'last_changed': , + 'last_updated': , + 'state': '1.0', + }) +# --- +# name: test_sensor[sensor.192_168_1_1_load_1m-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.192_168_1_1_load_1m', + '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': 'Load (1m)', + 'platform': 'webmin', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'load_1m', + 'unique_id': '12:34:56:78:9a:bc_load_1m', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensor[sensor.192_168_1_1_load_1m-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': '192.168.1.1 Load (1m)', + 'state_class': , + }), + 'context': , + 'entity_id': 'sensor.192_168_1_1_load_1m', + 'last_changed': , + 'last_updated': , + 'state': '0.98', + }) +# --- +# name: test_sensor[sensor.192_168_1_1_load_5m-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.192_168_1_1_load_5m', + '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': 'Load (5m)', + 'platform': 'webmin', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'load_5m', + 'unique_id': '12:34:56:78:9a:bc_load_5m', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensor[sensor.192_168_1_1_load_5m-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': '192.168.1.1 Load (5m)', + 'state_class': , + }), + 'context': , + 'entity_id': 'sensor.192_168_1_1_load_5m', + 'last_changed': , + 'last_updated': , + 'state': '1.02', + }) +# --- +# name: test_sensor[sensor.192_168_1_1_memory_free-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.192_168_1_1_memory_free', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + 'sensor.private': dict({ + 'suggested_unit_of_measurement': , + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Memory free', + 'platform': 'webmin', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'mem_free', + 'unique_id': '12:34:56:78:9a:bc_mem_free', + 'unit_of_measurement': , + }) +# --- +# name: test_sensor[sensor.192_168_1_1_memory_free-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'data_size', + 'friendly_name': '192.168.1.1 Memory free', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.192_168_1_1_memory_free', + 'last_changed': , + 'last_updated': , + 'state': '24.9505462646484', + }) +# --- +# name: test_sensor[sensor.192_168_1_1_memory_total-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.192_168_1_1_memory_total', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + 'sensor.private': dict({ + 'suggested_unit_of_measurement': , + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Memory total', + 'platform': 'webmin', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'mem_total', + 'unique_id': '12:34:56:78:9a:bc_mem_total', + 'unit_of_measurement': , + }) +# --- +# name: test_sensor[sensor.192_168_1_1_memory_total-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'data_size', + 'friendly_name': '192.168.1.1 Memory total', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.192_168_1_1_memory_total', + 'last_changed': , + 'last_updated': , + 'state': '31.2490539550781', + }) +# --- +# name: test_sensor[sensor.192_168_1_1_swap_free-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.192_168_1_1_swap_free', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + 'sensor.private': dict({ + 'suggested_unit_of_measurement': , + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Swap free', + 'platform': 'webmin', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'swap_free', + 'unique_id': '12:34:56:78:9a:bc_swap_free', + 'unit_of_measurement': , + }) +# --- +# name: test_sensor[sensor.192_168_1_1_swap_free-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'data_size', + 'friendly_name': '192.168.1.1 Swap free', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.192_168_1_1_swap_free', + 'last_changed': , + 'last_updated': , + 'state': '1.86260986328125', + }) +# --- +# name: test_sensor[sensor.192_168_1_1_swap_total-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.192_168_1_1_swap_total', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + 'sensor.private': dict({ + 'suggested_unit_of_measurement': , + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Swap total', + 'platform': 'webmin', + 'previous_unique_id': None, + 'supported_features': 0, + 'translation_key': 'swap_total', + 'unique_id': '12:34:56:78:9a:bc_swap_total', + 'unit_of_measurement': , + }) +# --- +# name: test_sensor[sensor.192_168_1_1_swap_total-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'data_size', + 'friendly_name': '192.168.1.1 Swap total', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.192_168_1_1_swap_total', + 'last_changed': , + 'last_updated': , + 'state': '1.86260986328125', + }) +# --- diff --git a/tests/components/webmin/test_init.py b/tests/components/webmin/test_init.py index 21963a2120c..4a6e7ce4994 100644 --- a/tests/components/webmin/test_init.py +++ b/tests/components/webmin/test_init.py @@ -1,28 +1,16 @@ """Tests for the Webmin integration.""" -from unittest.mock import patch - from homeassistant.components.webmin.const import DOMAIN from homeassistant.config_entries import ConfigEntryState from homeassistant.core import HomeAssistant -from .conftest import TEST_USER_INPUT - -from tests.common import MockConfigEntry, load_json_object_fixture +from .conftest import async_init_integration async def test_unload_entry(hass: HomeAssistant) -> None: """Test successful unload of entry.""" - entry = MockConfigEntry(domain=DOMAIN, options=TEST_USER_INPUT, title="name") - entry.add_to_hass(hass) + entry = await async_init_integration(hass) - with patch( - "homeassistant.components.webmin.helpers.WebminInstance.update", - return_value=load_json_object_fixture("webmin_update.json", DOMAIN), - ): - await hass.config_entries.async_setup(entry.entry_id) - - await hass.async_block_till_done() assert entry.state is ConfigEntryState.LOADED assert await hass.config_entries.async_unload(entry.entry_id) diff --git a/tests/components/webmin/test_sensor.py b/tests/components/webmin/test_sensor.py new file mode 100644 index 00000000000..528aebca990 --- /dev/null +++ b/tests/components/webmin/test_sensor.py @@ -0,0 +1,28 @@ +"""Test cases for the Webmin sensors.""" +import pytest +from syrupy.assertion import SnapshotAssertion + +from homeassistant.core import HomeAssistant +from homeassistant.helpers import entity_registry as er + +from .conftest import async_init_integration + + +@pytest.mark.usefixtures("entity_registry_enabled_by_default") +async def test_sensor( + hass: HomeAssistant, + entity_registry: er.EntityRegistry, + snapshot: SnapshotAssertion, +) -> None: + """Test the sensor entities and states.""" + + entry = await async_init_integration(hass) + + entity_entries = er.async_entries_for_config_entry(entity_registry, entry.entry_id) + + assert entity_entries + + for entity_entry in entity_entries: + assert entity_entry == snapshot(name=f"{entity_entry.entity_id}-entry") + assert (state := hass.states.get(entity_entry.entity_id)) + assert state == snapshot(name=f"{entity_entry.entity_id}-state")