Add tests for trafikverket_ferry (#71912)

This commit is contained in:
G Johansson 2022-06-18 19:58:10 +02:00 committed by GitHub
parent 691d49f23b
commit 046d7d2a23
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 313 additions and 3 deletions

View File

@ -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

View File

@ -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",
}

View File

@ -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]

View File

@ -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)

View File

@ -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

View File

@ -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"]