/
/
1"""Tests for auto-derivation of PlayerFeature.SELECT_SOURCE."""
2
3from __future__ import annotations
4
5from unittest.mock import MagicMock
6
7import pytest
8from music_assistant_models.enums import PlayerFeature
9from music_assistant_models.player import PlayerSource
10
11from tests.common import MockPlayer, MockProvider
12
13
14@pytest.fixture
15def mock_mass() -> MagicMock:
16 """Create a mock MusicAssistant instance."""
17 mass = MagicMock()
18 mass.config.get_raw_player_config_value = MagicMock(
19 side_effect=lambda _player_id, _key, default=None: default
20 )
21 return mass
22
23
24@pytest.fixture
25def provider(mock_mass: MagicMock) -> MockProvider:
26 """Create a mock provider."""
27 return MockProvider("test_provider", mass=mock_mass)
28
29
30class TestSelectSourceAutoDerivation:
31 """SELECT_SOURCE is auto-set when the FINAL source list has 2+ non-passive entries."""
32
33 def test_native_source_plus_queue_grants_bit(
34 self, mock_mass: MagicMock, provider: MockProvider
35 ) -> None:
36 """MA Queue + one native source (e.g. line-in) â SELECT_SOURCE."""
37 player = MockPlayer(provider, "player_1", "Player")
38 player._attr_source_list = [PlayerSource(id="line_in", name="Line-in", passive=False)]
39
40 features = player._Player__final_supported_features # type: ignore[attr-defined]
41 assert PlayerFeature.SELECT_SOURCE in features
42
43 def test_no_extra_sources_does_not_grant_bit(
44 self, mock_mass: MagicMock, provider: MockProvider
45 ) -> None:
46 """MA Queue alone (no native sources) â SELECT_SOURCE not set."""
47 player = MockPlayer(provider, "player_2", "Player")
48 # No source_list mutation â only the implicit MA queue gets added
49
50 features = player._Player__final_supported_features # type: ignore[attr-defined]
51 assert PlayerFeature.SELECT_SOURCE not in features
52