ML-182.3: finish wave-3 of conversion LiveViewTest to PhoenixTest

This commit is contained in:
Claudio Ortolina
2026-05-16 15:22:15 +01:00
parent b6f429406f
commit 07d65fe78f
2 changed files with 80 additions and 72 deletions
@@ -1,10 +1,10 @@
--- ---
id: ML-182.3 id: ML-182.3
title: "Wave 3: Convert live/2 → visit/2 for CRUD LiveViews (6 files)" title: "Wave 3: Convert live/2 → visit/2 for CRUD LiveViews (6 files)"
status: In Progress status: Done
assignee: [] assignee: []
created_date: "2026-05-14 22:14" created_date: "2026-05-14 22:14"
updated_date: "2026-05-15 06:01" updated_date: "2026-05-16 14:23"
labels: labels:
- testing - testing
- refactoring - refactoring
@@ -3,7 +3,16 @@ defmodule MusicLibraryWeb.ScrobbledTracksLive.RulePickerTest do
import MusicLibrary.Fixtures.Records import MusicLibrary.Fixtures.Records
import MusicLibrary.ScrobbledTracksFixtures import MusicLibrary.ScrobbledTracksFixtures
import Phoenix.LiveViewTest
import Phoenix.LiveViewTest,
only: [
render_submit: 1,
render_click: 1,
render_click: 2,
render_click: 3,
form: 3,
element: 2
]
alias MusicLibrary.ScrobbleRules alias MusicLibrary.ScrobbleRules
@@ -24,39 +33,43 @@ defmodule MusicLibraryWeb.ScrobbledTracksLive.RulePickerTest do
%{collected: collected} %{collected: collected}
end end
defp open_rule_picker(view, album_title) do defp open_rule_picker(session, album_title) do
render_click(view, "open_rule_picker", %{"album-title" => album_title}) unwrap(session, fn view ->
view render_click(view, "open_rule_picker", %{"album-title" => album_title})
end)
end end
defp search_picker(view, query) do defp search_picker(session, query) do
view unwrap(session, fn view ->
|> form("#rule-picker-navigation form", %{query: query}) view
|> render_submit() |> form("#rule-picker-navigation form", %{query: query})
|> render_submit()
end)
end end
describe "Rule picker modal" do describe "Rule picker modal" do
setup [:create_track_without_album_mbid] setup [:create_track_without_album_mbid]
test "opens and shows album title", %{conn: conn, track: track} do test "opens and shows album title", %{conn: conn, track: track} do
{:ok, view, _html} = live(conn, ~p"/scrobbled-tracks") conn
|> visit(~p"/scrobbled-tracks")
open_rule_picker(view, track.album.title) |> open_rule_picker(track.album.title)
|> assert_has("#rule-picker-modal")
assert has_element?(view, "#rule-picker-modal") |> assert_has("h1", "Create Scrobble Rule")
assert has_element?(view, "h1", "Create Scrobble Rule") |> assert_has("*", track.album.title)
assert render(view) =~ track.album.title
end end
test "closes when close event is triggered", %{conn: conn, track: track} do test "closes when close event is triggered", %{conn: conn, track: track} do
{:ok, view, _html} = live(conn, ~p"/scrobbled-tracks") session =
conn
|> visit(~p"/scrobbled-tracks")
|> open_rule_picker(track.album.title)
open_rule_picker(view, track.album.title) assert_has(session, "#rule-picker-modal")
assert has_element?(view, "#rule-picker-modal")
render_click(view, "close_rule_picker") session
|> unwrap(fn view -> render_click(view, "close_rule_picker") end)
refute has_element?(view, "#rule-picker-modal") |> refute_has("#rule-picker-modal")
end end
end end
@@ -68,13 +81,12 @@ defmodule MusicLibraryWeb.ScrobbledTracksLive.RulePickerTest do
track: track, track: track,
collected: collected collected: collected
} do } do
{:ok, view, _html} = live(conn, ~p"/scrobbled-tracks") conn
|> visit(~p"/scrobbled-tracks")
open_rule_picker(view, track.album.title) |> open_rule_picker(track.album.title)
html = search_picker(view, collected.title) |> search_picker(collected.title)
|> assert_has("p", collected.title)
assert html =~ collected.title |> assert_has("h3", "Collected")
assert html =~ "Collected"
end end
test "filters out records without selected_release_id", %{conn: conn, track: track} do test "filters out records without selected_release_id", %{conn: conn, track: track} do
@@ -87,37 +99,31 @@ defmodule MusicLibraryWeb.ScrobbledTracksLive.RulePickerTest do
assert is_nil(no_release.selected_release_id) assert is_nil(no_release.selected_release_id)
{:ok, view, _html} = live(conn, ~p"/scrobbled-tracks") conn
|> visit(~p"/scrobbled-tracks")
open_rule_picker(view, track.album.title) |> open_rule_picker(track.album.title)
search_picker(view, "No Release Zzzzzz") |> search_picker("No Release Zzzzzz")
|> refute_has("li[phx-click='select_record'][phx-value-record-id='#{no_release.id}']")
refute has_element?(
view,
"li[phx-click='select_record'][phx-value-record-id='#{no_release.id}']"
)
end end
test "shows wishlisted records", %{conn: conn, track: track} do test "shows wishlisted records", %{conn: conn, track: track} do
wishlisted = record(%{title: "Wish You Were Here", purchased_at: nil}) wishlisted = record(%{title: "Wish You Were Here", purchased_at: nil})
{:ok, view, _html} = live(conn, ~p"/scrobbled-tracks") conn
|> visit(~p"/scrobbled-tracks")
open_rule_picker(view, track.album.title) |> open_rule_picker(track.album.title)
html = search_picker(view, wishlisted.title) |> search_picker(wishlisted.title)
|> assert_has("p", wishlisted.title)
assert html =~ wishlisted.title |> assert_has("h3", "Wishlisted")
assert html =~ "Wishlisted"
end end
test "empty search returns no results", %{conn: conn, track: track} do test "empty search returns no results", %{conn: conn, track: track} do
{:ok, view, _html} = live(conn, ~p"/scrobbled-tracks") conn
|> visit(~p"/scrobbled-tracks")
open_rule_picker(view, track.album.title) |> open_rule_picker(track.album.title)
html = search_picker(view, " ") |> search_picker(" ")
|> refute_has("h3", "Collected")
refute html =~ "Collected" |> refute_has("h3", "Wishlisted")
refute html =~ "Wishlisted"
end end
end end
@@ -129,16 +135,16 @@ defmodule MusicLibraryWeb.ScrobbledTracksLive.RulePickerTest do
track: track, track: track,
collected: collected collected: collected
} do } do
{:ok, view, _html} = live(conn, ~p"/scrobbled-tracks") conn
|> visit(~p"/scrobbled-tracks")
open_rule_picker(view, track.album.title) |> open_rule_picker(track.album.title)
search_picker(view, collected.title) |> search_picker(collected.title)
|> unwrap(fn view ->
view view
|> element("li[phx-click='select_record'][phx-value-record-id='#{collected.id}']") |> element("li[phx-click='select_record'][phx-value-record-id='#{collected.id}']")
|> render_click() |> render_click()
end)
refute has_element?(view, "#rule-picker-modal") |> refute_has("#rule-picker-modal")
[rule] = ScrobbleRules.list_scrobble_rules(type: :album) [rule] = ScrobbleRules.list_scrobble_rules(type: :album)
assert rule.match_value == track.album.title assert rule.match_value == track.album.title
@@ -155,17 +161,19 @@ defmodule MusicLibraryWeb.ScrobbledTracksLive.RulePickerTest do
target_musicbrainz_id: Ecto.UUID.generate() target_musicbrainz_id: Ecto.UUID.generate()
}) })
{:ok, view, _html} = live(conn, ~p"/scrobbled-tracks") session =
conn
open_rule_picker(view, track.album.title) |> visit(~p"/scrobbled-tracks")
search_picker(view, collected.title) |> open_rule_picker(track.album.title)
|> search_picker(collected.title)
view |> unwrap(fn view ->
|> element("li[phx-click='select_record'][phx-value-record-id='#{collected.id}']") view
|> render_click() |> element("li[phx-click='select_record'][phx-value-record-id='#{collected.id}']")
|> render_click()
end)
# Modal stays open after error # Modal stays open after error
assert has_element?(view, "#rule-picker-modal") assert_has(session, "#rule-picker-modal")
# Only the original rule exists, no duplicate was created # Only the original rule exists, no duplicate was created
assert length(ScrobbleRules.list_scrobble_rules(type: :album)) == 1 assert length(ScrobbleRules.list_scrobble_rules(type: :album)) == 1