/
/
/
1"""Tests for the Rainy Mood provider."""
2
3from unittest.mock import MagicMock, patch
4
5import pytest
6from music_assistant_models.enums import ContentType, MediaType, ProviderFeature, StreamType
7from music_assistant_models.errors import MediaNotFoundError
8
9from music_assistant.providers import rain_mood
10from music_assistant.providers.rain_mood import RAIN_ITEM_ID, RAIN_URL, RainyMoodProvider
11
12
13def _create_provider() -> RainyMoodProvider:
14 """Create a RainyMoodProvider with mocked dependencies."""
15 with patch.object(RainyMoodProvider, "__init__", lambda *_a, **_kw: None):
16 provider = RainyMoodProvider.__new__(RainyMoodProvider)
17
18 provider.config = MagicMock()
19 provider.config.instance_id = "rain_mood"
20 provider.manifest = MagicMock()
21 provider.manifest.domain = "rain_mood"
22 provider.mass = MagicMock()
23 provider.logger = MagicMock()
24
25 return provider
26
27
28async def test_sound_effects_enumeration() -> None:
29 """The provider offers a single rain sound effect item."""
30 provider = _create_provider()
31 items = [item async for item in provider.get_sound_effects()]
32 assert len(items) == 1
33 item = items[0]
34 assert item.item_id == RAIN_ITEM_ID
35 assert item.media_type == MediaType.SOUND_EFFECT
36 assert item.name == "Rain"
37 assert item.translation_key == RAIN_ITEM_ID
38 assert item.metadata.description
39
40
41async def test_get_sound_effect() -> None:
42 """The rain effect resolves by id; unknown ids raise MediaNotFoundError."""
43 provider = _create_provider()
44 item = await provider.get_sound_effect(RAIN_ITEM_ID)
45 assert item.name == "Rain"
46 assert item.provider_mappings
47 with pytest.raises(MediaNotFoundError):
48 await provider.get_sound_effect("unknown")
49
50
51async def test_supported_features() -> None:
52 """The provider advertises sound effects and browse, no library features."""
53 assert ProviderFeature.SOUND_EFFECTS in rain_mood.SUPPORTED_FEATURES
54 assert ProviderFeature.BROWSE in rain_mood.SUPPORTED_FEATURES
55 assert not any(x for x in rain_mood.SUPPORTED_FEATURES if x.value.startswith("library_"))
56
57
58async def test_stream_details() -> None:
59 """Streamdetails point at the remote rain stream over HTTP."""
60 provider = _create_provider()
61 stream_details = await provider.get_stream_details(RAIN_ITEM_ID)
62 assert stream_details.stream_type == StreamType.HTTP
63 assert stream_details.media_type == MediaType.SOUND_EFFECT
64 assert stream_details.path == RAIN_URL
65 assert stream_details.audio_format.content_type == ContentType.MP3
66
67
68async def test_stream_details_unknown() -> None:
69 """Streamdetails for an unknown id raise MediaNotFoundError."""
70 provider = _create_provider()
71 with pytest.raises(MediaNotFoundError):
72 await provider.get_stream_details("unknown")
73