diff --git a/.coveragerc b/.coveragerc index 6d042b3f46e..bf26b41649d 100644 --- a/.coveragerc +++ b/.coveragerc @@ -420,9 +420,6 @@ omit = homeassistant/components/harmony/data.py homeassistant/components/harmony/remote.py homeassistant/components/harmony/util.py - homeassistant/components/hassio/binary_sensor.py - homeassistant/components/hassio/entity.py - homeassistant/components/hassio/sensor.py homeassistant/components/haveibeenpwned/sensor.py homeassistant/components/hdmi_cec/* homeassistant/components/heatmiser/climate.py diff --git a/tests/components/hassio/test_binary_sensor.py b/tests/components/hassio/test_binary_sensor.py new file mode 100644 index 00000000000..e4263eb5529 --- /dev/null +++ b/tests/components/hassio/test_binary_sensor.py @@ -0,0 +1,156 @@ +"""The tests for the hassio binary sensors.""" + +import os +from unittest.mock import patch + +import pytest + +from homeassistant.components.hassio import DOMAIN +from homeassistant.helpers import entity_registry +from homeassistant.setup import async_setup_component + +from tests.common import MockConfigEntry + +MOCK_ENVIRON = {"HASSIO": "127.0.0.1", "HASSIO_TOKEN": "abcdefgh"} + + +@pytest.fixture(autouse=True) +def mock_all(aioclient_mock, request): + """Mock all setup requests.""" + aioclient_mock.post("http://127.0.0.1/homeassistant/options", json={"result": "ok"}) + aioclient_mock.get("http://127.0.0.1/supervisor/ping", json={"result": "ok"}) + aioclient_mock.post("http://127.0.0.1/supervisor/options", json={"result": "ok"}) + aioclient_mock.get( + "http://127.0.0.1/info", + json={ + "result": "ok", + "data": {"supervisor": "222", "homeassistant": "0.110.0", "hassos": None}, + }, + ) + aioclient_mock.get( + "http://127.0.0.1/store", + json={ + "result": "ok", + "data": {"addons": [], "repositories": []}, + }, + ) + aioclient_mock.get( + "http://127.0.0.1/host/info", + json={ + "result": "ok", + "data": { + "result": "ok", + "data": { + "chassis": "vm", + "operating_system": "Debian GNU/Linux 10 (buster)", + "kernel": "4.19.0-6-amd64", + }, + }, + }, + ) + aioclient_mock.get( + "http://127.0.0.1/core/info", + json={"result": "ok", "data": {"version_latest": "1.0.0", "version": "1.0.0"}}, + ) + aioclient_mock.get( + "http://127.0.0.1/os/info", + json={ + "result": "ok", + "data": { + "version_latest": "1.0.0", + "version": "1.0.0", + "update_available": False, + }, + }, + ) + aioclient_mock.get( + "http://127.0.0.1/supervisor/info", + json={ + "result": "ok", + "data": { + "result": "ok", + "version_latest": "1.0.0", + "addons": [ + { + "name": "test", + "state": "started", + "slug": "test", + "installed": True, + "update_available": True, + "version": "2.0.0", + "version_latest": "2.0.1", + "repository": "core", + "url": "https://github.com/home-assistant/addons/test", + }, + { + "name": "test2", + "state": "stopped", + "slug": "test2", + "installed": True, + "update_available": False, + "version": "3.1.0", + "version_latest": "3.1.0", + "repository": "core", + "url": "https://github.com", + }, + ], + }, + }, + ) + aioclient_mock.get( + "http://127.0.0.1/addons/test/stats", + json={ + "result": "ok", + "data": { + "cpu_percent": 0.99, + "memory_usage": 182611968, + "memory_limit": 3977146368, + "memory_percent": 4.59, + "network_rx": 362570232, + "network_tx": 82374138, + "blk_read": 46010945536, + "blk_write": 15051526144, + }, + }, + ) + aioclient_mock.get( + "http://127.0.0.1/ingress/panels", json={"result": "ok", "data": {"panels": {}}} + ) + + +@pytest.mark.parametrize( + "entity_id,expected", + [ + ("binary_sensor.home_assistant_operating_system_update_available", "off"), + ("binary_sensor.test_update_available", "on"), + ("binary_sensor.test2_update_available", "off"), + ("binary_sensor.test_running", "on"), + ("binary_sensor.test2_running", "off"), + ], +) +async def test_binary_sensor(hass, entity_id, expected, aioclient_mock): + """Test hassio OS and addons binary sensor.""" + config_entry = MockConfigEntry(domain=DOMAIN, data={}, unique_id=DOMAIN) + config_entry.add_to_hass(hass) + + with patch.dict(os.environ, MOCK_ENVIRON): + result = await async_setup_component( + hass, + "hassio", + {"http": {"server_port": 9999, "server_host": "127.0.0.1"}, "hassio": {}}, + ) + assert result + await hass.async_block_till_done() + + # Verify that the entity is disabled by default. + assert hass.states.get(entity_id) is None + + # Enable the entity. + ent_reg = entity_registry.async_get(hass) + ent_reg.async_update_entity(entity_id, disabled_by=None) + await hass.config_entries.async_reload(config_entry.entry_id) + await hass.async_block_till_done() + + # Verify that the entity have the expected state. + state = hass.states.get(entity_id) + assert state.state == expected diff --git a/tests/components/hassio/test_init.py b/tests/components/hassio/test_init.py index f5214b563b3..417fc77b527 100644 --- a/tests/components/hassio/test_init.py +++ b/tests/components/hassio/test_init.py @@ -59,7 +59,7 @@ def mock_all(aioclient_mock, request): ) aioclient_mock.get( "http://127.0.0.1/os/info", - json={"result": "ok", "data": {"version_latest": "1.0.0"}}, + json={"result": "ok", "data": {"version_latest": "1.0.0", "version": "1.0.0"}}, ) aioclient_mock.get( "http://127.0.0.1/supervisor/info", diff --git a/tests/components/hassio/test_sensor.py b/tests/components/hassio/test_sensor.py index 00d2c32c520..481ba1b578f 100644 --- a/tests/components/hassio/test_sensor.py +++ b/tests/components/hassio/test_sensor.py @@ -111,8 +111,25 @@ def mock_all(aioclient_mock, request): ) -async def test_sensors(hass, aioclient_mock): - """Test hassio OS and addons sensors.""" +@pytest.mark.parametrize( + "entity_id,expected", + [ + ("sensor.home_assistant_operating_system_version", "1.0.0"), + ("sensor.home_assistant_operating_system_newest_version", "1.0.0"), + ("sensor.test_version", "2.0.0"), + ("sensor.test_newest_version", "2.0.1"), + ("sensor.test2_version", "3.1.0"), + ("sensor.test2_newest_version", "3.2.0"), + ("sensor.test_cpu_percent", "0.99"), + ("sensor.test2_cpu_percent", "unavailable"), + ("sensor.test_memory_percent", "4.59"), + ("sensor.test2_memory_percent", "unavailable"), + ], +) +async def test_sensor(hass, entity_id, expected, aioclient_mock): + """Test hassio OS and addons sensor.""" + config_entry = MockConfigEntry(domain=DOMAIN, data={}, unique_id=DOMAIN) + config_entry.add_to_hass(hass) with patch.dict(os.environ, MOCK_ENVIRON): result = await async_setup_component( @@ -121,38 +138,17 @@ async def test_sensors(hass, aioclient_mock): {"http": {"server_port": 9999, "server_host": "127.0.0.1"}, "hassio": {}}, ) assert result - - config_entry = MockConfigEntry(domain=DOMAIN, data={}, unique_id=DOMAIN) - config_entry.add_to_hass(hass) - await hass.async_block_till_done() - sensors = { - "sensor.home_assistant_operating_system_version": "1.0.0", - "sensor.home_assistant_operating_system_newest_version": "1.0.0", - "sensor.test_version": "2.0.0", - "sensor.test_newest_version": "2.0.1", - "sensor.test2_version": "3.1.0", - "sensor.test2_newest_version": "3.2.0", - "sensor.test_cpu_percent": "0.99", - "sensor.test2_cpu_percent": "unavailable", - "sensor.test_memory_percent": "4.59", - "sensor.test2_memory_percent": "unavailable", - } + # Verify that the entity is disabled by default. + assert hass.states.get(entity_id) is None - """Check that entities are disabled by default.""" - for sensor in sensors: - assert hass.states.get(sensor) is None - - """Enable sensors.""" + # Enable the entity. ent_reg = entity_registry.async_get(hass) - for sensor in sensors: - ent_reg.async_update_entity(sensor, disabled_by=None) + ent_reg.async_update_entity(entity_id, disabled_by=None) await hass.config_entries.async_reload(config_entry.entry_id) - await hass.async_block_till_done() - """Check sensor values.""" - for sensor, value in sensors.items(): - state = hass.states.get(sensor) - assert state.state == value + # Verify that the entity have the expected state. + state = hass.states.get(entity_id) + assert state.state == expected