/
/
1"""Tests for MusicController.recently_played playlog queries."""
2
3from __future__ import annotations
4
5from music_assistant_models.enums import MediaType
6
7from music_assistant.constants import DB_TABLE_PLAYLOG
8from music_assistant.mass import MusicAssistant
9
10
11async def _add_playlog_track(
12 mass: MusicAssistant,
13 item_id: str,
14 timestamp: int,
15 *,
16 fully_played: bool = True,
17 userid: str = "user-a",
18) -> None:
19 """Insert a single track row into the playlog."""
20 await mass.music.database.insert(
21 DB_TABLE_PLAYLOG,
22 {
23 "item_id": item_id,
24 "provider": "library",
25 "media_type": MediaType.TRACK.value,
26 "name": f"Track {item_id}",
27 "timestamp": timestamp,
28 "fully_played": fully_played,
29 "seconds_played": 180,
30 "userid": userid,
31 "user_initiated": True,
32 },
33 )
34
35
36async def test_recently_played_filters_by_played_after_timestamp(mass: MusicAssistant) -> None:
37 """Only entries with timestamp >= played_after_timestamp are returned."""
38 await _add_playlog_track(mass, "recent", timestamp=2000)
39 await _add_playlog_track(mass, "old", timestamp=1000)
40
41 result = await mass.music.recently_played(
42 limit=0,
43 media_types=[MediaType.TRACK],
44 userid="user-a",
45 played_after_timestamp=1500,
46 )
47
48 item_ids = {item.item_id for item in result}
49 assert "recent" in item_ids
50 assert "old" not in item_ids
51
52
53async def test_recently_played_without_timestamp_returns_all(mass: MusicAssistant) -> None:
54 """Existing callers (no played_after_timestamp) still get every entry."""
55 await _add_playlog_track(mass, "recent", timestamp=2000)
56 await _add_playlog_track(mass, "old", timestamp=1000)
57
58 result = await mass.music.recently_played(
59 limit=0,
60 media_types=[MediaType.TRACK],
61 userid="user-a",
62 )
63
64 item_ids = {item.item_id for item in result}
65 assert {"recent", "old"} <= item_ids
66