/
/
/
1"""Tests for the Jellyfin provider."""
2
3from collections.abc import AsyncGenerator
4from unittest import mock
5
6import pytest
7from aiojellyfin.testing import FixtureBuilder
8from music_assistant_models.config_entries import ProviderConfig
9
10from music_assistant.mass import MusicAssistant
11from tests.common import get_fixtures_dir, wait_for_sync_completion
12
13
14@pytest.fixture
15async def jellyfin_provider(mass: MusicAssistant) -> AsyncGenerator[ProviderConfig, None]:
16 """Configure an aiojellyfin test fixture, and add a provider to mass that uses it."""
17 f = FixtureBuilder()
18 async for _, artist in get_fixtures_dir("artists", "jellyfin"):
19 f.add_json_bytes(artist)
20
21 async for _, album in get_fixtures_dir("albums", "jellyfin"):
22 f.add_json_bytes(album)
23
24 async for _, track in get_fixtures_dir("tracks", "jellyfin"):
25 f.add_json_bytes(track)
26
27 authenticate_by_name = f.to_authenticate_by_name()
28
29 with mock.patch(
30 "music_assistant.providers.jellyfin.authenticate_by_name", authenticate_by_name
31 ):
32 async with wait_for_sync_completion(mass):
33 config = await mass.config.save_provider_config(
34 "jellyfin",
35 {
36 "url": "http://localhost",
37 "username": "username",
38 "password": "password",
39 },
40 )
41 await mass.music.start_sync()
42
43 yield config
44
45
46@pytest.mark.usefixtures("jellyfin_provider")
47async def test_initial_sync(mass: MusicAssistant) -> None:
48 """Test that initial sync worked."""
49 artists = await mass.music.artists.library_items(search="Ash")
50 assert artists[0].name == "Ash"
51
52 albums = await mass.music.albums.library_items(search="christmas")
53 assert albums[0].name == "This Is Christmas"
54
55 tracks = await mass.music.tracks.library_items(search="where the bands are")
56 assert tracks[0].name == "Where the Bands Are"
57 assert tracks[0].version == "2018 Version"
58