/
/
/
1"""
2Tests for player registration when the queue cache cannot be read.
3
4A cache failure must never leave a player registered without a queue: it falls back to a
5fresh queue so the player stays usable.
6"""
7
8from __future__ import annotations
9
10from types import SimpleNamespace
11from typing import Any
12from unittest.mock import AsyncMock, MagicMock
13
14from music_assistant.controllers.player_queues.controller import PlayerQueuesController
15
16
17def _controller(cache_get: AsyncMock) -> Any:
18 """
19 Build a queue-controller stand-in for ``on_player_register``.
20
21 :param cache_get: Stand-in for the cache lookups the queue restore performs.
22 """
23 queues = MagicMock()
24 queues._queue_data = {}
25 queues.mass.cache.get = cache_get
26 return queues
27
28
29def _player(player_id: str = "p1") -> Any:
30 """Build a player stand-in with the state fields the queue snapshot is built from."""
31 return SimpleNamespace(
32 player_id=player_id, state=SimpleNamespace(name="Player A", available=True)
33 )
34
35
36async def test_player_gets_a_queue_when_the_state_lookup_fails() -> None:
37 """A failing cache lookup for the stored queue state falls back to a fresh queue."""
38 queues = _controller(AsyncMock(side_effect=OSError("database error")))
39
40 await PlayerQueuesController.on_player_register(queues, _player())
41
42 assert queues._queue_data["p1"].queue.queue_id == "p1"
43 queues.logger.warning.assert_called_once()
44
45
46async def test_player_gets_a_queue_when_the_items_lookup_fails() -> None:
47 """A failing cache lookup for the stored queue items falls back to a fresh queue."""
48 queues = _controller(AsyncMock(side_effect=[{"queue": {}}, OSError("database error")]))
49
50 await PlayerQueuesController.on_player_register(queues, _player())
51
52 assert queues._queue_data["p1"].queue.queue_id == "p1"
53 queues.logger.warning.assert_called_once()
54