core/tests/components/co2signal/test_sensor.py

113 lines
3.5 KiB
Python

"""Tests Electricity Maps sensor platform."""
from datetime import timedelta
from unittest.mock import AsyncMock
from aioelectricitymaps import (
ElectricityMapsConnectionError,
ElectricityMapsConnectionTimeoutError,
ElectricityMapsError,
ElectricityMapsInvalidTokenError,
)
from freezegun.api import FrozenDateTimeFactory
import pytest
from syrupy import SnapshotAssertion
from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er
from tests.common import async_fire_time_changed
@pytest.mark.parametrize(
"entity_name",
[
"sensor.electricity_maps_co2_intensity",
"sensor.electricity_maps_grid_fossil_fuel_percentage",
],
)
@pytest.mark.usefixtures("setup_integration")
async def test_sensor(
hass: HomeAssistant,
entity_registry: er.EntityRegistry,
entity_name: str,
snapshot: SnapshotAssertion,
) -> None:
"""Test sensor setup and update."""
assert (entry := entity_registry.async_get(entity_name))
assert entry == snapshot
assert (state := hass.states.get(entity_name))
assert state == snapshot
@pytest.mark.parametrize(
"error",
[
ElectricityMapsConnectionTimeoutError,
ElectricityMapsConnectionError,
ElectricityMapsError,
Exception,
],
)
@pytest.mark.usefixtures("setup_integration")
async def test_sensor_update_fail(
hass: HomeAssistant,
freezer: FrozenDateTimeFactory,
electricity_maps: AsyncMock,
error: Exception,
) -> None:
"""Test sensor error handling."""
assert (state := hass.states.get("sensor.electricity_maps_co2_intensity"))
assert state.state == "45.9862319009581"
assert len(electricity_maps.mock_calls) == 1
electricity_maps.latest_carbon_intensity_by_coordinates.side_effect = error
electricity_maps.latest_carbon_intensity_by_country_code.side_effect = error
freezer.tick(timedelta(minutes=20))
async_fire_time_changed(hass)
await hass.async_block_till_done()
assert (state := hass.states.get("sensor.electricity_maps_co2_intensity"))
assert state.state == "unavailable"
assert len(electricity_maps.mock_calls) == 2
# reset mock and test if entity is available again
electricity_maps.latest_carbon_intensity_by_coordinates.side_effect = None
electricity_maps.latest_carbon_intensity_by_country_code.side_effect = None
freezer.tick(timedelta(minutes=20))
async_fire_time_changed(hass)
await hass.async_block_till_done()
assert (state := hass.states.get("sensor.electricity_maps_co2_intensity"))
assert state.state == "45.9862319009581"
assert len(electricity_maps.mock_calls) == 3
@pytest.mark.usefixtures("setup_integration")
async def test_sensor_reauth_triggered(
hass: HomeAssistant,
freezer: FrozenDateTimeFactory,
electricity_maps: AsyncMock,
) -> None:
"""Test if reauth flow is triggered."""
assert (state := hass.states.get("sensor.electricity_maps_co2_intensity"))
assert state.state == "45.9862319009581"
electricity_maps.latest_carbon_intensity_by_coordinates.side_effect = (
ElectricityMapsInvalidTokenError
)
electricity_maps.latest_carbon_intensity_by_country_code.side_effect = (
ElectricityMapsInvalidTokenError
)
freezer.tick(timedelta(minutes=20))
async_fire_time_changed(hass)
await hass.async_block_till_done()
assert (flows := hass.config_entries.flow.async_progress())
assert len(flows) == 1
assert flows[0]["step_id"] == "reauth_confirm"