core/tests/components/version/test_sensor.py

131 lines
4.6 KiB
Python

"""The test for the version sensor platform."""
from datetime import timedelta
from unittest.mock import patch
from pyhaversion import HaVersionSource, exceptions as pyhaversionexceptions
import pytest
from homeassistant.components.version.sensor import HA_VERSION_SOURCES
from homeassistant.setup import async_setup_component
from homeassistant.util import dt
from tests.common import async_fire_time_changed
MOCK_VERSION = "10.0"
@pytest.mark.parametrize(
"source,target_source,name",
(
(
("local", HaVersionSource.LOCAL, "current_version"),
("docker", HaVersionSource.CONTAINER, "latest_version"),
("hassio", HaVersionSource.SUPERVISOR, "latest_version"),
)
+ tuple(
(source, HaVersionSource(source), "latest_version")
for source in HA_VERSION_SOURCES
if source != HaVersionSource.LOCAL
)
),
)
async def test_version_source(hass, source, target_source, name):
"""Test the Version sensor with different sources."""
config = {
"sensor": {"platform": "version", "source": source, "image": "qemux86-64"}
}
with patch("homeassistant.components.version.sensor.HaVersion.get_version"), patch(
"homeassistant.components.version.sensor.HaVersion.version", MOCK_VERSION
):
assert await async_setup_component(hass, "sensor", config)
await hass.async_block_till_done()
state = hass.states.get(f"sensor.{name}")
assert state
assert state.attributes["source"] == target_source
assert state.state == MOCK_VERSION
async def test_version_fetch_exception(hass, caplog):
"""Test fetch exception thrown during updates."""
config = {"sensor": {"platform": "version"}}
with patch(
"homeassistant.components.version.sensor.HaVersion.get_version",
side_effect=pyhaversionexceptions.HaVersionFetchException(
"Fetch exception from pyhaversion"
),
):
assert await async_setup_component(hass, "sensor", config)
await hass.async_block_till_done()
assert "Fetch exception from pyhaversion" in caplog.text
async def test_version_parse_exception(hass, caplog):
"""Test parse exception thrown during updates."""
config = {"sensor": {"platform": "version"}}
with patch(
"homeassistant.components.version.sensor.HaVersion.get_version",
side_effect=pyhaversionexceptions.HaVersionParseException,
):
assert await async_setup_component(hass, "sensor", config)
await hass.async_block_till_done()
assert "Could not parse data received for HaVersionSource.LOCAL" in caplog.text
async def test_update(hass):
"""Test updates."""
config = {"sensor": {"platform": "version"}}
with patch("homeassistant.components.version.sensor.HaVersion.get_version"), patch(
"homeassistant.components.version.sensor.HaVersion.version", MOCK_VERSION
):
assert await async_setup_component(hass, "sensor", config)
await hass.async_block_till_done()
state = hass.states.get("sensor.current_version")
assert state
assert state.state == MOCK_VERSION
with patch("homeassistant.components.version.sensor.HaVersion.get_version"), patch(
"homeassistant.components.version.sensor.HaVersion.version", "1234"
):
async_fire_time_changed(hass, dt.utcnow() + timedelta(minutes=5))
await hass.async_block_till_done()
state = hass.states.get("sensor.current_version")
assert state
assert state.state == "1234"
async def test_image_name_container(hass):
"""Test the Version sensor with image name for container."""
config = {
"sensor": {"platform": "version", "source": "docker", "image": "qemux86-64"}
}
with patch("homeassistant.components.version.sensor.HaVersion") as haversion:
assert await async_setup_component(hass, "sensor", config)
await hass.async_block_till_done()
constructor = haversion.call_args[1]
assert constructor["source"] == "container"
assert constructor["image"] == "qemux86-64-homeassistant"
async def test_image_name_supervisor(hass):
"""Test the Version sensor with image name for supervisor."""
config = {
"sensor": {"platform": "version", "source": "hassio", "image": "qemux86-64"}
}
with patch("homeassistant.components.version.sensor.HaVersion") as haversion:
assert await async_setup_component(hass, "sensor", config)
await hass.async_block_till_done()
constructor = haversion.call_args[1]
assert constructor["source"] == "supervisor"
assert constructor["image"] == "qemux86-64"