/
/
/
1"""Tests for music-provider source-stream limit declarations."""
2
3from __future__ import annotations
4
5import pytest
6
7from music_assistant.models.music_provider import MusicProvider
8from music_assistant.providers._demo_music_provider import MyDemoMusicprovider
9from music_assistant.providers.abc_radio_network.provider import ABCRadioProvider
10from music_assistant.providers.apple_music.provider import AppleMusicProvider
11from music_assistant.providers.ard_audiothek import ARDAudiothek
12from music_assistant.providers.bbc_sounds import BBCSoundsProvider
13from music_assistant.providers.filesystem_local import LocalFileSystemProvider
14from music_assistant.providers.internet_archive.provider import InternetArchiveProvider
15from music_assistant.providers.itunes_podcasts import ITunesPodcastsProvider
16from music_assistant.providers.mammamiradio import MammamiradioProvider
17from music_assistant.providers.nts import NTSProvider
18from music_assistant.providers.orf_radiothek import RadiothekProvider
19from music_assistant.providers.pandora.provider import PandoraProvider
20from music_assistant.providers.phishin.provider import PhishInProvider
21from music_assistant.providers.podcast_index.provider import PodcastIndexProvider
22from music_assistant.providers.qobuz import QobuzProvider
23from music_assistant.providers.radiobrowser import RadioBrowserProvider
24from music_assistant.providers.radioparadise.provider import RadioParadiseProvider
25from music_assistant.providers.rain_mood import RainyMoodProvider
26from music_assistant.providers.somafm import SomaFMProvider
27from music_assistant.providers.sverigesradio import SverigesRadio
28from music_assistant.providers.tunein import TuneInProvider
29from music_assistant.providers.ytmusic import YoutubeMusicProvider
30
31
32def _limit(provider_cls: type[MusicProvider]) -> int | None:
33 """Read a stateless provider limit without initializing external clients."""
34 provider = provider_cls.__new__(provider_cls)
35 return provider.max_concurrent_streams
36
37
38@pytest.mark.parametrize(
39 ("provider_cls", "expected"),
40 [
41 (MyDemoMusicprovider, 5),
42 (QobuzProvider, 5),
43 (LocalFileSystemProvider, None),
44 # SpotifyProvider reads its budget from the configured playback backend,
45 # so it is pinned in tests/providers/spotify/test_backends.py instead
46 (YoutubeMusicProvider, 3),
47 (AppleMusicProvider, 1),
48 (PandoraProvider, 1),
49 ],
50)
51def test_provider_stream_limit_defaults_and_overrides(
52 provider_cls: type[MusicProvider], expected: int | None
53) -> None:
54 """Providers inherit or override the source limit for their source category."""
55 assert _limit(provider_cls) == expected
56
57
58@pytest.mark.parametrize(
59 "provider_cls",
60 [
61 ABCRadioProvider,
62 ARDAudiothek,
63 BBCSoundsProvider,
64 InternetArchiveProvider,
65 ITunesPodcastsProvider,
66 MammamiradioProvider,
67 NTSProvider,
68 RadiothekProvider,
69 PhishInProvider,
70 PodcastIndexProvider,
71 RadioBrowserProvider,
72 RadioParadiseProvider,
73 RainyMoodProvider,
74 SomaFMProvider,
75 SverigesRadio,
76 TuneInProvider,
77 ],
78)
79def test_public_direct_providers_are_unlimited(
80 provider_cls: type[MusicProvider],
81) -> None:
82 """Audited public/direct providers do not consume the default guarded pool."""
83 assert _limit(provider_cls) is None
84