/
/
/
1"""Shared fixtures for Soundcloud provider tests."""
2
3from __future__ import annotations
4
5from collections.abc import Iterator
6from unittest.mock import AsyncMock, Mock
7
8import pytest
9
10from music_assistant.models.music_provider import SYNC_RUN_STATE, SyncRunState
11from music_assistant.providers.soundcloud import SUPPORTED_FEATURES, SoundcloudMusicProvider
12
13
14@pytest.fixture
15def sync_run() -> Iterator[SyncRunState]:
16 """Run the library listings as part of a sync run, so their skips are recorded."""
17 state = SyncRunState()
18 token = SYNC_RUN_STATE.set(state)
19 yield state
20 SYNC_RUN_STATE.reset(token)
21
22
23@pytest.fixture
24def provider() -> SoundcloudMusicProvider:
25 """Create a real SoundcloudMusicProvider with mocked dependencies."""
26 mass = Mock()
27 manifest = Mock()
28 manifest.domain = "soundcloud"
29 config = Mock()
30 config.instance_id = "soundcloud--test123"
31 config.name = "Soundcloud Test"
32 config.enabled = True
33 config.get_value.side_effect = lambda key, default=None: {
34 "log_level": "GLOBAL",
35 }.get(key, default)
36 prov = SoundcloudMusicProvider(mass, manifest, config, SUPPORTED_FEATURES)
37 # stand in for the api client that handle_async_init would otherwise create
38 prov._soundcloud = AsyncMock()
39 prov._soundcloud.client_id = "test-client-id"
40 prov._soundcloud.headers = {"Authorization": "OAuth test-token"}
41 prov._soundcloud.get_user_details.return_value = {
42 "id": 1,
43 "username": "Some Artist",
44 "permalink": "some-artist",
45 }
46 prov._user_id = "1"
47 return prov
48