diff --git a/homeassistant/components/tibber/diagnostics.py b/homeassistant/components/tibber/diagnostics.py new file mode 100644 index 00000000000..d9e04502509 --- /dev/null +++ b/homeassistant/components/tibber/diagnostics.py @@ -0,0 +1,31 @@ +"""Diagnostics support for Tibber.""" +from __future__ import annotations + +import tibber + +from homeassistant.config_entries import ConfigEntry +from homeassistant.core import HomeAssistant + +from .const import DOMAIN + + +async def async_get_config_entry_diagnostics( + hass: HomeAssistant, config_entry: ConfigEntry +) -> dict: + """Return diagnostics for a config entry.""" + tibber_connection: tibber.Tibber = hass.data[DOMAIN] + + diagnostics_data = {} + + homes = {} + for home in tibber_connection.get_homes(only_active=False): + homes[home.home_id] = { + "last_data_timestamp": home.last_data_timestamp, + "has_active_subscription": home.has_active_subscription, + "has_real_time_consumption": home.has_real_time_consumption, + "last_cons_data_timestamp": home.last_cons_data_timestamp, + "country": home.country, + } + diagnostics_data["homes"] = homes + + return diagnostics_data diff --git a/tests/components/tibber/conftest.py b/tests/components/tibber/conftest.py new file mode 100644 index 00000000000..3fa503ed002 --- /dev/null +++ b/tests/components/tibber/conftest.py @@ -0,0 +1,19 @@ +"""Test helpers for Tibber.""" +import pytest + +from homeassistant.components.tibber.const import DOMAIN +from homeassistant.const import CONF_ACCESS_TOKEN + +from tests.common import MockConfigEntry + + +@pytest.fixture +def config_entry(hass): + """Tibber config entry.""" + config_entry = MockConfigEntry( + domain=DOMAIN, + data={CONF_ACCESS_TOKEN: "token"}, + unique_id="tibber", + ) + config_entry.add_to_hass(hass) + return config_entry diff --git a/tests/components/tibber/test_common.py b/tests/components/tibber/test_common.py new file mode 100644 index 00000000000..716fa8ce47b --- /dev/null +++ b/tests/components/tibber/test_common.py @@ -0,0 +1,36 @@ +"""Test common.""" +import datetime as dt +from unittest.mock import AsyncMock + +CONSUMPTION_DATA_1 = [ + { + "from": "2022-01-03T00:00:00.000+01:00", + "totalCost": 1.1, + "consumption": 2.1, + }, + { + "from": "2022-01-03T01:00:00.000+01:00", + "totalCost": 1.2, + "consumption": 2.2, + }, + { + "from": "2022-01-03T02:00:00.000+01:00", + "totalCost": 1.3, + "consumption": 2.3, + }, +] + + +def mock_get_homes(only_active=True): + """Return a list of mocked Tibber homes.""" + tibber_home = AsyncMock() + tibber_home.name = "Name" + tibber_home.home_id = "home_id" + tibber_home.currency = "NOK" + tibber_home.has_active_subscription = True + tibber_home.has_real_time_consumption = False + tibber_home.country = "NO" + tibber_home.last_cons_data_timestamp = dt.datetime(2016, 1, 1, 12, 44, 57) + tibber_home.last_data_timestamp = dt.datetime(2016, 1, 1, 12, 48, 57) + tibber_home.get_historic_data.return_value = CONSUMPTION_DATA_1 + return [tibber_home] diff --git a/tests/components/tibber/test_config_flow.py b/tests/components/tibber/test_config_flow.py index 3081323d9b6..198ff8ccfc4 100644 --- a/tests/components/tibber/test_config_flow.py +++ b/tests/components/tibber/test_config_flow.py @@ -7,7 +7,7 @@ from homeassistant import config_entries from homeassistant.components.tibber.const import DOMAIN from homeassistant.const import CONF_ACCESS_TOKEN -from tests.common import MockConfigEntry, async_init_recorder_component +from tests.common import async_init_recorder_component @pytest.fixture(name="tibber_setup", autouse=True) @@ -55,17 +55,10 @@ async def test_create_entry(hass): assert result["data"] == test_data -async def test_flow_entry_already_exists(hass): +async def test_flow_entry_already_exists(hass, config_entry): """Test user input for config_entry that already exists.""" await async_init_recorder_component(hass) - first_entry = MockConfigEntry( - domain="tibber", - data={CONF_ACCESS_TOKEN: "valid"}, - unique_id="tibber", - ) - first_entry.add_to_hass(hass) - test_data = { CONF_ACCESS_TOKEN: "valid", } diff --git a/tests/components/tibber/test_diagnostics.py b/tests/components/tibber/test_diagnostics.py new file mode 100644 index 00000000000..706f86b63ac --- /dev/null +++ b/tests/components/tibber/test_diagnostics.py @@ -0,0 +1,50 @@ +"""Test the Netatmo diagnostics.""" +from unittest.mock import patch + +from homeassistant.setup import async_setup_component + +from .test_common import mock_get_homes + +from tests.common import async_init_recorder_component +from tests.components.diagnostics import get_diagnostics_for_config_entry + + +async def test_entry_diagnostics(hass, hass_client, config_entry): + """Test config entry diagnostics.""" + await async_init_recorder_component(hass) + + with patch( + "tibber.Tibber.update_info", + return_value=None, + ), patch("homeassistant.components.tibber.discovery.async_load_platform"): + assert await async_setup_component(hass, "tibber", {}) + + await hass.async_block_till_done() + + with patch( + "tibber.Tibber.get_homes", + return_value=[], + ): + result = await get_diagnostics_for_config_entry(hass, hass_client, config_entry) + + assert result == { + "homes": {}, + } + + with patch( + "tibber.Tibber.get_homes", + side_effect=mock_get_homes, + ): + result = await get_diagnostics_for_config_entry(hass, hass_client, config_entry) + + assert result == { + "homes": { + "home_id": { + "last_data_timestamp": "2016-01-01T12:48:57", + "has_active_subscription": True, + "has_real_time_consumption": False, + "last_cons_data_timestamp": "2016-01-01T12:44:57", + "country": "NO", + } + }, + } diff --git a/tests/components/tibber/test_statistics.py b/tests/components/tibber/test_statistics.py index 0b9078b225a..7fbc0327910 100644 --- a/tests/components/tibber/test_statistics.py +++ b/tests/components/tibber/test_statistics.py @@ -5,44 +5,20 @@ from homeassistant.components.recorder.statistics import statistics_during_perio from homeassistant.components.tibber.sensor import TibberDataCoordinator from homeassistant.util import dt as dt_util +from .test_common import CONSUMPTION_DATA_1, mock_get_homes + from tests.common import async_init_recorder_component from tests.components.recorder.common import async_wait_recording_done_without_instance -_CONSUMPTION_DATA_1 = [ - { - "from": "2022-01-03T00:00:00.000+01:00", - "totalCost": 1.1, - "consumption": 2.1, - }, - { - "from": "2022-01-03T01:00:00.000+01:00", - "totalCost": 1.2, - "consumption": 2.2, - }, - { - "from": "2022-01-03T02:00:00.000+01:00", - "totalCost": 1.3, - "consumption": 2.3, - }, -] - async def test_async_setup_entry(hass): """Test setup Tibber.""" await async_init_recorder_component(hass) - def _get_homes(): - tibber_home = AsyncMock() - tibber_home.name = "Name" - tibber_home.home_id = "home_id" - tibber_home.currency = "NOK" - tibber_home.get_historic_data.return_value = _CONSUMPTION_DATA_1 - return [tibber_home] - tibber_connection = AsyncMock() tibber_connection.name = "tibber" tibber_connection.fetch_consumption_data_active_homes.return_value = None - tibber_connection.get_homes = _get_homes + tibber_connection.get_homes = mock_get_homes coordinator = TibberDataCoordinator(hass, tibber_connection) await coordinator._async_update_data() @@ -54,7 +30,7 @@ async def test_async_setup_entry(hass): stats = await hass.async_add_executor_job( statistics_during_period, hass, - dt_util.parse_datetime(_CONSUMPTION_DATA_1[0]["from"]), + dt_util.parse_datetime(CONSUMPTION_DATA_1[0]["from"]), None, [statistic_id], "hour", @@ -65,14 +41,14 @@ async def test_async_setup_entry(hass): assert len(stats[statistic_id]) == 3 _sum = 0 for k, stat in enumerate(stats[statistic_id]): - assert stat["start"] == dt_util.parse_datetime(_CONSUMPTION_DATA_1[k]["from"]) - assert stat["state"] == _CONSUMPTION_DATA_1[k]["consumption"] + assert stat["start"] == dt_util.parse_datetime(CONSUMPTION_DATA_1[k]["from"]) + assert stat["state"] == CONSUMPTION_DATA_1[k]["consumption"] assert stat["mean"] is None assert stat["min"] is None assert stat["max"] is None assert stat["last_reset"] is None - _sum += _CONSUMPTION_DATA_1[k]["consumption"] + _sum += CONSUMPTION_DATA_1[k]["consumption"] assert stat["sum"] == _sum # Validate cost @@ -81,7 +57,7 @@ async def test_async_setup_entry(hass): stats = await hass.async_add_executor_job( statistics_during_period, hass, - dt_util.parse_datetime(_CONSUMPTION_DATA_1[0]["from"]), + dt_util.parse_datetime(CONSUMPTION_DATA_1[0]["from"]), None, [statistic_id], "hour", @@ -92,12 +68,12 @@ async def test_async_setup_entry(hass): assert len(stats[statistic_id]) == 3 _sum = 0 for k, stat in enumerate(stats[statistic_id]): - assert stat["start"] == dt_util.parse_datetime(_CONSUMPTION_DATA_1[k]["from"]) - assert stat["state"] == _CONSUMPTION_DATA_1[k]["totalCost"] + assert stat["start"] == dt_util.parse_datetime(CONSUMPTION_DATA_1[k]["from"]) + assert stat["state"] == CONSUMPTION_DATA_1[k]["totalCost"] assert stat["mean"] is None assert stat["min"] is None assert stat["max"] is None assert stat["last_reset"] is None - _sum += _CONSUMPTION_DATA_1[k]["totalCost"] + _sum += CONSUMPTION_DATA_1[k]["totalCost"] assert stat["sum"] == _sum