diff --git a/lib/music_library_web/live/record_live/form_component.ex b/lib/music_library_web/live/record_live/form_component.ex index feb6adc7..6dee9d13 100644 --- a/lib/music_library_web/live/record_live/form_component.ex +++ b/lib/music_library_web/live/record_live/form_component.ex @@ -43,10 +43,14 @@ defmodule MusicLibraryWeb.RecordLive.FormComponent do /> <.input field={@form[:release]} type="text" label="Release" /> -
+
<.label for={@uploads.cover_data.ref}> Cover art + No cover selected + <%= for entry <- @uploads.cover_data.entries do %> + <%= entry.progress %>% + <% end %> <.live_file_input class="mt-2 block w-full rounded-lg text-zinc-900 focus:ring-0 sm:text-sm sm:leading-6" upload={@uploads.cover_data} diff --git a/test/music_library_web/live/record_live_test.exs b/test/music_library_web/live/record_live_test.exs index ddf0755f..a2f65157 100644 --- a/test/music_library_web/live/record_live_test.exs +++ b/test/music_library_web/live/record_live_test.exs @@ -19,7 +19,7 @@ defmodule MusicLibraryWeb.RecordLiveTest do describe "Paginated list of records" do setup [:create_records] - test "lists all records within default pagination params", %{conn: conn, records: records} do + test "uses default params", %{conn: conn, records: records} do {:ok, index_live, html} = live(conn, ~p"/records") assert html =~ "Listing Records" @@ -51,7 +51,7 @@ defmodule MusicLibraryWeb.RecordLiveTest do end end - test "paginates records", %{conn: conn, records: records} do + test "uses query string params", %{conn: conn, records: records} do {:ok, page_2_live, page_2_html} = live(conn, ~p"/records?page=2&page_size=5") {page_2_present, page_2_absent} = @@ -92,4 +92,63 @@ defmodule MusicLibraryWeb.RecordLiveTest do assert page_2_present -- page_3_absent == [] end end + + describe "Updating record metadata" do + test "can navigate to the record edit form", %{conn: conn} do + record = record_fixture() + + {:ok, index_live, _html} = live(conn, ~p"/records") + + assert index_live + |> element("#records-#{record.id} a", "Edit") + |> render_click() =~ "Edit Metadata" + + assert_patch(index_live, ~p"/records/#{record}/edit") + + assert index_live |> render() =~ "Edit Metadata" + end + + test "can change the record cover", %{conn: conn} do + record = record_fixture(cover_data: File.read!(marbles_cover_fixture())) + {:ok, form_live, html} = live(conn, ~p"/records/#{record.id}/edit") + + assert html =~ ~p"/images/#{record.id}?vsn=#{record.cover_hash}" + + cover_metadata = cover_metadata(raven_cover_fixture()) + + cover_input = file_input(form_live, "#record-form", :cover_data, [cover_metadata]) + + assert render_upload(cover_input, cover_metadata.name) =~ "100%" + + list_html = form_live |> element("#record-form") |> render_submit() + + assert list_html =~ "Record updated successfully" + + # We trigger another render to force the list view to update + # and display the new cover + list_html = form_live |> render() + + updated_cover = MusicLibrary.Records.get_cover(record.id) + + assert updated_cover.cover_hash !== record.cover_hash + + assert list_html =~ ~p"/images/#{record.id}?vsn=#{updated_cover.cover_hash}" + end + + defp cover_metadata(path) do + stat = File.stat!(path) + + %{ + last_modified: + stat.mtime + |> NaiveDateTime.from_erl!() + |> DateTime.from_naive!("Etc/UTC") + |> DateTime.to_unix(), + name: Path.basename(path), + content: File.read!(path), + size: stat.size, + type: "image/jpeg" + } + end + end end diff --git a/test/support/fixtures/records_fixtures.ex b/test/support/fixtures/records_fixtures.ex index 44c52ca5..861ec105 100644 --- a/test/support/fixtures/records_fixtures.ex +++ b/test/support/fixtures/records_fixtures.ex @@ -31,7 +31,11 @@ defmodule MusicLibrary.RecordsFixtures do "Thick as a Brick" ] # While it would be great to have this random, it's ok to use one single image - @cover_data_path "#{__DIR__}/marillion-marbles.jpg" + @marbles_cover_data_path "#{__DIR__}/marillion-marbles.jpg" + @raven_cover_data_path "#{__DIR__}/steven-wilson-raven.jpg" + + def marbles_cover_fixture, do: @marbles_cover_data_path + def raven_cover_fixture, do: @raven_cover_data_path def record_fixture(attrs \\ %{}) do musicbrainz_id = Ecto.UUID.generate() @@ -41,7 +45,7 @@ defmodule MusicLibrary.RecordsFixtures do |> Enum.into(%{ genres: Enum.take_random(@genres, :rand.uniform(3)), cover_url: "https://coverartarchive.org/release-group/#{musicbrainz_id}/front", - cover_data: File.read!(@cover_data_path), + cover_data: File.read!(@marbles_cover_data_path), musicbrainz_id: musicbrainz_id, title: Enum.random(@titles), type: :album, diff --git a/test/support/fixtures/steven-wilson-raven.jpg b/test/support/fixtures/steven-wilson-raven.jpg new file mode 100644 index 00000000..5920cc89 Binary files /dev/null and b/test/support/fixtures/steven-wilson-raven.jpg differ