1
0
mirror of https://github.com/home-assistant/core.git synced 2026-05-18 14:29:57 +01:00
Files
2026-03-28 17:06:11 +01:00

103 lines
3.3 KiB
Python

"""Tests for the Transmission event platform."""
from datetime import timedelta
from types import SimpleNamespace
from unittest.mock import AsyncMock, patch
from freezegun.api import FrozenDateTimeFactory
import pytest
from homeassistant.components.event import ATTR_EVENT_TYPE, ATTR_EVENT_TYPES
from homeassistant.components.transmission.const import (
DEFAULT_SCAN_INTERVAL,
EVENT_TYPE_DOWNLOADED,
EVENT_TYPE_REMOVED,
EVENT_TYPE_STARTED,
)
from homeassistant.const import Platform
from homeassistant.core import HomeAssistant
from homeassistant.util import dt as dt_util
from . import setup_integration
from tests.common import MockConfigEntry, async_fire_time_changed
async def test_event_entity_setup(
hass: HomeAssistant,
mock_transmission_client: AsyncMock,
mock_config_entry: MockConfigEntry,
) -> None:
"""Test the event entity is created with expected capabilities."""
with patch("homeassistant.components.transmission.PLATFORMS", [Platform.EVENT]):
await setup_integration(hass, mock_config_entry)
await hass.async_block_till_done()
state = hass.states.get("event.transmission_torrent")
assert state is not None
assert state.state == "unknown"
assert state.attributes[ATTR_EVENT_TYPE] is None
assert state.attributes[ATTR_EVENT_TYPES] == [
EVENT_TYPE_STARTED,
EVENT_TYPE_DOWNLOADED,
EVENT_TYPE_REMOVED,
]
@pytest.mark.parametrize(
("hass_event", "expected_event_type"),
[
(EVENT_TYPE_STARTED, EVENT_TYPE_STARTED),
(EVENT_TYPE_DOWNLOADED, EVENT_TYPE_DOWNLOADED),
(EVENT_TYPE_REMOVED, EVENT_TYPE_REMOVED),
],
)
async def test_event_updates_state(
hass: HomeAssistant,
mock_transmission_client: AsyncMock,
mock_config_entry: MockConfigEntry,
freezer: FrozenDateTimeFactory,
hass_event: str,
expected_event_type: str,
) -> None:
"""Test Transmission events update the entity state and attributes."""
with patch("homeassistant.components.transmission.PLATFORMS", [Platform.EVENT]):
await setup_integration(hass, mock_config_entry)
await hass.async_block_till_done()
client = mock_transmission_client.return_value
torrent_status = {
EVENT_TYPE_STARTED: "downloading",
EVENT_TYPE_DOWNLOADED: "seeding",
EVENT_TYPE_REMOVED: "stopped",
}[hass_event]
torrent = SimpleNamespace(
id=1,
name="Test",
status=torrent_status,
download_dir="/downloads",
labels=[],
)
torrents_sequence = {
EVENT_TYPE_STARTED: [[torrent]],
EVENT_TYPE_DOWNLOADED: [[torrent]],
EVENT_TYPE_REMOVED: [[torrent], []],
}[hass_event]
client.get_torrents.side_effect = torrents_sequence
for _ in torrents_sequence:
freezer.tick(timedelta(seconds=DEFAULT_SCAN_INTERVAL + 1))
async_fire_time_changed(hass)
await hass.async_block_till_done(wait_background_tasks=True)
state = hass.states.get("event.transmission_torrent")
assert state is not None
assert state.attributes[ATTR_EVENT_TYPE] == expected_event_type
assert state.attributes["id"] == 1
assert state.attributes["name"] == "Test"
assert state.attributes["download_path"] == "/downloads"
assert state.attributes["labels"] == []
assert dt_util.parse_datetime(state.state) is not None