Files
musicseerr/backend/tests/services/test_artist_basic_info.py
T
Harvey df779c9e6d Mus 19 library sync completing with issues (#29)
* fix: Sync issues - AudioDB warmig +  automatic sync skips

* progress ui/ux + discovery and album fixes

* artist fixes

* several request level fixes and improvements

* handle request fails + artist refresh + resilience fixes

* fix format

* fix stop sync fail + last.fn mbid issues + failures/validation reworks
2026-04-08 00:29:36 +01:00

126 lines
4.0 KiB
Python

"""Tests that the basic artist info path returns correctly and skips Wikidata enrichment."""
import pytest
from unittest.mock import AsyncMock, MagicMock
from models.artist import ArtistInfo, ReleaseItem
from services.artist_service import ArtistService
ARTIST_MBID = "f4a31f0a-51dd-4fa7-986d-3095c40c5ed9"
def _make_mb_artist() -> dict:
return {
"id": ARTIST_MBID,
"name": "Test Artist",
"type": "Group",
"country": "GB",
"disambiguation": "",
"life-span": {"begin": "2000", "end": None, "ended": "false"},
"tag-list": [{"name": "rock", "count": 5}],
"alias-list": [],
"url-relation-list": [],
"release-group-list": [
{
"id": "rg-001",
"title": "First Album",
"type": "Album",
"primary-type": "Album",
"secondary-type-list": [],
"first-release-date": "2020-01-01",
}
],
"release-group-count": 1,
}
def _make_service(*, cached_artist: ArtistInfo | None = None) -> tuple[ArtistService, AsyncMock]:
mb_repo = AsyncMock()
mb_repo.get_artist_by_id = AsyncMock(return_value=_make_mb_artist())
lidarr_repo = MagicMock()
lidarr_repo.is_configured.return_value = False
lidarr_repo.get_library_mbids = AsyncMock(return_value=set())
lidarr_repo.get_requested_mbids = AsyncMock(return_value=set())
lidarr_repo.get_artist_mbids = AsyncMock(return_value=set())
wikidata_repo = AsyncMock()
wikidata_repo.get_wikidata_info = AsyncMock(
side_effect=AssertionError("Wikidata should NOT be called in basic path")
)
prefs = MagicMock()
prefs.get_preferences.return_value = MagicMock(
primary_types=["Album", "Single", "EP"],
secondary_types=[],
)
prefs.get_advanced_settings.return_value = MagicMock(
cache_ttl_artist_library=21600,
cache_ttl_artist_non_library=3600,
)
memory_cache = AsyncMock()
memory_cache.get = AsyncMock(return_value=cached_artist)
memory_cache.set = AsyncMock()
disk_cache = AsyncMock()
disk_cache.get_artist = AsyncMock(return_value=None)
disk_cache.set_artist = AsyncMock()
svc = ArtistService(
mb_repo=mb_repo,
lidarr_repo=lidarr_repo,
wikidata_repo=wikidata_repo,
preferences_service=prefs,
memory_cache=memory_cache,
disk_cache=disk_cache,
)
return svc, wikidata_repo
class TestGetArtistInfoBasic:
@pytest.mark.asyncio
async def test_cold_cache_skips_wikidata(self):
svc, wikidata_repo = _make_service()
result = await svc.get_artist_info_basic(ARTIST_MBID)
assert result.name == "Test Artist"
assert result.musicbrainz_id == ARTIST_MBID
assert result.description is None
assert result.image is None
wikidata_repo.get_wikidata_info.assert_not_awaited()
@pytest.mark.asyncio
async def test_cold_cache_sets_release_group_count(self):
svc, _ = _make_service()
result = await svc.get_artist_info_basic(ARTIST_MBID)
assert result.release_group_count == 1
@pytest.mark.asyncio
async def test_cached_artist_returned_directly(self):
cached = ArtistInfo(
name="Cached Artist",
musicbrainz_id=ARTIST_MBID,
description="Cached description",
image="https://example.com/img.jpg",
albums=[ReleaseItem(id="rg-cached", title="Cached Album", type="Album")],
)
svc, wikidata_repo = _make_service(cached_artist=cached)
result = await svc.get_artist_info_basic(ARTIST_MBID)
assert result.name == "Cached Artist"
assert result.description == "Cached description"
assert result.image == "https://example.com/img.jpg"
wikidata_repo.get_wikidata_info.assert_not_awaited()
@pytest.mark.asyncio
async def test_invalid_mbid_raises_value_error(self):
svc, _ = _make_service()
with pytest.raises(ValueError):
await svc.get_artist_info_basic("not-a-uuid")