Enable unaliased modules ex_slop check

This commit is contained in:
Claudio Ortolina
2026-04-22 20:36:13 +01:00
parent 5c1beede53
commit f7f38d580e
26 changed files with 226 additions and 193 deletions
@@ -3,6 +3,7 @@ defmodule MusicLibrary.Chats.ArtistChatTest do
alias MusicLibrary.Artists.{Artist, ArtistInfo}
alias MusicLibrary.Chats.ArtistChat
alias Plug.Conn
defp build_artist(attrs \\ %{}) do
defaults = %{
@@ -44,13 +45,13 @@ defmodule MusicLibrary.Chats.ArtistChatTest do
defp stub_and_capture_instructions(test_pid) do
Req.Test.stub(OpenAI.API, fn conn ->
{:ok, body, conn} = Plug.Conn.read_body(conn)
{:ok, body, conn} = Conn.read_body(conn)
request = JSON.decode!(body)
send(test_pid, {:captured_instructions, request["instructions"]})
conn
|> Plug.Conn.put_resp_content_type("text/event-stream")
|> Plug.Conn.send_resp(200, completed_response())
|> Conn.put_resp_content_type("text/event-stream")
|> Conn.send_resp(200, completed_response())
end)
end
@@ -2,6 +2,7 @@ defmodule MusicLibrary.Chats.CollectionChatTest do
use ExUnit.Case
alias MusicLibrary.Chats.CollectionChat
alias Plug.Conn
defp sse_event(type, data) do
json = JSON.encode!(%{type: type, delta: data})
@@ -15,13 +16,13 @@ defmodule MusicLibrary.Chats.CollectionChatTest do
defp stub_and_capture_instructions(test_pid) do
Req.Test.stub(OpenAI.API, fn conn ->
{:ok, body, conn} = Plug.Conn.read_body(conn)
{:ok, body, conn} = Conn.read_body(conn)
request = JSON.decode!(body)
send(test_pid, {:captured_instructions, request["instructions"]})
conn
|> Plug.Conn.put_resp_content_type("text/event-stream")
|> Plug.Conn.send_resp(200, completed_response())
|> Conn.put_resp_content_type("text/event-stream")
|> Conn.send_resp(200, completed_response())
end)
end
@@ -4,6 +4,7 @@ defmodule MusicLibrary.Chats.RecordChatTest do
alias MusicLibrary.Artists.Artist
alias MusicLibrary.Chats.RecordChat
alias MusicLibrary.Records.Record
alias Plug.Conn
defp build_record(attrs \\ %{}) do
defaults = %{
@@ -36,13 +37,13 @@ defmodule MusicLibrary.Chats.RecordChatTest do
defp stub_and_capture_instructions(test_pid) do
Req.Test.stub(OpenAI.API, fn conn ->
{:ok, body, conn} = Plug.Conn.read_body(conn)
{:ok, body, conn} = Conn.read_body(conn)
request = JSON.decode!(body)
send(test_pid, {:captured_instructions, request["instructions"]})
conn
|> Plug.Conn.put_resp_content_type("text/event-stream")
|> Plug.Conn.send_resp(200, completed_response())
|> Conn.put_resp_content_type("text/event-stream")
|> Conn.send_resp(200, completed_response())
end)
end
@@ -8,6 +8,7 @@ defmodule MusicLibraryWeb.Components.ChatTest do
alias MusicBrainz.Fixtures.ReleaseGroup
alias MusicLibrary.Chats
alias MusicLibraryWeb.Components.Chat
alias Req.Test
@component_id "record-chat"
@@ -16,7 +17,7 @@ defmodule MusicLibraryWeb.Components.ChatTest do
# `OpenAI.API`. A default stub that returns an empty SSE stream prevents
# Req.Test from raising inside the supervised Task process and keeps
# test output noise-free. Individual tests can override this as needed.
Req.Test.stub(OpenAI.API, fn conn ->
Test.stub(OpenAI.API, fn conn ->
conn
|> Plug.Conn.put_resp_content_type("text/event-stream")
|> Plug.Conn.send_resp(
@@ -32,22 +33,22 @@ defmodule MusicLibraryWeb.Components.ChatTest do
release_group = ReleaseGroup.release_group(:marbles)
release = ReleaseFixtures.release(:marbles)
Req.Test.stub(MusicBrainz.API, fn conn ->
Test.stub(MusicBrainz.API, fn conn ->
cond do
conn.host == "coverartarchive.org" ->
Plug.Conn.send_resp(conn, 200, marbles_cover_data())
match?([_, _, "release-group", ^release_group_id], conn.path_info) ->
Req.Test.json(conn, release_group)
Test.json(conn, release_group)
match?([_, _, "release"], conn.path_info) ->
Req.Test.json(conn, ReleaseGroup.release_group_releases(:marbles))
Test.json(conn, ReleaseGroup.release_group_releases(:marbles))
match?([_, _, "release", _], conn.path_info) ->
Req.Test.json(conn, release)
Test.json(conn, release)
true ->
Req.Test.json(conn, %{})
Test.json(conn, %{})
end
end)
end
@@ -164,7 +165,7 @@ defmodule MusicLibraryWeb.Components.ChatTest do
test "streaming error propagates to the component as user-facing text", %{conn: conn} do
record = setup_record()
Req.Test.stub(OpenAI.API, fn conn ->
Test.stub(OpenAI.API, fn conn ->
Plug.Conn.send_resp(conn, 500, JSON.encode!(%{"error" => "internal server error"}))
end)
@@ -16,6 +16,7 @@ defmodule MusicLibraryWeb.Components.ReleaseTest do
alias MusicBrainz.Fixtures.Release, as: ReleaseFixtures
alias MusicLibrary.Secrets
alias Req.Test
@finished_at ~U[2026-03-15 21:00:00Z]
# `@sheet_form` scopes form-change events to the LiveComponent; button
@@ -24,13 +25,13 @@ defmodule MusicLibraryWeb.Components.ReleaseTest do
@sheet_form "#release-with-tracks-sheet-form"
defp stub_musicbrainz_release(_) do
Req.Test.stub(MusicBrainz.API, fn conn ->
Test.stub(MusicBrainz.API, fn conn ->
case conn.request_path do
"/ws/2/release/" <> _id ->
Req.Test.json(conn, ReleaseFixtures.release_with_media(:marbles))
Test.json(conn, ReleaseFixtures.release_with_media(:marbles))
_ ->
Req.Test.json(conn, %{})
Test.json(conn, %{})
end
end)
@@ -40,11 +41,11 @@ defmodule MusicLibraryWeb.Components.ReleaseTest do
defp capture_lastfm_scrobble(_) do
test_pid = self()
Req.Test.stub(LastFm.API, fn conn ->
Test.stub(LastFm.API, fn conn ->
{:ok, body, conn} = Plug.Conn.read_body(conn)
params = URI.decode_query(body)
send(test_pid, {:lastfm_scrobble, params})
Req.Test.json(conn, %{"scrobbles" => %{"@attr" => %{"accepted" => 1}}})
Test.json(conn, %{"scrobbles" => %{"@attr" => %{"accepted" => 1}}})
end)
:ok
@@ -8,6 +8,7 @@ defmodule MusicLibraryWeb.ArtistLive.ShowTest do
alias MusicLibrary.Artists
alias MusicLibrary.Assets
alias MusicLibrary.Assets.Asset
alias Req.Test
defp fill_collection(_config) do
collection_record =
@@ -34,13 +35,13 @@ defmodule MusicLibraryWeb.ArtistLive.ShowTest do
conn: conn,
artist_musicbrainz_id: artist_musicbrainz_id
} do
Req.Test.stub(LastFm.API, fn conn ->
Test.stub(LastFm.API, fn conn ->
case Map.get(conn.params, "method") do
"artist.getInfo" ->
Req.Test.json(conn, Fixtures.Artist.get_info())
Test.json(conn, Fixtures.Artist.get_info())
"artist.getSimilar" ->
Req.Test.json(conn, Fixtures.Artist.get_similar_artists())
Test.json(conn, Fixtures.Artist.get_similar_artists())
end
end)
@@ -60,13 +61,13 @@ defmodule MusicLibraryWeb.ArtistLive.ShowTest do
|> Ecto.Changeset.change(wikipedia_data: Wikipedia.Fixtures.article_summary())
|> MusicLibrary.Repo.update!()
Req.Test.stub(LastFm.API, fn conn ->
Test.stub(LastFm.API, fn conn ->
case Map.get(conn.params, "method") do
"artist.getInfo" ->
Req.Test.json(conn, Fixtures.Artist.get_info())
Test.json(conn, Fixtures.Artist.get_info())
"artist.getSimilar" ->
Req.Test.json(conn, Fixtures.Artist.get_similar_artists())
Test.json(conn, Fixtures.Artist.get_similar_artists())
end
end)
@@ -82,13 +83,13 @@ defmodule MusicLibraryWeb.ArtistLive.ShowTest do
conn: conn,
artist_musicbrainz_id: artist_musicbrainz_id
} do
Req.Test.stub(LastFm.API, fn conn ->
Test.stub(LastFm.API, fn conn ->
case Map.get(conn.params, "method") do
"artist.getInfo" ->
Req.Test.transport_error(conn, :timeout)
Test.transport_error(conn, :timeout)
"artist.getSimilar" ->
Req.Test.json(conn, Fixtures.Artist.get_similar_artists())
Test.json(conn, Fixtures.Artist.get_similar_artists())
end
end)
@@ -104,13 +105,13 @@ defmodule MusicLibraryWeb.ArtistLive.ShowTest do
conn: conn,
artist_musicbrainz_id: artist_musicbrainz_id
} do
Req.Test.stub(LastFm.API, fn conn ->
Test.stub(LastFm.API, fn conn ->
case Map.get(conn.params, "method") do
"artist.getInfo" ->
Req.Test.json(conn, Fixtures.Artist.get_info())
Test.json(conn, Fixtures.Artist.get_info())
"artist.getSimilar" ->
Req.Test.json(conn, Fixtures.Artist.get_similar_artists())
Test.json(conn, Fixtures.Artist.get_similar_artists())
end
end)
@@ -136,13 +137,13 @@ defmodule MusicLibraryWeb.ArtistLive.ShowTest do
other_collection_record =
record_with_artist("Porcupine Tree", %{purchased_at: DateTime.utc_now()})
Req.Test.stub(LastFm.API, fn conn ->
Test.stub(LastFm.API, fn conn ->
case Map.get(conn.params, "method") do
"artist.getInfo" ->
Req.Test.json(conn, Fixtures.Artist.get_info())
Test.json(conn, Fixtures.Artist.get_info())
"artist.getSimilar" ->
Req.Test.json(conn, Fixtures.Artist.get_similar_artists())
Test.json(conn, Fixtures.Artist.get_similar_artists())
end
end)
@@ -175,9 +176,9 @@ defmodule MusicLibraryWeb.ArtistLive.ShowTest do
conn: conn,
artist_musicbrainz_id: musicbrainz_id
} do
Req.Test.stub(BraveSearch.API, fn conn ->
Test.stub(BraveSearch.API, fn conn ->
assert conn.request_path == "/res/v1/images/search"
Req.Test.json(conn, BraveSearch.Fixtures.search_images_response())
Test.json(conn, BraveSearch.Fixtures.search_images_response())
end)
{:ok, view, _html} = live(conn, ~p"/artists/#{musicbrainz_id}/edit")
@@ -196,8 +197,8 @@ defmodule MusicLibraryWeb.ArtistLive.ShowTest do
conn: conn,
artist_musicbrainz_id: musicbrainz_id
} do
Req.Test.stub(BraveSearch.API, fn conn ->
Req.Test.transport_error(conn, :timeout)
Test.stub(BraveSearch.API, fn conn ->
Test.transport_error(conn, :timeout)
end)
{:ok, view, _html} = live(conn, ~p"/artists/#{musicbrainz_id}/edit")
@@ -243,10 +244,10 @@ defmodule MusicLibraryWeb.ArtistLive.ShowTest do
} do
raven_binary = raven_cover_data()
Req.Test.stub(BraveSearch.API, fn conn ->
Test.stub(BraveSearch.API, fn conn ->
case conn.request_path do
"/res/v1/images/search" ->
Req.Test.json(conn, BraveSearch.Fixtures.search_images_response())
Test.json(conn, BraveSearch.Fixtures.search_images_response())
_ ->
Plug.Conn.send_resp(conn, 200, raven_binary)
@@ -275,13 +276,13 @@ defmodule MusicLibraryWeb.ArtistLive.ShowTest do
end
defp stub_last_fm(_config) do
Req.Test.stub(LastFm.API, fn conn ->
Test.stub(LastFm.API, fn conn ->
case Map.get(conn.params, "method") do
"artist.getInfo" ->
Req.Test.json(conn, Fixtures.Artist.get_info())
Test.json(conn, Fixtures.Artist.get_info())
"artist.getSimilar" ->
Req.Test.json(conn, Fixtures.Artist.get_similar_artists())
Test.json(conn, Fixtures.Artist.get_similar_artists())
end
end)
@@ -12,6 +12,7 @@ defmodule MusicLibraryWeb.CollectionLive.IndexTest do
alias MusicLibrary.Assets.{Image, Transform}
alias MusicLibrary.Records.Record
alias MusicLibrary.Worker.ImportFromMusicbrainzReleaseGroup
alias Req.Test
# make it a multiple of 4 for easier calculations
@default_records_page_size 4
@@ -274,8 +275,8 @@ defmodule MusicLibraryWeb.CollectionLive.IndexTest do
end
test "pre-fills the search query from import_query param", %{conn: conn} do
Req.Test.stub(MusicBrainz.API, fn conn ->
Req.Test.json(conn, %{"release-groups" => [], "count" => 0})
Test.stub(MusicBrainz.API, fn conn ->
Test.json(conn, %{"release-groups" => [], "count" => 0})
end)
conn
@@ -495,10 +496,10 @@ defmodule MusicLibraryWeb.CollectionLive.IndexTest do
end
defp stub_release_group_search do
Req.Test.stub(MusicBrainz.API, fn conn ->
Test.stub(MusicBrainz.API, fn conn ->
case conn.path_info do
[_ws, _version, "release-group"] ->
Req.Test.json(conn, release_group_search_results())
Test.json(conn, release_group_search_results())
end
end)
end
@@ -511,16 +512,16 @@ defmodule MusicLibraryWeb.CollectionLive.IndexTest do
release_group_releases = release_group_releases(:marbles)
cover_data = marbles_cover_data()
Req.Test.stub(MusicBrainz.API, fn conn ->
Test.stub(MusicBrainz.API, fn conn ->
case conn.path_info do
[_ws, _version, "release-group", ^first_id] ->
Req.Test.json(conn, release_group)
Test.json(conn, release_group)
[_ws, _version, "release-group"] ->
Req.Test.json(conn, release_group_search_results())
Test.json(conn, release_group_search_results())
[_ws, _version, "release"] ->
Req.Test.json(conn, release_group_releases)
Test.json(conn, release_group_releases)
[_release_group, ^first_id, "front"] ->
Plug.Conn.send_resp(conn, 200, cover_data)
@@ -560,21 +561,21 @@ defmodule MusicLibraryWeb.CollectionLive.IndexTest do
cover_data = marbles_cover_data()
Req.Test.stub(MusicBrainz.API, fn conn ->
Test.stub(MusicBrainz.API, fn conn ->
case conn.path_info do
[_ws, _version, "release-group", ^release_group_id] ->
Req.Test.json(conn, release_group)
Test.json(conn, release_group)
[_ws, _version, "release", ^release_id] ->
Req.Test.json(conn, release)
Test.json(conn, release)
[_ws, _version, "release"] ->
if conn.params["query"] do
# barcode scan
Req.Test.json(conn, releases)
Test.json(conn, releases)
else
# Search by release group ID
Req.Test.json(conn, release_group_releases)
Test.json(conn, release_group_releases)
end
[_release_group, ^release_group_id, "front"] ->
@@ -4,18 +4,19 @@ defmodule MusicLibraryWeb.ScrobbleLive.IndexTest do
import Phoenix.LiveViewTest, only: [render: 1, render_submit: 1, render_click: 3, form: 3]
alias MusicBrainz.Fixtures.ReleaseGroup
alias Req.Test
defp stub_search_results(_) do
Req.Test.stub(MusicBrainz.API, fn conn ->
Test.stub(MusicBrainz.API, fn conn ->
case conn.request_path do
"/ws/2/release-group" ->
Req.Test.json(conn, ReleaseGroup.release_group_search_results())
Test.json(conn, ReleaseGroup.release_group_search_results())
"/ws/2/release" ->
Req.Test.json(conn, ReleaseGroup.release_group_releases(:marbles))
Test.json(conn, ReleaseGroup.release_group_releases(:marbles))
_ ->
Req.Test.json(conn, %{})
Test.json(conn, %{})
end
end)
@@ -23,13 +24,13 @@ defmodule MusicLibraryWeb.ScrobbleLive.IndexTest do
end
defp stub_empty_search_results(_) do
Req.Test.stub(MusicBrainz.API, fn conn ->
Test.stub(MusicBrainz.API, fn conn ->
case conn.request_path do
"/ws/2/release-group" ->
Req.Test.json(conn, %{"count" => 0, "release-groups" => []})
Test.json(conn, %{"count" => 0, "release-groups" => []})
_ ->
Req.Test.json(conn, %{})
Test.json(conn, %{})
end
end)
@@ -5,17 +5,18 @@ defmodule MusicLibraryWeb.ScrobbleLive.ShowTest do
alias MusicBrainz.Fixtures.Release, as: ReleaseFixtures
alias MusicLibrary.Secrets
alias Req.Test
@release_id ReleaseFixtures.release_id(:marbles)
defp stub_musicbrainz_release(_) do
Req.Test.stub(MusicBrainz.API, fn conn ->
Test.stub(MusicBrainz.API, fn conn ->
case conn.request_path do
"/ws/2/release/" <> _id ->
Req.Test.json(conn, ReleaseFixtures.release_with_media(:marbles))
Test.json(conn, ReleaseFixtures.release_with_media(:marbles))
_ ->
Req.Test.json(conn, %{})
Test.json(conn, %{})
end
end)
@@ -23,7 +24,7 @@ defmodule MusicLibraryWeb.ScrobbleLive.ShowTest do
end
defp stub_musicbrainz_release_error(_) do
Req.Test.stub(MusicBrainz.API, fn conn ->
Test.stub(MusicBrainz.API, fn conn ->
Plug.Conn.send_resp(conn, 404, "Not Found")
end)
@@ -31,16 +32,16 @@ defmodule MusicLibraryWeb.ScrobbleLive.ShowTest do
end
defp stub_lastfm_scrobble(_) do
Req.Test.stub(LastFm.API, fn conn ->
Req.Test.json(conn, %{"scrobbles" => %{"@attr" => %{"accepted" => 1}}})
Test.stub(LastFm.API, fn conn ->
Test.json(conn, %{"scrobbles" => %{"@attr" => %{"accepted" => 1}}})
end)
:ok
end
defp stub_lastfm_scrobble_error(_) do
Req.Test.stub(LastFm.API, fn conn ->
Req.Test.json(conn, %{"error" => 11, "message" => "Service temporarily unavailable"})
Test.stub(LastFm.API, fn conn ->
Test.json(conn, %{"error" => 11, "message" => "Service temporarily unavailable"})
end)
:ok
@@ -9,6 +9,7 @@ defmodule MusicLibraryWeb.WishlistLive.IndexTest do
alias MusicLibrary.Records.Record
alias MusicLibrary.Worker.ImportFromMusicbrainzReleaseGroup
alias Req.Test
defp fill_wishlist(_) do
records = Enum.map(1..5, fn _ -> record(%{purchased_at: nil}) end)
@@ -110,10 +111,10 @@ defmodule MusicLibraryWeb.WishlistLive.IndexTest do
end
defp stub_release_group_search do
Req.Test.stub(MusicBrainz.API, fn conn ->
Test.stub(MusicBrainz.API, fn conn ->
case conn.path_info do
[_ws, _version, "release-group"] ->
Req.Test.json(conn, release_group_search_results())
Test.json(conn, release_group_search_results())
end
end)
end
@@ -126,16 +127,16 @@ defmodule MusicLibraryWeb.WishlistLive.IndexTest do
release_group_releases = release_group_releases(:marbles)
cover_data = marbles_cover_data()
Req.Test.stub(MusicBrainz.API, fn conn ->
Test.stub(MusicBrainz.API, fn conn ->
case conn.path_info do
[_ws, _version, "release-group", ^first_id] ->
Req.Test.json(conn, release_group)
Test.json(conn, release_group)
[_ws, _version, "release-group"] ->
Req.Test.json(conn, release_group_search_results())
Test.json(conn, release_group_search_results())
[_ws, _version, "release"] ->
Req.Test.json(conn, release_group_releases)
Test.json(conn, release_group_releases)
[_release_group, ^first_id, "front"] ->
Plug.Conn.send_resp(conn, 200, cover_data)
@@ -10,6 +10,7 @@ defmodule MusicLibraryWeb.LiveHelpers.RecordActionsTest do
alias MusicLibrary.Chats
alias MusicLibrary.Records
alias MusicLibrary.Records.Similarity
alias Req.Test
# A MusicBrainz stub that returns valid fixture responses for every route
# the Collection Show page touches during `handle_params` and via async
@@ -20,23 +21,23 @@ defmodule MusicLibraryWeb.LiveHelpers.RecordActionsTest do
release = ReleaseFixtures.release(:marbles)
cover_data = Keyword.get(opts, :cover_data, marbles_cover_data())
Req.Test.stub(MusicBrainz.API, fn conn ->
Test.stub(MusicBrainz.API, fn conn ->
cond do
# Cover art archive returns raw image bytes
conn.host == "coverartarchive.org" ->
Plug.Conn.send_resp(conn, 200, cover_data)
match?([_, _, "release-group", ^release_group_id], conn.path_info) ->
Req.Test.json(conn, release_group)
Test.json(conn, release_group)
match?([_, _, "release"], conn.path_info) ->
Req.Test.json(conn, ReleaseGroup.release_group_releases(:marbles))
Test.json(conn, ReleaseGroup.release_group_releases(:marbles))
match?([_, _, "release", _], conn.path_info) ->
Req.Test.json(conn, release)
Test.json(conn, release)
true ->
Req.Test.json(conn, %{})
Test.json(conn, %{})
end
end)
end
@@ -58,13 +59,13 @@ defmodule MusicLibraryWeb.LiveHelpers.RecordActionsTest do
release_group_id = record.musicbrainz_id
# Initial page load needs a valid response, then the refresh request fails.
Req.Test.stub(MusicBrainz.API, fn conn ->
Test.stub(MusicBrainz.API, fn conn ->
case conn.path_info do
[_, _, "release-group", ^release_group_id] ->
Req.Test.transport_error(conn, :timeout)
Test.transport_error(conn, :timeout)
_ ->
Req.Test.json(conn, %{})
Test.json(conn, %{})
end
end)
@@ -94,16 +95,16 @@ defmodule MusicLibraryWeb.LiveHelpers.RecordActionsTest do
release_group_id = record.musicbrainz_id
release_group = ReleaseGroup.release_group(:marbles)
Req.Test.stub(MusicBrainz.API, fn conn ->
Test.stub(MusicBrainz.API, fn conn ->
cond do
conn.host == "coverartarchive.org" ->
Req.Test.transport_error(conn, :timeout)
Test.transport_error(conn, :timeout)
match?([_, _, "release-group", ^release_group_id], conn.path_info) ->
Req.Test.json(conn, release_group)
Test.json(conn, release_group)
true ->
Req.Test.json(conn, %{})
Test.json(conn, %{})
end
end)
@@ -1,6 +1,7 @@
defmodule MusicLibrary.Fixtures.Records do
@moduledoc false
alias Discogs.Fixtures.Artist, as: DiscogsArtistFixture
alias MusicBrainz.Fixtures.ReleaseGroup
alias MusicLibrary.Assets
alias MusicLibrary.Assets.Asset
@@ -105,9 +106,9 @@ defmodule MusicLibrary.Fixtures.Records do
|> Enum.into(%{
id: musicbrainz_id,
musicbrainz_data: MusicBrainz.Fixtures.Artist.get_artist(),
discogs_data: Discogs.Fixtures.Artist.get_artist(),
image_data: Discogs.Fixtures.Artist.image_data(),
image_width: Discogs.Fixtures.Artist.image_width()
discogs_data: DiscogsArtistFixture.get_artist(),
image_data: DiscogsArtistFixture.image_data(),
image_width: DiscogsArtistFixture.image_width()
})
|> MusicLibrary.Artists.create_artist_info()