/
/
/
1"""Shared fixtures for YouSee Musik provider tests."""
2
3from __future__ import annotations
4
5import asyncio
6from typing import Any
7from unittest.mock import AsyncMock, Mock
8
9import pytest
10
11from music_assistant.providers.yousee import SUPPORTED_FEATURES
12from music_assistant.providers.yousee.provider import YouSeeMusikProvider
13
14
15@pytest.fixture
16def background_tasks() -> list[asyncio.Future[Any]]:
17 """Collect the tasks scheduled via mass.create_task so tests can await them."""
18 return []
19
20
21@pytest.fixture
22def provider(background_tasks: list[asyncio.Future[Any]]) -> YouSeeMusikProvider:
23 """Create a real YouSeeMusikProvider with mocked mass and a dict-backed cache."""
24 mass = Mock()
25 manifest = Mock()
26 manifest.domain = "yousee"
27 config = Mock()
28 config.instance_id = "yousee--test123"
29 config.name = "YouSee Test"
30 config.enabled = True
31 config.get_value.side_effect = lambda key, default=None: {
32 "log_level": "GLOBAL",
33 "yousee_quality": 320,
34 }.get(key, default)
35
36 cache_store: dict[str, Any] = {}
37
38 async def _cache_get(key: str, **_kwargs: Any) -> tuple[Any, bool, bool]:
39 if key in cache_store:
40 return cache_store[key], True, True
41 return None, False, False
42
43 async def _cache_set(key: str, data: Any, **_kwargs: Any) -> None:
44 cache_store[key] = data
45
46 def _create_task(target: Any, *_args: Any, **_kwargs: Any) -> asyncio.Future[Any]:
47 task: asyncio.Future[Any] = asyncio.ensure_future(target)
48 background_tasks.append(task)
49 return task
50
51 mass.cache.get_with_freshness = AsyncMock(side_effect=_cache_get)
52 mass.cache.set = AsyncMock(side_effect=_cache_set)
53 mass.create_task = Mock(side_effect=_create_task)
54 return YouSeeMusikProvider(mass, manifest, config, SUPPORTED_FEATURES)
55