diff --git a/.coveragerc b/.coveragerc index fc40f0f35b9..46cbed3a0dc 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1301,9 +1301,6 @@ omit = homeassistant/components/tradfri/light.py homeassistant/components/tradfri/sensor.py homeassistant/components/tradfri/switch.py - homeassistant/components/trafikverket_ferry/__init__.py - homeassistant/components/trafikverket_ferry/coordinator.py - homeassistant/components/trafikverket_ferry/sensor.py homeassistant/components/trafikverket_train/__init__.py homeassistant/components/trafikverket_train/sensor.py homeassistant/components/trafikverket_weatherstation/__init__.py diff --git a/tests/components/trafikverket_ferry/__init__.py b/tests/components/trafikverket_ferry/__init__.py index 4a1491c5bed..97bedb30281 100644 --- a/tests/components/trafikverket_ferry/__init__.py +++ b/tests/components/trafikverket_ferry/__init__.py @@ -1 +1,18 @@ """Tests for the Trafikverket Ferry integration.""" +from __future__ import annotations + +from homeassistant.components.trafikverket_ferry.const import ( + CONF_FROM, + CONF_TIME, + CONF_TO, +) +from homeassistant.const import CONF_API_KEY, CONF_NAME, CONF_WEEKDAY, WEEKDAYS + +ENTRY_CONFIG = { + CONF_API_KEY: "1234567890", + CONF_FROM: "Harbor 1", + CONF_TO: "Harbor 2", + CONF_TIME: "00:00:00", + CONF_WEEKDAY: WEEKDAYS, + CONF_NAME: "Harbor1", +} diff --git a/tests/components/trafikverket_ferry/conftest.py b/tests/components/trafikverket_ferry/conftest.py new file mode 100644 index 00000000000..452c351ee5d --- /dev/null +++ b/tests/components/trafikverket_ferry/conftest.py @@ -0,0 +1,80 @@ +"""Fixtures for Trafikverket Ferry integration tests.""" +from __future__ import annotations + +from datetime import datetime, timedelta +from unittest.mock import patch + +import pytest +from pytrafikverket.trafikverket_ferry import FerryStop + +from homeassistant.components.trafikverket_ferry.const import DOMAIN +from homeassistant.config_entries import SOURCE_USER +from homeassistant.core import HomeAssistant +from homeassistant.util import dt + +from . import ENTRY_CONFIG + +from tests.common import MockConfigEntry + + +@pytest.fixture(name="load_int") +async def load_integration_from_entry( + hass: HomeAssistant, get_ferries: list[FerryStop] +) -> MockConfigEntry: + """Set up the Trafikverket Ferry integration in Home Assistant.""" + config_entry = MockConfigEntry( + domain=DOMAIN, + source=SOURCE_USER, + data=ENTRY_CONFIG, + entry_id="1", + unique_id="123", + ) + + config_entry.add_to_hass(hass) + + with patch( + "homeassistant.components.trafikverket_ferry.coordinator.TrafikverketFerry.async_get_next_ferry_stops", + return_value=get_ferries, + ): + await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + + return config_entry + + +@pytest.fixture(name="get_ferries") +def fixture_get_ferries() -> list[FerryStop]: + """Construct FerryStop Mock.""" + + depart1 = FerryStop( + "13", + False, + datetime(dt.now().year + 1, 5, 1, 12, 0, tzinfo=dt.UTC), + [""], + "0", + datetime(dt.now().year, 5, 1, 12, 0, tzinfo=dt.UTC), + "Harbor 1", + "Harbor 2", + ) + depart2 = FerryStop( + "14", + False, + datetime(dt.now().year + 1, 5, 1, 12, 0, tzinfo=dt.UTC) + timedelta(minutes=15), + [""], + "0", + datetime(dt.now().year, 5, 1, 12, 0, tzinfo=dt.UTC), + "Harbor 1", + "Harbor 2", + ) + depart3 = FerryStop( + "15", + False, + datetime(dt.now().year + 1, 5, 1, 12, 0, tzinfo=dt.UTC) + timedelta(minutes=30), + [""], + "0", + datetime(dt.now().year, 5, 1, 12, 0, tzinfo=dt.UTC), + "Harbor 1", + "Harbor 2", + ) + + return [depart1, depart2, depart3] diff --git a/tests/components/trafikverket_ferry/test_coordinator.py b/tests/components/trafikverket_ferry/test_coordinator.py new file mode 100644 index 00000000000..7714e0c38f6 --- /dev/null +++ b/tests/components/trafikverket_ferry/test_coordinator.py @@ -0,0 +1,107 @@ +"""The test for the Trafikverket Ferry coordinator.""" +from __future__ import annotations + +from datetime import date, datetime, timedelta +from unittest.mock import AsyncMock, patch + +from freezegun.api import FrozenDateTimeFactory +import pytest +from pytrafikverket.trafikverket_ferry import FerryStop + +from homeassistant.components.trafikverket_ferry.const import DOMAIN +from homeassistant.components.trafikverket_ferry.coordinator import next_departuredate +from homeassistant.config_entries import SOURCE_USER +from homeassistant.const import STATE_UNAVAILABLE, WEEKDAYS +from homeassistant.core import HomeAssistant +from homeassistant.util import dt + +from . import ENTRY_CONFIG + +from tests.common import MockConfigEntry, async_fire_time_changed + + +async def test_coordinator( + hass: HomeAssistant, + entity_registry_enabled_by_default: AsyncMock, + monkeypatch: pytest.MonkeyPatch, + get_ferries: list[FerryStop], +) -> None: + """Test the Trafikverket Ferry coordinator.""" + entry = MockConfigEntry( + domain=DOMAIN, + source=SOURCE_USER, + data=ENTRY_CONFIG, + entry_id="1", + unique_id="123", + ) + entry.add_to_hass(hass) + + with patch( + "homeassistant.components.trafikverket_ferry.coordinator.TrafikverketFerry.async_get_next_ferry_stops", + return_value=get_ferries, + ) as mock_data: + await hass.config_entries.async_setup(entry.entry_id) + await hass.async_block_till_done() + + mock_data.assert_called_once() + state1 = hass.states.get("sensor.harbor1_departure_from") + state2 = hass.states.get("sensor.harbor1_departure_to") + state3 = hass.states.get("sensor.harbor1_departure_time") + assert state1.state == "Harbor 1" + assert state2.state == "Harbor 2" + assert state3.state == str(dt.now().year + 1) + "-05-01T12:00:00+00:00" + mock_data.reset_mock() + + monkeypatch.setattr( + get_ferries[0], + "departure_time", + datetime(dt.now().year + 2, 5, 1, 12, 0, tzinfo=dt.UTC), + ) + + async_fire_time_changed(hass, dt.utcnow() + timedelta(minutes=6)) + await hass.async_block_till_done() + mock_data.assert_called_once() + state1 = hass.states.get("sensor.harbor1_departure_from") + state2 = hass.states.get("sensor.harbor1_departure_to") + state3 = hass.states.get("sensor.harbor1_departure_time") + assert state1.state == "Harbor 1" + assert state2.state == "Harbor 2" + assert state3.state == str(dt.now().year + 2) + "-05-01T12:00:00+00:00" + mock_data.reset_mock() + + mock_data.side_effect = ValueError("info") + async_fire_time_changed(hass, dt.utcnow() + timedelta(minutes=6)) + await hass.async_block_till_done() + mock_data.assert_called_once() + state1 = hass.states.get("sensor.harbor1_departure_from") + assert state1.state == STATE_UNAVAILABLE + mock_data.reset_mock() + + mock_data.return_value = get_ferries + mock_data.side_effect = None + async_fire_time_changed(hass, dt.utcnow() + timedelta(minutes=6)) + await hass.async_block_till_done() + mock_data.assert_called_once() + state1 = hass.states.get("sensor.harbor1_departure_from") + assert state1.state == "Harbor 1" + mock_data.reset_mock() + + +async def test_coordinator_next_departuredate(freezer: FrozenDateTimeFactory) -> None: + """Test the Trafikverket Ferry next_departuredate calculation.""" + freezer.move_to("2022-05-15") + today = date.today() + day_list = ["wed", "thu", "fri", "sat"] + test = next_departuredate(day_list) + assert test == today + timedelta(days=3) + day_list = WEEKDAYS + test = next_departuredate(day_list) + assert test == today + timedelta(days=0) + day_list = ["sun"] + test = next_departuredate(day_list) + assert test == today + timedelta(days=0) + freezer.move_to("2022-05-16") + today = date.today() + day_list = ["wed", "thu", "fri", "sat", "sun"] + test = next_departuredate(day_list) + assert test == today + timedelta(days=2) diff --git a/tests/components/trafikverket_ferry/test_init.py b/tests/components/trafikverket_ferry/test_init.py new file mode 100644 index 00000000000..d5063ab704c --- /dev/null +++ b/tests/components/trafikverket_ferry/test_init.py @@ -0,0 +1,61 @@ +"""Test for Trafikverket Ferry component Init.""" +from __future__ import annotations + +from unittest.mock import patch + +from pytrafikverket.trafikverket_ferry import FerryStop + +from homeassistant import config_entries +from homeassistant.components.trafikverket_ferry.const import DOMAIN +from homeassistant.config_entries import SOURCE_USER +from homeassistant.core import HomeAssistant + +from . import ENTRY_CONFIG + +from tests.common import MockConfigEntry + + +async def test_setup_entry(hass: HomeAssistant, get_ferries: list[FerryStop]) -> None: + """Test setup entry.""" + entry = MockConfigEntry( + domain=DOMAIN, + source=SOURCE_USER, + data=ENTRY_CONFIG, + entry_id="1", + unique_id="123", + ) + entry.add_to_hass(hass) + + with patch( + "homeassistant.components.trafikverket_ferry.coordinator.TrafikverketFerry.async_get_next_ferry_stops", + return_value=get_ferries, + ) as mock_tvt_ferry: + await hass.config_entries.async_setup(entry.entry_id) + await hass.async_block_till_done() + + assert entry.state is config_entries.ConfigEntryState.LOADED + assert len(mock_tvt_ferry.mock_calls) == 1 + + +async def test_unload_entry(hass: HomeAssistant, get_ferries: list[FerryStop]) -> None: + """Test unload an entry.""" + entry = MockConfigEntry( + domain=DOMAIN, + source=SOURCE_USER, + data=ENTRY_CONFIG, + entry_id="1", + unique_id="321", + ) + entry.add_to_hass(hass) + + with patch( + "homeassistant.components.trafikverket_ferry.coordinator.TrafikverketFerry.async_get_next_ferry_stops", + return_value=get_ferries, + ): + await hass.config_entries.async_setup(entry.entry_id) + await hass.async_block_till_done() + + assert entry.state is config_entries.ConfigEntryState.LOADED + assert await hass.config_entries.async_unload(entry.entry_id) + await hass.async_block_till_done() + assert entry.state is config_entries.ConfigEntryState.NOT_LOADED diff --git a/tests/components/trafikverket_ferry/test_sensor.py b/tests/components/trafikverket_ferry/test_sensor.py new file mode 100644 index 00000000000..4353eb5c8ba --- /dev/null +++ b/tests/components/trafikverket_ferry/test_sensor.py @@ -0,0 +1,48 @@ +"""The test for the Trafikverket sensor platform.""" +from __future__ import annotations + +from datetime import timedelta +from unittest.mock import patch + +from pytest import MonkeyPatch +from pytrafikverket.trafikverket_ferry import FerryStop + +from homeassistant.config_entries import ConfigEntry +from homeassistant.core import HomeAssistant +from homeassistant.util import dt + +from tests.common import async_fire_time_changed + + +async def test_sensor( + hass: HomeAssistant, + load_int: ConfigEntry, + monkeypatch: MonkeyPatch, + get_ferries: list[FerryStop], +) -> None: + """Test the Trafikverket Ferry sensor.""" + state1 = hass.states.get("sensor.harbor1_departure_from") + state2 = hass.states.get("sensor.harbor1_departure_to") + state3 = hass.states.get("sensor.harbor1_departure_time") + assert state1.state == "Harbor 1" + assert state2.state == "Harbor 2" + assert state3.state == str(dt.now().year + 1) + "-05-01T12:00:00+00:00" + assert state1.attributes["icon"] == "mdi:ferry" + assert state1.attributes["other_information"] == [""] + assert state2.attributes["icon"] == "mdi:ferry" + + monkeypatch.setattr(get_ferries[0], "other_information", ["Nothing exiting"]) + + with patch( + "homeassistant.components.trafikverket_ferry.coordinator.TrafikverketFerry.async_get_next_ferry_stops", + return_value=get_ferries, + ): + async_fire_time_changed( + hass, + dt.utcnow() + timedelta(minutes=6), + ) + await hass.async_block_till_done() + + state1 = hass.states.get("sensor.harbor1_departure_from") + assert state1.state == "Harbor 1" + assert state1.attributes["other_information"] == ["Nothing exiting"]