Load release when opening collection show page
Includes small fixes to make both logic and tests more robust
This commit is contained in:
@@ -37,10 +37,10 @@ defmodule MusicBrainz.Release do
|
|||||||
%__MODULE__{
|
%__MODULE__{
|
||||||
id: r["id"],
|
id: r["id"],
|
||||||
title: r["title"],
|
title: r["title"],
|
||||||
artists: parse_artists(r["artist-credit"]),
|
artists: parse_artists(r["artist-credit"] || []),
|
||||||
date: r["date"],
|
date: r["date"],
|
||||||
barcode: r["barcode"],
|
barcode: r["barcode"],
|
||||||
media: parse_media(r["media"])
|
media: parse_media(r["media"] || [])
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -15,8 +15,19 @@ defmodule MusicLibraryWeb.ReleaseComponent do
|
|||||||
def mount(socket) do
|
def mount(socket) do
|
||||||
{:ok,
|
{:ok,
|
||||||
socket
|
socket
|
||||||
|> assign(:can_scrobble?, ScrobbleActivity.can_scrobble?())
|
|> assign(:can_scrobble?, ScrobbleActivity.can_scrobble?())}
|
||||||
|> assign(:release_with_tracks, nil)}
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def update(%{record: record} = assigns, socket) do
|
||||||
|
{:ok,
|
||||||
|
socket
|
||||||
|
|> assign(assigns)
|
||||||
|
|> assign_async(:release_with_tracks, fn ->
|
||||||
|
with {:ok, release} <- MusicBrainz.get_release(record.selected_release_id) do
|
||||||
|
{:ok, %{release_with_tracks: MusicBrainz.Release.from_api_response(release)}}
|
||||||
|
end
|
||||||
|
end)}
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
@@ -27,7 +38,6 @@ defmodule MusicLibraryWeb.ReleaseComponent do
|
|||||||
:if={@record.selected_release_id}
|
:if={@record.selected_release_id}
|
||||||
id={@sheet_id}
|
id={@sheet_id}
|
||||||
placement="right"
|
placement="right"
|
||||||
on_open={JS.push("load_release_with_tracks", target: @myself)}
|
|
||||||
>
|
>
|
||||||
<div class="mt-6 flex justify-between items-center gap-4">
|
<div class="mt-6 flex justify-between items-center gap-4">
|
||||||
<h3 class="text-lg font-semibold text-zinc-700 dark:text-zinc-300">{gettext("Tracks")}</h3>
|
<h3 class="text-lg font-semibold text-zinc-700 dark:text-zinc-300">{gettext("Tracks")}</h3>
|
||||||
@@ -126,18 +136,6 @@ defmodule MusicLibraryWeb.ReleaseComponent do
|
|||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def handle_event("load_release_with_tracks", _params, socket) do
|
|
||||||
selected_release_id = socket.assigns.record.selected_release_id
|
|
||||||
|
|
||||||
{:noreply,
|
|
||||||
socket
|
|
||||||
|> assign_async(:release_with_tracks, fn ->
|
|
||||||
with {:ok, release} <- MusicBrainz.get_release(selected_release_id) do
|
|
||||||
{:ok, %{release_with_tracks: MusicBrainz.Release.from_api_response(release)}}
|
|
||||||
end
|
|
||||||
end)}
|
|
||||||
end
|
|
||||||
|
|
||||||
def handle_event("scrobble_release", _params, socket) do
|
def handle_event("scrobble_release", _params, socket) do
|
||||||
release_with_tracks_async_result =
|
release_with_tracks_async_result =
|
||||||
socket.assigns.release_with_tracks
|
socket.assigns.release_with_tracks
|
||||||
|
|||||||
@@ -13,12 +13,15 @@ defmodule MusicLibraryWeb.CollectionLive.ShowTest do
|
|||||||
test "can navigate to the record edit form", %{conn: conn} do
|
test "can navigate to the record edit form", %{conn: conn} do
|
||||||
record = record()
|
record = record()
|
||||||
|
|
||||||
|
release_response = Fixtures.Release.release(:marbles)
|
||||||
|
|
||||||
Req.Test.stub(MusicBrainz.API, fn conn ->
|
Req.Test.stub(MusicBrainz.API, fn conn ->
|
||||||
Req.Test.json(conn, Fixtures.Release.release(:marbles))
|
Req.Test.json(conn, release_response)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
conn
|
conn
|
||||||
|> visit(~p"/collection/#{record.id}")
|
|> visit(~p"/collection/#{record.id}")
|
||||||
|
|> unwrap(&render_async/1)
|
||||||
|> assert_has("a", text: "Edit")
|
|> assert_has("a", text: "Edit")
|
||||||
|> click_link("Edit")
|
|> click_link("Edit")
|
||||||
|> assert_path(~p"/collection/#{record}/show/edit")
|
|> assert_path(~p"/collection/#{record}/show/edit")
|
||||||
@@ -30,13 +33,16 @@ defmodule MusicLibraryWeb.CollectionLive.ShowTest do
|
|||||||
record = record()
|
record = record()
|
||||||
cover_url = ~p"/covers/#{record.id}?vsn=#{record.cover_hash}"
|
cover_url = ~p"/covers/#{record.id}?vsn=#{record.cover_hash}"
|
||||||
|
|
||||||
|
release_response = Fixtures.Release.release(:marbles)
|
||||||
|
|
||||||
Req.Test.stub(MusicBrainz.API, fn conn ->
|
Req.Test.stub(MusicBrainz.API, fn conn ->
|
||||||
Req.Test.json(conn, Fixtures.Release.release(:marbles))
|
Req.Test.json(conn, release_response)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
session =
|
session =
|
||||||
conn
|
conn
|
||||||
|> visit(~p"/collection/#{record.id}")
|
|> visit(~p"/collection/#{record.id}")
|
||||||
|
|> unwrap(&render_async/1)
|
||||||
|> assert_has("h2", text: escape(record.title))
|
|> assert_has("h2", text: escape(record.title))
|
||||||
|> assert_has("p", text: record.release_date)
|
|> assert_has("p", text: record.release_date)
|
||||||
|> assert_has("p", text: format_label(record.format))
|
|> assert_has("p", text: format_label(record.format))
|
||||||
@@ -60,7 +66,6 @@ defmodule MusicLibraryWeb.CollectionLive.ShowTest do
|
|||||||
end
|
end
|
||||||
|
|
||||||
describe "Side panel" do
|
describe "Side panel" do
|
||||||
@tag :skip
|
|
||||||
test "shows a record's tracks", %{conn: conn} do
|
test "shows a record's tracks", %{conn: conn} do
|
||||||
record = record()
|
record = record()
|
||||||
|
|
||||||
@@ -74,14 +79,7 @@ defmodule MusicLibraryWeb.CollectionLive.ShowTest do
|
|||||||
conn
|
conn
|
||||||
|> visit(~p"/collection/#{record.id}")
|
|> visit(~p"/collection/#{record.id}")
|
||||||
|> assert_has("button", text: "Show Tracks")
|
|> assert_has("button", text: "Show Tracks")
|
||||||
|> unwrap(fn view ->
|
|> unwrap(&render_async/1)
|
||||||
# we can't directly click the "Show Tracks" button as
|
|
||||||
# its phx-click event uses a JS command. Bit of a hack, but we can simulate
|
|
||||||
# the click by pretending we're dealing with a JS hook, and trigger the event
|
|
||||||
# that is sent by the JS command.
|
|
||||||
view
|
|
||||||
|> Phoenix.LiveViewTest.render_hook(:load_release_with_tracks, %{})
|
|
||||||
end)
|
|
||||||
|> assert_has("a", text: "Connect your Last.fm account")
|
|> assert_has("a", text: "Connect your Last.fm account")
|
||||||
|
|
||||||
release =
|
release =
|
||||||
|
|||||||
Reference in New Issue
Block a user