/
/
/
1"""
2Tests for ChromecastPlayer dashboard keepalive media-status handling.
3
4The cast receiver app plays a keepalive media item (currently a paused
5``keepalive.png``, soon a looping ``dashboard-keepalive.mp4``) while showing a
6dashboard. That media is an implementation detail of the receiver and must
7never leak into MA player state - otherwise a Nest Hub showing a dashboard
8appears in MA as "playing dashboard-keepalive.mp4".
9"""
10
11from __future__ import annotations
12
13from typing import cast
14from unittest.mock import MagicMock
15
16from music_assistant_models.enums import PlaybackState
17
18from music_assistant.providers.chromecast.player import ChromecastPlayer
19from tests.providers.chromecast.helpers import bind_media_status_helpers
20
21
22def _handle_media_status(fake: MagicMock, status: MagicMock) -> None:
23 ChromecastPlayer._handle_media_status(cast("ChromecastPlayer", fake), status)
24
25
26def _fake_player() -> MagicMock:
27 """Build a MagicMock standing in for a ChromecastPlayer with no active cast group."""
28 fake = MagicMock()
29 fake.active_cast_group = None
30 return bind_media_status_helpers(fake)
31
32
33def _media_status(content_id: str, *, player_is_playing: bool, player_is_paused: bool) -> MagicMock:
34 status = MagicMock()
35 status.content_id = content_id
36 status.player_is_playing = player_is_playing
37 status.player_is_paused = player_is_paused
38 return status
39
40
41def test_dashboard_keepalive_video_treated_as_idle() -> None:
42 """A playing dashboard-keepalive.mp4 status must not surface as MA playback."""
43 fake = _fake_player()
44 fake._attr_elapsed_time = 123.0
45 status = _media_status(
46 "https://cast.music-assistant.io/dashboard-keepalive.mp4",
47 player_is_playing=True,
48 player_is_paused=False,
49 )
50
51 _handle_media_status(fake, status)
52
53 assert fake._attr_playback_state == PlaybackState.IDLE
54 assert fake._attr_current_media is None
55 assert fake._attr_active_source is None
56 assert fake._attr_elapsed_time == 0
57 assert isinstance(fake._attr_elapsed_time_last_updated, float)
58 fake.update_state.assert_called_once()
59
60
61def test_legacy_keepalive_image_treated_as_idle() -> None:
62 """The legacy paused keepalive.png status must also not surface as MA playback."""
63 fake = _fake_player()
64 fake._attr_elapsed_time = 123.0
65 status = _media_status(
66 "https://cast.music-assistant.io/keepalive.png",
67 player_is_playing=False,
68 player_is_paused=True,
69 )
70
71 _handle_media_status(fake, status)
72
73 assert fake._attr_playback_state == PlaybackState.IDLE
74 assert fake._attr_current_media is None
75 assert fake._attr_active_source is None
76 assert fake._attr_elapsed_time == 0
77 assert isinstance(fake._attr_elapsed_time_last_updated, float)
78 fake.update_state.assert_called_once()
79