Extract artist infos fixtures

This commit is contained in:
Claudio Ortolina
2026-03-06 08:58:59 +00:00
parent 3819afca4d
commit f9b381570f
10 changed files with 98 additions and 110 deletions
+11 -15
View File
@@ -1,6 +1,7 @@
defmodule MusicLibrary.ListeningStatsTest do
use MusicLibrary.DataCase
import MusicLibrary.ArtistInfoFixtures
import MusicLibrary.ScrobbledTracksFixtures
alias MusicLibrary.ListeningStats
@@ -19,13 +20,10 @@ defmodule MusicLibrary.ListeningStatsTest do
describe "get_top_artists/1" do
test "counts tracks with missing artist_infos records" do
artist_mbid = Ecto.UUID.generate()
artist_info =
artist_info_fixture(%{musicbrainz_data: %{"name" => "Thin Lizzy"}})
# Create an artist_info record for the known musicbrainz_id
MusicLibrary.Repo.insert!(%MusicLibrary.Artists.ArtistInfo{
id: artist_mbid,
musicbrainz_data: %{"name" => "Thin Lizzy"}
})
artist_mbid = artist_info.id
now = System.system_time(:second)
@@ -62,14 +60,14 @@ defmodule MusicLibrary.ListeningStatsTest do
end
test "returns image_hash from artist_infos when available" do
artist_mbid = Ecto.UUID.generate()
MusicLibrary.Repo.insert!(%MusicLibrary.Artists.ArtistInfo{
id: artist_mbid,
artist_info =
artist_info_fixture(%{
musicbrainz_data: %{"name" => "Test Artist"},
image_data_hash: "abc123"
})
artist_mbid = artist_info.id
track_fixture(%{
artist_name: "Test Artist",
artist_musicbrainz_id: artist_mbid,
@@ -98,12 +96,10 @@ defmodule MusicLibrary.ListeningStatsTest do
describe "get_top_artists_by_days/2" do
test "counts tracks with missing artist_infos records within date range" do
artist_mbid = Ecto.UUID.generate()
artist_info =
artist_info_fixture(%{musicbrainz_data: %{"name" => "Thin Lizzy"}})
MusicLibrary.Repo.insert!(%MusicLibrary.Artists.ArtistInfo{
id: artist_mbid,
musicbrainz_data: %{"name" => "Thin Lizzy"}
})
artist_mbid = artist_info.id
now = DateTime.utc_now()
now_unix = DateTime.to_unix(now)
+7 -12
View File
@@ -1,11 +1,10 @@
defmodule MusicLibrary.Records.SimilarityTest do
use MusicLibrary.DataCase
import MusicLibrary.ArtistInfoFixtures
import MusicLibrary.Fixtures.Records
alias MusicLibrary.Artists.ArtistInfo
alias MusicLibrary.Records.{Record, Similarity}
alias MusicLibrary.Repo
describe "text_representation/1" do
test "generates text representation for a record" do
@@ -35,10 +34,8 @@ defmodule MusicLibrary.Records.SimilarityTest do
end
test "includes Wikipedia data when available" do
artist_id = Ecto.UUID.generate()
Repo.insert!(%ArtistInfo{
id: artist_id,
artist_info =
artist_info_fixture(%{
musicbrainz_data: %{"name" => "Radiohead"},
wikipedia_data: %{
"description" => "English rock band",
@@ -53,7 +50,7 @@ defmodule MusicLibrary.Records.SimilarityTest do
%{
name: "Radiohead",
sort_name: "Radiohead",
musicbrainz_id: artist_id,
musicbrainz_id: artist_info.id,
disambiguation: "",
joinphrase: ""
}
@@ -71,10 +68,8 @@ defmodule MusicLibrary.Records.SimilarityTest do
end
test "falls back to truncated Discogs profile when Wikipedia unavailable" do
artist_id = Ecto.UUID.generate()
Repo.insert!(%ArtistInfo{
id: artist_id,
artist_info =
artist_info_fixture(%{
musicbrainz_data: %{"name" => "Some Artist"},
discogs_data: %{
"name" => "Some Artist",
@@ -89,7 +84,7 @@ defmodule MusicLibrary.Records.SimilarityTest do
%{
name: "Some Artist",
sort_name: "Some Artist",
musicbrainz_id: artist_id,
musicbrainz_id: artist_info.id,
disambiguation: "",
joinphrase: ""
}
@@ -1,6 +1,8 @@
defmodule MusicLibrary.Worker.ApplyScrobbleRulesTest do
use MusicLibrary.DataCase
import MusicLibrary.ScrobbledTracksFixtures
alias LastFm.Track
alias MusicLibrary.ScrobbleRules
alias MusicLibrary.Worker.ApplyScrobbleRules
@@ -34,31 +36,21 @@ defmodule MusicLibrary.Worker.ApplyScrobbleRulesTest do
})
# Create test tracks
%Track{}
|> Track.changeset(%{
scrobbled_at_uts: System.system_time(:second),
scrobbled_track_fixture(%{
musicbrainz_id: "track-mbid-1",
title: "Breathe",
cover_url: "http://example.com/cover.jpg",
scrobbled_at_label: "01 Jan 2023, 12:00",
artist: %{musicbrainz_id: "", name: "Pink Floyd"},
album: %{musicbrainz_id: "", title: "Dark Side of the Moon"},
last_fm_data: %{}
album: %{musicbrainz_id: "", title: "Dark Side of the Moon"}
})
|> Repo.insert!()
%Track{}
|> Track.changeset(%{
scrobbled_track_fixture(%{
scrobbled_at_uts: System.system_time(:second) + 1,
musicbrainz_id: "track-mbid-2",
title: "Money",
cover_url: "http://example.com/cover.jpg",
scrobbled_at_label: "01 Jan 2023, 12:05",
artist: %{musicbrainz_id: "", name: "Pink Floyd"},
album: %{musicbrainz_id: "", title: "Wish You Were Here"},
last_fm_data: %{}
album: %{musicbrainz_id: "", title: "Wish You Were Here"}
})
|> Repo.insert!()
# Execute the worker
assert :ok = ApplyScrobbleRules.perform(%Oban.Job{args: %{}})
@@ -1,6 +1,7 @@
defmodule MusicLibrary.Worker.ArtistRefreshDiscogsDataTest do
use MusicLibrary.DataCase
import MusicLibrary.ArtistInfoFixtures
import MusicLibrary.Fixtures.Records
alias Discogs.Fixtures.Artist, as: ArtistFixture
@@ -27,14 +28,10 @@ defmodule MusicLibrary.Worker.ArtistRefreshDiscogsDataTest do
end
test "returns ok when no discogs data is available" do
artist_id = Ecto.UUID.generate()
artist_info =
artist_info_fixture(%{musicbrainz_data: %{"name" => "No Discogs Artist"}})
Repo.insert!(%Artists.ArtistInfo{
id: artist_id,
musicbrainz_data: %{"name" => "No Discogs Artist"}
})
assert {:ok, _} = perform_job(ArtistRefreshDiscogsData, %{"id" => artist_id})
assert {:ok, _} = perform_job(ArtistRefreshDiscogsData, %{"id" => artist_info.id})
end
end
end
@@ -1,20 +1,18 @@
defmodule MusicLibrary.Worker.ArtistRefreshMusicBrainzDataTest do
use MusicLibrary.DataCase
import MusicLibrary.ArtistInfoFixtures
alias MusicBrainz.Fixtures.Artist, as: ArtistFixture
alias MusicLibrary.Artists
alias MusicLibrary.Artists.ArtistInfo
alias MusicLibrary.Worker.ArtistRefreshMusicBrainzData
setup do
artist_id = Ecto.UUID.generate()
artist_info =
artist_info_fixture(%{musicbrainz_data: %{"name" => "Steven Wilson"}})
Repo.insert!(%ArtistInfo{
id: artist_id,
musicbrainz_data: %{"name" => "Steven Wilson"}
})
%{artist_id: artist_id}
%{artist_id: artist_info.id}
end
describe "perform/1" do
@@ -1,6 +1,7 @@
defmodule MusicLibrary.Worker.ArtistRefreshWikipediaDataTest do
use MusicLibrary.DataCase
import MusicLibrary.ArtistInfoFixtures
import MusicLibrary.Fixtures.Records
alias MusicLibrary.Artists
@@ -38,16 +39,12 @@ defmodule MusicLibrary.Worker.ArtistRefreshWikipediaDataTest do
end
test "discards job when no wikidata_id exists in musicbrainz_data" do
artist_id = Ecto.UUID.generate()
Repo.insert!(%Artists.ArtistInfo{
id: artist_id,
musicbrainz_data: %{"name" => "No Wikipedia Artist"}
})
artist_info =
artist_info_fixture(%{musicbrainz_data: %{"name" => "No Wikipedia Artist"}})
# No wikidata relation in musicbrainz_data → fetch_wikipedia_data returns {:ok, artist_info}
# Worker wraps non-error returns with `with`, so it passes through as :ok
assert {:ok, _} = perform_job(ArtistRefreshWikipediaData, %{"id" => artist_id})
assert {:ok, _} = perform_job(ArtistRefreshWikipediaData, %{"id" => artist_info.id})
end
end
end
@@ -1,6 +1,7 @@
defmodule MusicLibrary.Worker.FetchArtistImageTest do
use MusicLibrary.DataCase
import MusicLibrary.ArtistInfoFixtures
import MusicLibrary.Fixtures.Records
alias Discogs.Fixtures.Artist
@@ -27,29 +28,25 @@ defmodule MusicLibrary.Worker.FetchArtistImageTest do
end
test "cancels when no discogs data exists" do
artist_id = Ecto.UUID.generate()
Repo.insert!(%Artists.ArtistInfo{
id: artist_id,
artist_info =
artist_info_fixture(%{
musicbrainz_data: %{"name" => "No Image Artist"},
discogs_data: nil
})
assert {:cancel, :no_discogs_data} =
perform_job(FetchArtistImage, %{"id" => artist_id})
perform_job(FetchArtistImage, %{"id" => artist_info.id})
end
test "cancels when discogs data has no images" do
artist_id = Ecto.UUID.generate()
Repo.insert!(%Artists.ArtistInfo{
id: artist_id,
artist_info =
artist_info_fixture(%{
musicbrainz_data: %{"name" => "No Image Artist"},
discogs_data: %{"id" => 12_345, "images" => []}
})
assert {:cancel, :image_not_found} =
perform_job(FetchArtistImage, %{"id" => artist_id})
perform_job(FetchArtistImage, %{"id" => artist_info.id})
end
end
end
@@ -1,20 +1,17 @@
defmodule MusicLibrary.Worker.FetchArtistLastFmDataTest do
use MusicLibrary.DataCase
import MusicLibrary.ArtistInfoFixtures
alias MusicLibrary.Artists
alias MusicLibrary.Artists.ArtistInfo
alias MusicLibrary.Repo
alias MusicLibrary.Worker.FetchArtistLastFmData
setup do
artist_id = Ecto.UUID.generate()
artist_info =
artist_info_fixture(%{musicbrainz_data: %{"name" => "Steven Wilson"}})
Repo.insert!(%ArtistInfo{
id: artist_id,
musicbrainz_data: %{"name" => "Steven Wilson"}
})
%{artist_id: artist_id}
%{artist_id: artist_info.id}
end
describe "perform/1" do
@@ -1,6 +1,7 @@
defmodule MusicLibrary.Worker.PruneArtistInfoTest do
use MusicLibrary.DataCase
import MusicLibrary.ArtistInfoFixtures
import MusicLibrary.Fixtures.Records
alias MusicLibrary.Artists
@@ -18,17 +19,13 @@ defmodule MusicLibrary.Worker.PruneArtistInfoTest do
end
test "deletes artist info when artist is not referenced by any record" do
artist_id = Ecto.UUID.generate()
artist_info =
artist_info_fixture(%{musicbrainz_data: %{"name" => "Orphaned Artist"}})
Repo.insert!(%Artists.ArtistInfo{
id: artist_id,
musicbrainz_data: %{"name" => "Orphaned Artist"}
})
assert :ok = perform_job(PruneArtistInfo, %{"id" => artist_id})
assert :ok = perform_job(PruneArtistInfo, %{"id" => artist_info.id})
assert_raise Ecto.NoResultsError, fn ->
Artists.get_artist_info!(artist_id)
Artists.get_artist_info!(artist_info.id)
end
end
end
@@ -0,0 +1,22 @@
defmodule MusicLibrary.ArtistInfoFixtures do
@moduledoc """
This module defines test helpers for creating
entities via the `MusicLibrary.Artists.ArtistInfo` schema.
"""
alias MusicLibrary.Artists.ArtistInfo
alias MusicLibrary.Repo
def artist_info_fixture(attrs \\ %{}) do
attrs =
Map.merge(
%{
id: Ecto.UUID.generate(),
musicbrainz_data: %{"name" => "Test Artist"}
},
attrs
)
Repo.insert!(struct!(ArtistInfo, attrs))
end
end