/
/
/
1"""Tests for the library list_* tools' calls into the music controllers."""
2# mypy: disable-error-code="arg-type, no-untyped-def, type-arg, assignment, operator, misc, union-attr"
3
4from __future__ import annotations
5
6from typing import Any
7
8import pytest
9from fastmcp import Client, FastMCP
10
11
12class TestListToolsRequestFullItems:
13 """
14 The list tools must pin ``summary=False`` on ``library_items``.
15
16 Since upstream music-assistant/server#4693 the controllers default to
17 slim summary items; the pin keeps full models flowing into the
18 ``to_brief_*`` mappers even if future summary slimming drops fields
19 the Brief payloads rely on.
20 """
21
22 @pytest.mark.parametrize(
23 ("tool_name", "controller"),
24 [
25 ("library_list_library_tracks", "tracks"),
26 ("library_list_library_albums", "albums"),
27 ("library_list_library_artists", "artists"),
28 ("library_list_library_playlists", "playlists"),
29 ("library_list_library_radio", "radio"),
30 ],
31 )
32 async def test_list_tool_pins_summary_false(
33 self,
34 library_server: FastMCP,
35 mock_mass: Any,
36 tool_name: str,
37 controller: str,
38 ) -> None:
39 """Each list tool passes paging args and ``summary=False``."""
40 async with Client(library_server) as client:
41 await client.call_tool(tool_name, {"offset": 10, "limit": 25})
42 library_items = getattr(mock_mass.music, controller).library_items
43 library_items.assert_awaited_once_with(limit=25, offset=10, summary=False)
44