/
/
/
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 mass.players.get_audio_source_session = MagicMock(return_value=None)
22 return mass
23
24
25@pytest.fixture
26def provider(mock_mass: MagicMock) -> MockProvider:
27 """Create a mock provider."""
28 return MockProvider("test_provider", mass=mock_mass)
29
30
31class TestSelectSourceAutoDerivation:
32 """SELECT_SOURCE is auto-set when the FINAL source list has 2+ non-passive entries."""
33
34 def test_native_source_plus_queue_grants_bit(
35 self, mock_mass: MagicMock, provider: MockProvider
36 ) -> None:
37 """MA Queue + one native source (e.g. line-in) â SELECT_SOURCE."""
38 player = MockPlayer(provider, "player_1", "Player")
39 player._attr_source_list = [PlayerSource(id="line_in", name="Line-in", passive=False)]
40
41 features = player._Player__final_supported_features # type: ignore[attr-defined]
42 assert PlayerFeature.SELECT_SOURCE in features
43
44 def test_no_extra_sources_does_not_grant_bit(
45 self, mock_mass: MagicMock, provider: MockProvider
46 ) -> None:
47 """MA Queue alone (no native sources) â SELECT_SOURCE not set."""
48 player = MockPlayer(provider, "player_2", "Player")
49 # No source_list mutation â only the implicit MA queue gets added
50
51 features = player._Player__final_supported_features # type: ignore[attr-defined]
52 assert PlayerFeature.SELECT_SOURCE not in features
53