178 lines
5.5 KiB
Python
178 lines
5.5 KiB
Python
"""The tests for an update of the Twitch component."""
|
|
from datetime import datetime
|
|
|
|
import pytest
|
|
|
|
from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN
|
|
from homeassistant.components.twitch.const import CONF_CHANNELS, DOMAIN
|
|
from homeassistant.const import CONF_CLIENT_ID, CONF_CLIENT_SECRET, CONF_TOKEN, Platform
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers import issue_registry as ir
|
|
from homeassistant.setup import async_setup_component
|
|
|
|
from ...common import MockConfigEntry
|
|
from . import (
|
|
TwitchAPIExceptionMock,
|
|
TwitchInvalidTokenMock,
|
|
TwitchInvalidUserMock,
|
|
TwitchMissingScopeMock,
|
|
TwitchMock,
|
|
TwitchUnauthorizedMock,
|
|
setup_integration,
|
|
)
|
|
|
|
ENTITY_ID = "sensor.channel123"
|
|
CONFIG = {
|
|
"auth_implementation": "cred",
|
|
CONF_CLIENT_ID: "1234",
|
|
CONF_CLIENT_SECRET: "abcd",
|
|
}
|
|
|
|
LEGACY_CONFIG_WITHOUT_TOKEN = {
|
|
SENSOR_DOMAIN: {
|
|
"platform": "twitch",
|
|
CONF_CLIENT_ID: "1234",
|
|
CONF_CLIENT_SECRET: "abcd",
|
|
"channels": ["channel123"],
|
|
}
|
|
}
|
|
|
|
LEGACY_CONFIG = {
|
|
SENSOR_DOMAIN: {
|
|
"platform": "twitch",
|
|
CONF_CLIENT_ID: "1234",
|
|
CONF_CLIENT_SECRET: "abcd",
|
|
CONF_TOKEN: "efgh",
|
|
"channels": ["channel123"],
|
|
}
|
|
}
|
|
|
|
OPTIONS = {CONF_CHANNELS: ["channel123"]}
|
|
|
|
|
|
async def test_legacy_migration(
|
|
hass: HomeAssistant, twitch: TwitchMock, mock_setup_entry
|
|
) -> None:
|
|
"""Test importing legacy yaml."""
|
|
assert await async_setup_component(hass, Platform.SENSOR, LEGACY_CONFIG)
|
|
await hass.async_block_till_done()
|
|
entries = hass.config_entries.async_entries(DOMAIN)
|
|
assert len(entries) == 1
|
|
issue_registry = ir.async_get(hass)
|
|
assert len(issue_registry.issues) == 1
|
|
|
|
|
|
async def test_legacy_migration_without_token(
|
|
hass: HomeAssistant, twitch: TwitchMock
|
|
) -> None:
|
|
"""Test importing legacy yaml."""
|
|
assert await async_setup_component(
|
|
hass, Platform.SENSOR, LEGACY_CONFIG_WITHOUT_TOKEN
|
|
)
|
|
await hass.async_block_till_done()
|
|
entries = hass.config_entries.async_entries(DOMAIN)
|
|
assert len(entries) == 0
|
|
issue_registry = ir.async_get(hass)
|
|
assert len(issue_registry.issues) == 1
|
|
|
|
|
|
async def test_offline(
|
|
hass: HomeAssistant, twitch: TwitchMock, config_entry: MockConfigEntry
|
|
) -> None:
|
|
"""Test offline state."""
|
|
twitch.is_streaming = False
|
|
await setup_integration(hass, config_entry)
|
|
|
|
sensor_state = hass.states.get(ENTITY_ID)
|
|
assert sensor_state.state == "offline"
|
|
assert sensor_state.attributes["entity_picture"] == "logo.png"
|
|
|
|
|
|
async def test_streaming(
|
|
hass: HomeAssistant, twitch: TwitchMock, config_entry: MockConfigEntry
|
|
) -> None:
|
|
"""Test streaming state."""
|
|
await setup_integration(hass, config_entry)
|
|
|
|
sensor_state = hass.states.get(ENTITY_ID)
|
|
assert sensor_state.state == "streaming"
|
|
assert sensor_state.attributes["entity_picture"] == "stream-medium.png"
|
|
assert sensor_state.attributes["game"] == "Good game"
|
|
assert sensor_state.attributes["title"] == "Title"
|
|
|
|
|
|
async def test_oauth_without_sub_and_follow(
|
|
hass: HomeAssistant, twitch: TwitchMock, config_entry: MockConfigEntry
|
|
) -> None:
|
|
"""Test state with oauth."""
|
|
twitch.is_following = False
|
|
await setup_integration(hass, config_entry)
|
|
|
|
sensor_state = hass.states.get(ENTITY_ID)
|
|
assert sensor_state.attributes["subscribed"] is False
|
|
assert sensor_state.attributes["following"] is False
|
|
|
|
|
|
async def test_oauth_with_sub(
|
|
hass: HomeAssistant, twitch: TwitchMock, config_entry: MockConfigEntry
|
|
) -> None:
|
|
"""Test state with oauth and sub."""
|
|
twitch.is_subscribed = True
|
|
twitch.is_following = False
|
|
await setup_integration(hass, config_entry)
|
|
|
|
sensor_state = hass.states.get(ENTITY_ID)
|
|
assert sensor_state.attributes["subscribed"] is True
|
|
assert sensor_state.attributes["subscription_is_gifted"] is False
|
|
assert sensor_state.attributes["following"] is False
|
|
|
|
|
|
async def test_oauth_with_follow(
|
|
hass: HomeAssistant, twitch: TwitchMock, config_entry: MockConfigEntry
|
|
) -> None:
|
|
"""Test state with oauth and follow."""
|
|
await setup_integration(hass, config_entry)
|
|
|
|
sensor_state = hass.states.get(ENTITY_ID)
|
|
assert sensor_state.attributes["following"] is True
|
|
assert sensor_state.attributes["following_since"] == datetime(
|
|
year=2023, month=8, day=1
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"twitch_mock",
|
|
[TwitchUnauthorizedMock(), TwitchMissingScopeMock(), TwitchInvalidTokenMock()],
|
|
)
|
|
async def test_auth_invalid(
|
|
hass: HomeAssistant, twitch: TwitchMock, config_entry: MockConfigEntry
|
|
) -> None:
|
|
"""Test auth failures."""
|
|
await setup_integration(hass, config_entry)
|
|
|
|
sensor_state = hass.states.get(ENTITY_ID)
|
|
assert sensor_state is None
|
|
|
|
|
|
@pytest.mark.parametrize("twitch_mock", [TwitchInvalidUserMock()])
|
|
async def test_auth_with_invalid_user(
|
|
hass: HomeAssistant, twitch: TwitchMock, config_entry: MockConfigEntry
|
|
) -> None:
|
|
"""Test auth with invalid user."""
|
|
await setup_integration(hass, config_entry)
|
|
|
|
sensor_state = hass.states.get(ENTITY_ID)
|
|
assert "subscribed" not in sensor_state.attributes
|
|
|
|
|
|
@pytest.mark.parametrize("twitch_mock", [TwitchAPIExceptionMock()])
|
|
async def test_auth_with_api_exception(
|
|
hass: HomeAssistant, twitch: TwitchMock, config_entry: MockConfigEntry
|
|
) -> None:
|
|
"""Test auth with invalid user."""
|
|
await setup_integration(hass, config_entry)
|
|
|
|
sensor_state = hass.states.get(ENTITY_ID)
|
|
assert sensor_state.attributes["subscribed"] is False
|
|
assert "subscription_is_gifted" not in sensor_state.attributes
|