Files
core/tests/components/plex/test_server.py
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

190 lines
6.4 KiB
Python
Raw Normal View History

2020-03-11 11:37:02 -05:00
"""Tests for Plex server."""
2020-03-11 11:37:02 -05:00
import copy
2021-01-01 22:31:56 +01:00
from unittest.mock import patch
2020-03-11 11:37:02 -05:00
import pytest
2020-10-14 08:46:52 -05:00
from requests.exceptions import ConnectionError, RequestException
import requests_mock
2020-03-11 11:37:02 -05:00
from homeassistant.components.plex.const import (
CONF_IGNORE_NEW_SHARED_USERS,
CONF_IGNORE_PLEX_WEB_CLIENTS,
2020-03-11 11:37:02 -05:00
CONF_MONITORED_USERS,
2020-06-26 02:24:58 -04:00
CONF_SERVER,
2020-03-11 11:37:02 -05:00
DOMAIN,
SERVERS,
)
2021-12-22 07:59:54 -05:00
from homeassistant.const import Platform
from homeassistant.core import HomeAssistant
2020-03-11 11:37:02 -05:00
from .const import DEFAULT_DATA, DEFAULT_OPTIONS
from .helpers import trigger_plex_update, wait_for_debouncer
2020-03-11 11:37:02 -05:00
async def test_new_users_available(
hass: HomeAssistant, entry, setup_plex_server
) -> None:
2020-03-11 11:37:02 -05:00
"""Test setting up when new users available on Plex server."""
MONITORED_USERS = {"User 1": {"enabled": True}}
2020-03-11 11:37:02 -05:00
OPTIONS_WITH_USERS = copy.deepcopy(DEFAULT_OPTIONS)
2021-12-22 07:59:54 -05:00
OPTIONS_WITH_USERS[Platform.MEDIA_PLAYER][CONF_MONITORED_USERS] = MONITORED_USERS
entry.add_to_hass(hass)
hass.config_entries.async_update_entry(entry, options=OPTIONS_WITH_USERS)
2020-03-11 11:37:02 -05:00
2020-09-22 22:14:41 -05:00
mock_plex_server = await setup_plex_server(config_entry=entry)
2020-03-11 11:37:02 -05:00
server_id = mock_plex_server.machine_identifier
2020-03-11 11:37:02 -05:00
monitored_users = hass.data[DOMAIN][SERVERS][server_id].option_monitored_users
ignored_users = [x for x in monitored_users if not monitored_users[x]["enabled"]]
assert len(monitored_users) == 1
assert len(ignored_users) == 0
2020-09-22 22:14:41 -05:00
async def test_new_ignored_users_available(
hass: HomeAssistant,
caplog: pytest.LogCaptureFixture,
entry,
mock_websocket,
setup_plex_server,
requests_mock: requests_mock.Mocker,
session_new_user,
) -> None:
2020-03-11 11:37:02 -05:00
"""Test setting up when new users available on Plex server but are ignored."""
MONITORED_USERS = {"User 1": {"enabled": True}}
2020-03-11 11:37:02 -05:00
OPTIONS_WITH_USERS = copy.deepcopy(DEFAULT_OPTIONS)
2021-12-22 07:59:54 -05:00
OPTIONS_WITH_USERS[Platform.MEDIA_PLAYER][CONF_MONITORED_USERS] = MONITORED_USERS
OPTIONS_WITH_USERS[Platform.MEDIA_PLAYER][CONF_IGNORE_NEW_SHARED_USERS] = True
entry.add_to_hass(hass)
hass.config_entries.async_update_entry(entry, options=OPTIONS_WITH_USERS)
2020-03-11 11:37:02 -05:00
2020-09-22 22:14:41 -05:00
mock_plex_server = await setup_plex_server(config_entry=entry)
2020-03-11 11:37:02 -05:00
requests_mock.get(
f"{mock_plex_server.url_in_use}/status/sessions",
text=session_new_user,
)
trigger_plex_update(mock_websocket)
await wait_for_debouncer(hass)
await hass.async_block_till_done(wait_background_tasks=True)
2020-03-11 11:37:02 -05:00
server_id = mock_plex_server.machine_identifier
active_sessions = mock_plex_server._plex_server.sessions()
2020-03-11 11:37:02 -05:00
monitored_users = hass.data[DOMAIN][SERVERS][server_id].option_monitored_users
ignored_users = [x for x in mock_plex_server.accounts if x not in monitored_users]
2020-03-11 11:37:02 -05:00
assert len(monitored_users) == 1
assert len(ignored_users) == 2
2020-03-11 11:37:02 -05:00
for ignored_user in ignored_users:
ignored_client = [
x.players[0] for x in active_sessions if x.usernames[0] == ignored_user
]
if ignored_client:
assert (
f"Ignoring {ignored_client[0].product} client owned by '{ignored_user}'"
in caplog.text
)
2020-03-11 11:37:02 -05:00
await wait_for_debouncer(hass)
await hass.async_block_till_done(wait_background_tasks=True)
sensor = hass.states.get("sensor.plex_server_1")
assert sensor.state == str(len(active_sessions))
2020-03-11 11:37:02 -05:00
async def test_network_error_during_refresh(
hass: HomeAssistant, caplog: pytest.LogCaptureFixture, mock_plex_server
) -> None:
2020-06-26 02:24:58 -04:00
"""Test network failures during refreshes."""
server_id = mock_plex_server.machine_identifier
2020-06-26 02:24:58 -04:00
loaded_server = hass.data[DOMAIN][SERVERS][server_id]
active_sessions = mock_plex_server._plex_server.sessions()
await wait_for_debouncer(hass)
sensor = hass.states.get("sensor.plex_server_1")
assert sensor.state == str(len(active_sessions))
with patch("plexapi.server.PlexServer.clients", side_effect=RequestException):
2020-06-26 02:24:58 -04:00
await loaded_server._async_update_platforms()
await hass.async_block_till_done()
2020-06-26 02:24:58 -04:00
assert (
f"Could not connect to Plex server: {DEFAULT_DATA[CONF_SERVER]}" in caplog.text
)
2020-03-11 11:37:02 -05:00
async def test_gdm_client_failure(
hass: HomeAssistant, mock_websocket, setup_plex_server
) -> None:
2020-10-14 08:46:52 -05:00
"""Test connection failure to a GDM discovered client."""
with patch(
"homeassistant.components.plex.server.PlexClient", side_effect=ConnectionError
):
mock_plex_server = await setup_plex_server(disable_gdm=False)
2020-10-14 08:46:52 -05:00
await hass.async_block_till_done()
active_sessions = mock_plex_server._plex_server.sessions()
await wait_for_debouncer(hass)
sensor = hass.states.get("sensor.plex_server_1")
assert sensor.state == str(len(active_sessions))
2020-10-14 08:46:52 -05:00
with patch("plexapi.server.PlexServer.clients", side_effect=RequestException):
2020-10-14 08:46:52 -05:00
trigger_plex_update(mock_websocket)
await hass.async_block_till_done()
async def test_mark_sessions_idle(
hass: HomeAssistant,
mock_plex_server,
mock_websocket,
requests_mock: requests_mock.Mocker,
empty_payload,
) -> None:
2020-06-26 02:24:58 -04:00
"""Test marking media_players as idle when sessions end."""
await wait_for_debouncer(hass)
2020-04-04 00:34:42 -05:00
active_sessions = mock_plex_server._plex_server.sessions()
2020-04-04 00:34:42 -05:00
sensor = hass.states.get("sensor.plex_server_1")
assert sensor.state == str(len(active_sessions))
url = mock_plex_server.url_in_use
requests_mock.get(f"{url}/clients", text=empty_payload)
requests_mock.get(f"{url}/status/sessions", text=empty_payload)
trigger_plex_update(mock_websocket)
2020-06-26 02:24:58 -04:00
await hass.async_block_till_done()
await wait_for_debouncer(hass)
sensor = hass.states.get("sensor.plex_server_1")
2020-06-26 02:24:58 -04:00
assert sensor.state == "0"
async def test_ignore_plex_web_client(
hass: HomeAssistant, entry, setup_plex_server
) -> None:
"""Test option to ignore Plex Web clients."""
OPTIONS = copy.deepcopy(DEFAULT_OPTIONS)
2021-12-22 07:59:54 -05:00
OPTIONS[Platform.MEDIA_PLAYER][CONF_IGNORE_PLEX_WEB_CLIENTS] = True
entry.add_to_hass(hass)
hass.config_entries.async_update_entry(entry, options=OPTIONS)
mock_plex_server = await setup_plex_server(
config_entry=entry, client_type="plexweb", disable_clients=True
)
await wait_for_debouncer(hass)
active_sessions = mock_plex_server._plex_server.sessions()
sensor = hass.states.get("sensor.plex_server_1")
assert sensor.state == str(len(active_sessions))
media_players = hass.states.async_entity_ids("media_player")
assert len(media_players) == int(sensor.state) - 1