async def test_price_extract(day_str, num_prices, num_calls, num_prices_8h, available_8h): """Test data parsing of official API files.""" day = datetime.fromisoformat(day_str) mock_session = MockAsyncSession() pvpc_data = PVPCData( local_timezone=_TZ_TEST, tariff="discrimination", websession=mock_session, ) pvpc_data.source_available = True assert not pvpc_data.process_state_and_attributes(day) await pvpc_data.async_update_prices(day) has_prices = pvpc_data.process_state_and_attributes(day) assert len(pvpc_data._current_prices) == num_prices assert mock_session.call_count == num_calls assert has_prices has_prices = pvpc_data.process_state_and_attributes(day + timedelta(hours=10)) assert len(pvpc_data._current_prices) == num_prices_8h assert has_prices == available_8h
async def test_bad_downloads( available, day_str, num_log_msgs, status, exception, caplog, ): """Test data parsing of official API files.""" day = datetime.fromisoformat(day_str) mock_session = MockAsyncSession(status=status, exc=exception) with caplog.at_level(logging.DEBUG): pvpc_data = PVPCData( local_timezone=REFERENCE_TZ, tariff="normal", websession=mock_session, ) pvpc_data.source_available = available assert not pvpc_data.process_state_and_attributes(day) prices = await pvpc_data.async_update_prices(day) assert not prices assert not pvpc_data.process_state_and_attributes(day) assert len(caplog.messages) == num_log_msgs assert mock_session.call_count == 1 assert len(prices) == 0
class ElecPricesDataUpdateCoordinator(DataUpdateCoordinator[Mapping[datetime, float]]): """Class to manage fetching Electricity prices data from API.""" def __init__(self, hass: HomeAssistant, entry: ConfigEntry) -> None: """Initialize.""" self.api = PVPCData( session=async_get_clientsession(hass), tariff=entry.data[ATTR_TARIFF], local_timezone=hass.config.time_zone, power=entry.data[ATTR_POWER], power_valley=entry.data[ATTR_POWER_P3], ) super().__init__(hass, _LOGGER, name=DOMAIN, update_interval=timedelta(minutes=30)) self._entry = entry @property def entry_id(self) -> str: """Return entry ID.""" return self._entry.entry_id async def _async_update_data(self) -> Mapping[datetime, float]: """Update electricity prices from the ESIOS API.""" prices = await self.api.async_update_prices(dt_util.utcnow()) self.api.process_state_and_attributes(dt_util.utcnow()) if not prices: raise UpdateFailed return prices