/
/
/
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
19
20
21def _handle_media_status(fake: MagicMock, status: MagicMock) -> None:
22 ChromecastPlayer._handle_media_status(cast("ChromecastPlayer", fake), status)
23
24
25def _fake_player() -> MagicMock:
26 """Build a MagicMock standing in for a ChromecastPlayer with no active cast group."""
27 fake = MagicMock()
28 fake.active_cast_group = None
29 return fake
30
31
32def _media_status(content_id: str, *, player_is_playing: bool, player_is_paused: bool) -> MagicMock:
33 status = MagicMock()
34 status.content_id = content_id
35 status.player_is_playing = player_is_playing
36 status.player_is_paused = player_is_paused
37 return status
38
39
40def test_dashboard_keepalive_video_treated_as_idle() -> None:
41 """A playing dashboard-keepalive.mp4 status must not surface as MA playback."""
42 fake = _fake_player()
43 fake._attr_elapsed_time = 123.0
44 status = _media_status(
45 "https://cast.music-assistant.io/dashboard-keepalive.mp4",
46 player_is_playing=True,
47 player_is_paused=False,
48 )
49
50 _handle_media_status(fake, status)
51
52 assert fake._attr_playback_state == PlaybackState.IDLE
53 assert fake._attr_current_media is None
54 assert fake._attr_active_source is None
55 assert fake._attr_elapsed_time == 0
56 assert isinstance(fake._attr_elapsed_time_last_updated, float)
57 fake.update_state.assert_called_once()
58
59
60def test_legacy_keepalive_image_treated_as_idle() -> None:
61 """The legacy paused keepalive.png status must also not surface as MA playback."""
62 fake = _fake_player()
63 fake._attr_elapsed_time = 123.0
64 status = _media_status(
65 "https://cast.music-assistant.io/keepalive.png",
66 player_is_playing=False,
67 player_is_paused=True,
68 )
69
70 _handle_media_status(fake, status)
71
72 assert fake._attr_playback_state == PlaybackState.IDLE
73 assert fake._attr_current_media is None
74 assert fake._attr_active_source is None
75 assert fake._attr_elapsed_time == 0
76 assert isinstance(fake._attr_elapsed_time_last_updated, float)
77 fake.update_state.assert_called_once()
78