music-assistant-server

3.3 KBPY
test_stream_limits.py
3.3 KB84 lines • python
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