From 0cbece6ed4769fb2cf3d32a73c92a3cb55393480 Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Mon, 11 Nov 2024 10:28:17 +0000 Subject: [PATCH] Add Records search tests Important note: to help, we use a deterministic implementation of artist UUID generation based on the artist name. --- test/music_library/records_test.exs | 63 +++++++++++++++++++++++ test/support/fixtures/records_fixtures.ex | 51 +++++++++++++++++- 2 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 test/music_library/records_test.exs diff --git a/test/music_library/records_test.exs b/test/music_library/records_test.exs new file mode 100644 index 00000000..c6018d44 --- /dev/null +++ b/test/music_library/records_test.exs @@ -0,0 +1,63 @@ +defmodule MusicLibrary.RecordsTest do + use MusicLibrary.DataCase + + alias MusicLibrary.Records + alias MusicLibrary.Records.Record + import MusicLibrary.RecordsFixtures + + defp create_records(_) do + records = [ + record_fixture_with_artist("Marillion", %{title: "Brave", format: :vinyl}), + record_fixture_with_artist("Marillion", %{title: "Brave (Live)", format: :cd, type: :live}), + record_fixture_with_artist("Marillion", %{title: "Afraid of Sunlight"}), + record_fixture_with_artist("Airbag", %{title: "The Greatest Show on Earth"}), + record_fixture_with_artist("Airbag (AU)", %{title: "Libertad"}) + ] + + %{records: records} + end + + # using record ids as records contain autogenerated fields which are not loaded when the record is created + defp search(query, limit, offset) do + Record + |> Records.search_records(query, limit: limit, offset: offset) + |> Enum.map(& &1.id) + end + + describe "search_records/2" do + setup [:create_records] + + test "untagged search (with limit and offset)", %{ + records: [brave_vinyl, brave_live_cd | _rest] + } do + assert [brave_vinyl.id, brave_live_cd.id] == search("brave", 10, 0) + assert [brave_vinyl.id] == search("brave", 1, 0) + assert [brave_live_cd.id] == search("brave", 1, 1) + end + + test "tagged search - album", %{records: [brave_vinyl, brave_live_cd | _rest]} do + assert [brave_live_cd.id] == search(~s(album:"Brave \(Live\)"), 10, 0) + end + + test "tagged search - artist", %{records: [_, _, _, greatest_show_on_earth, libertad]} do + assert [greatest_show_on_earth.id, libertad.id] == search("artist:airbag", 10, 0) + assert [libertad.id] == search(~s(artist:"airbag \(AU\)"), 10, 0) + end + + test "tagged search - format", %{records: [_brave_vinyl, brave_live_cd | _rest]} do + assert [brave_live_cd.id] == search("brave format:cd", 10, 0) + end + + test "tagged search - type", %{records: [_brave_vinyl, brave_live_cd | _rest]} do + assert [brave_live_cd.id] == search("brave type:live", 10, 0) + end + + test "tagged search - mbid", %{records: [_, _, _, greatest_show_on_earth, libertad]} do + [airbag_mbid] = Enum.map(greatest_show_on_earth.artists, fn a -> a.musicbrainz_id end) + [airbag_au_mbid] = Enum.map(libertad.artists, fn a -> a.musicbrainz_id end) + + assert [greatest_show_on_earth.id] == search("mbid:#{airbag_mbid}", 10, 0) + assert [libertad.id] == search("mbid:#{airbag_au_mbid}", 10, 0) + end + end +end diff --git a/test/support/fixtures/records_fixtures.ex b/test/support/fixtures/records_fixtures.ex index ff8d4f14..aecf2c78 100644 --- a/test/support/fixtures/records_fixtures.ex +++ b/test/support/fixtures/records_fixtures.ex @@ -55,7 +55,7 @@ defmodule MusicLibrary.RecordsFixtures do artists_attrs = [ %{ name: artist_name, - musicbrainz_id: Ecto.UUID.generate(), + musicbrainz_id: artist_uuid(artist_name), sort_name: artist_name, disambiguation: artist_name } @@ -79,4 +79,53 @@ defmodule MusicLibrary.RecordsFixtures do record end + + def record_fixture_with_artist(artist_name, record_attrs \\ %{}) do + artists_attrs = [ + %{ + name: artist_name, + musicbrainz_id: artist_uuid(artist_name), + sort_name: artist_name, + disambiguation: artist_name + } + ] + + record_attrs + |> Map.put(:artists, artists_attrs) + |> record_fixture() + end + + defp artist_uuid(name) do + <> = :crypto.hash(:md5, name) + encode(<>) + end + + defp encode( + <> + ) do + <> + end + + @compile {:inline, e: 1} + + defp e(0), do: ?0 + defp e(1), do: ?1 + defp e(2), do: ?2 + defp e(3), do: ?3 + defp e(4), do: ?4 + defp e(5), do: ?5 + defp e(6), do: ?6 + defp e(7), do: ?7 + defp e(8), do: ?8 + defp e(9), do: ?9 + defp e(10), do: ?a + defp e(11), do: ?b + defp e(12), do: ?c + defp e(13), do: ?d + defp e(14), do: ?e + defp e(15), do: ?f end