diff --git a/test/music_library/listening_stats_test.exs b/test/music_library/listening_stats_test.exs index 901669d6..04fffeba 100644 --- a/test/music_library/listening_stats_test.exs +++ b/test/music_library/listening_stats_test.exs @@ -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,13 +60,13 @@ defmodule MusicLibrary.ListeningStatsTest do end test "returns image_hash from artist_infos when available" do - artist_mbid = Ecto.UUID.generate() + artist_info = + artist_info_fixture(%{ + musicbrainz_data: %{"name" => "Test Artist"}, + image_data_hash: "abc123" + }) - MusicLibrary.Repo.insert!(%MusicLibrary.Artists.ArtistInfo{ - id: artist_mbid, - musicbrainz_data: %{"name" => "Test Artist"}, - image_data_hash: "abc123" - }) + artist_mbid = artist_info.id track_fixture(%{ artist_name: "Test Artist", @@ -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) diff --git a/test/music_library/records/similarity_test.exs b/test/music_library/records/similarity_test.exs index 092e7a90..2f2ad76e 100644 --- a/test/music_library/records/similarity_test.exs +++ b/test/music_library/records/similarity_test.exs @@ -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,17 +34,15 @@ defmodule MusicLibrary.Records.SimilarityTest do end test "includes Wikipedia data when available" do - artist_id = Ecto.UUID.generate() - - Repo.insert!(%ArtistInfo{ - id: artist_id, - musicbrainz_data: %{"name" => "Radiohead"}, - wikipedia_data: %{ - "description" => "English rock band", - "extract" => - "Radiohead are an English rock band formed in Abingdon. They are known for experimental music." - } - }) + artist_info = + artist_info_fixture(%{ + musicbrainz_data: %{"name" => "Radiohead"}, + wikipedia_data: %{ + "description" => "English rock band", + "extract" => + "Radiohead are an English rock band formed in Abingdon. They are known for experimental music." + } + }) record = %Record{ title: "OK Computer", @@ -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,17 +68,15 @@ 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, - musicbrainz_data: %{"name" => "Some Artist"}, - discogs_data: %{ - "name" => "Some Artist", - "profile_plaintext" => "Some Artist is a funk band. They have released many albums.", - "members" => [%{"name" => "Member One"}, %{"name" => "Member Two"}] - } - }) + artist_info = + artist_info_fixture(%{ + musicbrainz_data: %{"name" => "Some Artist"}, + discogs_data: %{ + "name" => "Some Artist", + "profile_plaintext" => "Some Artist is a funk band. They have released many albums.", + "members" => [%{"name" => "Member One"}, %{"name" => "Member Two"}] + } + }) record = %Record{ title: "Funky Album", @@ -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: "" } diff --git a/test/music_library/worker/apply_scrobble_rules_test.exs b/test/music_library/worker/apply_scrobble_rules_test.exs index c79b64df..6ba50cee 100644 --- a/test/music_library/worker/apply_scrobble_rules_test.exs +++ b/test/music_library/worker/apply_scrobble_rules_test.exs @@ -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: %{}}) diff --git a/test/music_library/worker/artist_refresh_discogs_data_test.exs b/test/music_library/worker/artist_refresh_discogs_data_test.exs index cf23fd56..7488b754 100644 --- a/test/music_library/worker/artist_refresh_discogs_data_test.exs +++ b/test/music_library/worker/artist_refresh_discogs_data_test.exs @@ -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 diff --git a/test/music_library/worker/artist_refresh_music_brainz_data_test.exs b/test/music_library/worker/artist_refresh_music_brainz_data_test.exs index b7bd8357..b2319f02 100644 --- a/test/music_library/worker/artist_refresh_music_brainz_data_test.exs +++ b/test/music_library/worker/artist_refresh_music_brainz_data_test.exs @@ -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 diff --git a/test/music_library/worker/artist_refresh_wikipedia_data_test.exs b/test/music_library/worker/artist_refresh_wikipedia_data_test.exs index 3f5150b8..060e28d5 100644 --- a/test/music_library/worker/artist_refresh_wikipedia_data_test.exs +++ b/test/music_library/worker/artist_refresh_wikipedia_data_test.exs @@ -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 diff --git a/test/music_library/worker/fetch_artist_image_test.exs b/test/music_library/worker/fetch_artist_image_test.exs index eebc99b3..532a0f38 100644 --- a/test/music_library/worker/fetch_artist_image_test.exs +++ b/test/music_library/worker/fetch_artist_image_test.exs @@ -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, - musicbrainz_data: %{"name" => "No Image Artist"}, - discogs_data: nil - }) + 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, - musicbrainz_data: %{"name" => "No Image Artist"}, - discogs_data: %{"id" => 12_345, "images" => []} - }) + 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 diff --git a/test/music_library/worker/fetch_artist_last_fm_data_test.exs b/test/music_library/worker/fetch_artist_last_fm_data_test.exs index 3f752115..3bcbca8a 100644 --- a/test/music_library/worker/fetch_artist_last_fm_data_test.exs +++ b/test/music_library/worker/fetch_artist_last_fm_data_test.exs @@ -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 diff --git a/test/music_library/worker/prune_artist_info_test.exs b/test/music_library/worker/prune_artist_info_test.exs index 1949d313..c0eb2d41 100644 --- a/test/music_library/worker/prune_artist_info_test.exs +++ b/test/music_library/worker/prune_artist_info_test.exs @@ -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 diff --git a/test/support/fixtures/music_library/artist_infos.ex b/test/support/fixtures/music_library/artist_infos.ex new file mode 100644 index 00000000..e5be8374 --- /dev/null +++ b/test/support/fixtures/music_library/artist_infos.ex @@ -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