Update dependencies

ex_slop 0.4.1 => 0.4.2

Introduces a new check around misusing the `length/1` function which
require widespread fixes.
This commit is contained in:
Claudio Ortolina
2026-05-25 19:43:03 +03:00
parent bfcdfc1b90
commit 65b2f3e1f2
27 changed files with 87 additions and 86 deletions
@@ -69,17 +69,15 @@ if Code.ensure_loaded?(Credo) do
defp traverse_put_toast_call({:defmodule, _meta, _args}, issues, _issue_meta), defp traverse_put_toast_call({:defmodule, _meta, _args}, issues, _issue_meta),
do: {nil, issues} do: {nil, issues}
defp traverse_put_toast_call({:put_toast, meta, args} = ast, issues, issue_meta) defp traverse_put_toast_call({:put_toast, meta, [_a, _b, _c]} = ast, issues, issue_meta) do
when is_list(args) and length(args) == 3 do
{ast, issues ++ [issue_for(meta, issue_meta)]} {ast, issues ++ [issue_for(meta, issue_meta)]}
end end
defp traverse_put_toast_call( defp traverse_put_toast_call(
{{:., dot_meta, [_target, :put_toast]}, call_meta, args} = ast, {{:., dot_meta, [_target, :put_toast]}, call_meta, [_a, _b, _c]} = ast,
issues, issues,
issue_meta issue_meta
) ) do
when is_list(args) and length(args) == 3 do
{ast, issues ++ [issue_for(call_meta, dot_meta, issue_meta)]} {ast, issues ++ [issue_for(call_meta, dot_meta, issue_meta)]}
end end
@@ -111,11 +109,10 @@ if Code.ensure_loaded?(Credo) do
defp traverse_put_toast_call(ast, issues, _issue_meta), do: {ast, issues} defp traverse_put_toast_call(ast, issues, _issue_meta), do: {ast, issues}
defp piped_put_toast_meta({:put_toast, meta, args}) when is_list(args) and length(args) == 2, defp piped_put_toast_meta({:put_toast, meta, [_a, _b]}),
do: meta do: meta
defp piped_put_toast_meta({{:., dot_meta, [_target, :put_toast]}, call_meta, args}) defp piped_put_toast_meta({{:., dot_meta, [_target, :put_toast]}, call_meta, [_a, _b]}) do
when is_list(args) and length(args) == 2 do
merge_meta(call_meta, dot_meta) merge_meta(call_meta, dot_meta)
end end
+1 -1
View File
@@ -22,7 +22,7 @@
"error_tracker": {:hex, :error_tracker, "0.9.0", "fef10b1230be1b051452930ba4db9f809cdab9705fe87891c25f5e551cead372", [:mix], [{:ecto, "~> 3.13", [hex: :ecto, repo: "hexpm", optional: false]}, {:ecto_sql, "~> 3.13", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:ecto_sqlite3, ">= 0.0.0", [hex: :ecto_sqlite3, repo: "hexpm", optional: true]}, {:igniter, "~> 0.5", [hex: :igniter, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:myxql, ">= 0.0.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:phoenix_ecto, "~> 4.6", [hex: :phoenix_ecto, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:postgrex, ">= 0.0.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "1de7d89ec9034c3b7282b6bd2d0584ca98cddc51e87bf0979ba71f6182803ac4"}, "error_tracker": {:hex, :error_tracker, "0.9.0", "fef10b1230be1b051452930ba4db9f809cdab9705fe87891c25f5e551cead372", [:mix], [{:ecto, "~> 3.13", [hex: :ecto, repo: "hexpm", optional: false]}, {:ecto_sql, "~> 3.13", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:ecto_sqlite3, ">= 0.0.0", [hex: :ecto_sqlite3, repo: "hexpm", optional: true]}, {:igniter, "~> 0.5", [hex: :igniter, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:myxql, ">= 0.0.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:phoenix_ecto, "~> 4.6", [hex: :phoenix_ecto, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:postgrex, ">= 0.0.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "1de7d89ec9034c3b7282b6bd2d0584ca98cddc51e87bf0979ba71f6182803ac4"},
"esbuild": {:hex, :esbuild, "0.10.0", "b0aa3388a1c23e727c5a3e7427c932d89ee791746b0081bbe56103e9ef3d291f", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "468489cda427b974a7cc9f03ace55368a83e1a7be12fba7e30969af78e5f8c70"}, "esbuild": {:hex, :esbuild, "0.10.0", "b0aa3388a1c23e727c5a3e7427c932d89ee791746b0081bbe56103e9ef3d291f", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "468489cda427b974a7cc9f03ace55368a83e1a7be12fba7e30969af78e5f8c70"},
"ex_ast": {:hex, :ex_ast, "0.12.0", "052ad63711da41b7efbfb3490dbf3d757bb67caec17d02f6deb0db4a0363e5f6", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:sourceror, "~> 1.7", [hex: :sourceror, repo: "hexpm", optional: false]}], "hexpm", "66b4797f157d32f0a63c6da227515f78816c0ac8f621f6d7a2b22108e7b4dd85"}, "ex_ast": {:hex, :ex_ast, "0.12.0", "052ad63711da41b7efbfb3490dbf3d757bb67caec17d02f6deb0db4a0363e5f6", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:sourceror, "~> 1.7", [hex: :sourceror, repo: "hexpm", optional: false]}], "hexpm", "66b4797f157d32f0a63c6da227515f78816c0ac8f621f6d7a2b22108e7b4dd85"},
"ex_slop": {:hex, :ex_slop, "0.4.1", "6d69e4a884607d076bfa7e00515a83fdaccedb1eaa521825c6d308273ce0a50c", [:mix], [{:credo, "~> 1.7", [hex: :credo, repo: "hexpm", optional: false]}], "hexpm", "9fde18ec9e36ed5254ddcc59fed2433b49a3825e9f1349f29325b0d51470bdd1"}, "ex_slop": {:hex, :ex_slop, "0.4.2", "142aba9a82eddfb258e39c45d59392ab3cdb6b5a3ad401b09b362b7134fc54eb", [:mix], [{:credo, "~> 1.7", [hex: :credo, repo: "hexpm", optional: false]}], "hexpm", "c7f5316f755f83566e7a0a049f6fedfcd5ff916fce83c6ebfdf806be62fd7a69"},
"expo": {:hex, :expo, "1.1.1", "4202e1d2ca6e2b3b63e02f69cfe0a404f77702b041d02b58597c00992b601db5", [:mix], [], "hexpm", "5fb308b9cb359ae200b7e23d37c76978673aa1b06e2b3075d814ce12c5811640"}, "expo": {:hex, :expo, "1.1.1", "4202e1d2ca6e2b3b63e02f69cfe0a404f77702b041d02b58597c00992b601db5", [:mix], [], "hexpm", "5fb308b9cb359ae200b7e23d37c76978673aa1b06e2b3075d814ce12c5811640"},
"exqlite": {:hex, :exqlite, "0.36.0", "07b4f95d61cb82b8d52946d0639497fa7d32117e09b2c8d25e24a38723c295cb", [:make, :mix], [{:cc_precompiler, "~> 0.1", [hex: :cc_precompiler, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.8", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "cbeca3ce781f9ff07cfa9a87486f3ebd512a143ad6a14ed5c9fca21fe0bf3ae7"}, "exqlite": {:hex, :exqlite, "0.36.0", "07b4f95d61cb82b8d52946d0639497fa7d32117e09b2c8d25e24a38723c295cb", [:make, :mix], [{:cc_precompiler, "~> 0.1", [hex: :cc_precompiler, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.8", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "cbeca3ce781f9ff07cfa9a87486f3ebd512a143ad6a14ed5c9fca21fe0bf3ae7"},
"file_system": {:hex, :file_system, "1.1.1", "31864f4685b0148f25bd3fbef2b1228457c0c89024ad67f7a81a3ffbc0bbad3a", [:mix], [], "hexpm", "7a15ff97dfe526aeefb090a7a9d3d03aa907e100e262a0f8f7746b78f8f87a5d"}, "file_system": {:hex, :file_system, "1.1.1", "31864f4685b0148f25bd3fbef2b1228457c0c89024ad67f7a81a3ffbc0bbad3a", [:mix], [], "hexpm", "7a15ff97dfe526aeefb090a7a9d3d03aa907e100e262a0f8f7746b78f8f87a5d"},
+7 -7
View File
@@ -20,14 +20,14 @@ defmodule MusicBrainz.ExternalLinkTest do
test "returns URLs matching the pattern", %{artist_data: artist_data} do test "returns URLs matching the pattern", %{artist_data: artist_data} do
results = ExternalLink.external_links(artist_data, "spotify") results = ExternalLink.external_links(artist_data, "spotify")
assert length(results) == 1 assert Enum.count_until(results, 2) == 1
assert "https://open.spotify.com/artist/4X42BfuhWCAZ2swiVze9O0" in results assert "https://open.spotify.com/artist/4X42BfuhWCAZ2swiVze9O0" in results
end end
test "returns all URLs matching the pattern when multiple exist", %{artist_data: artist_data} do test "returns all URLs matching the pattern when multiple exist", %{artist_data: artist_data} do
results = ExternalLink.external_links(artist_data, "youtube") results = ExternalLink.external_links(artist_data, "youtube")
assert length(results) == 2 assert Enum.count_until(results, 3) == 2
assert "https://www.youtube.com/user/StevenWilsonHQ" in results assert "https://www.youtube.com/user/StevenWilsonHQ" in results
assert "https://music.youtube.com/channel/UCN_yfO7km9qK5n9JlLJRdrg" in results assert "https://music.youtube.com/channel/UCN_yfO7km9qK5n9JlLJRdrg" in results
end end
@@ -36,7 +36,7 @@ defmodule MusicBrainz.ExternalLinkTest do
results = ExternalLink.external_links(artist_data, nil) results = ExternalLink.external_links(artist_data, nil)
# The fixture has 59 relations with URLs # The fixture has 59 relations with URLs
assert length(results) == 59 assert Enum.count_until(results, 60) == 59
end end
test "pattern matching is case-sensitive", %{artist_data: artist_data} do test "pattern matching is case-sensitive", %{artist_data: artist_data} do
@@ -47,7 +47,7 @@ defmodule MusicBrainz.ExternalLinkTest do
test "pattern matches substring of URL", %{artist_data: artist_data} do test "pattern matches substring of URL", %{artist_data: artist_data} do
results = ExternalLink.external_links(artist_data, "discogs") results = ExternalLink.external_links(artist_data, "discogs")
assert length(results) == 1 assert Enum.count_until(results, 2) == 1
assert "https://www.discogs.com/artist/227943" in results assert "https://www.discogs.com/artist/227943" in results
end end
end end
@@ -70,7 +70,7 @@ defmodule MusicBrainz.ExternalLinkTest do
results = ExternalLink.external_links(artist_data, patterns) results = ExternalLink.external_links(artist_data, patterns)
assert length(results) == 2 assert Enum.count_until(results, 3) == 2
spotify_link = Enum.find(results, fn link -> link.name == :spotify end) spotify_link = Enum.find(results, fn link -> link.name == :spotify end)
assert spotify_link.url == "https://open.spotify.com/artist/4X42BfuhWCAZ2swiVze9O0" assert spotify_link.url == "https://open.spotify.com/artist/4X42BfuhWCAZ2swiVze9O0"
@@ -88,7 +88,7 @@ defmodule MusicBrainz.ExternalLinkTest do
results = ExternalLink.external_links(artist_data, patterns) results = ExternalLink.external_links(artist_data, patterns)
assert length(results) == 1 assert Enum.count_until(results, 2) == 1
assert [youtube_link] = results assert [youtube_link] = results
assert youtube_link.name == :youtube assert youtube_link.name == :youtube
@@ -109,7 +109,7 @@ defmodule MusicBrainz.ExternalLinkTest do
results = ExternalLink.external_links(artist_data, patterns) results = ExternalLink.external_links(artist_data, patterns)
# Only spotify and discogs should match # Only spotify and discogs should match
assert length(results) == 2 assert Enum.count_until(results, 3) == 2
names = Enum.map(results, & &1.name) names = Enum.map(results, & &1.name)
assert :spotify in names assert :spotify in names
+1 -1
View File
@@ -95,7 +95,7 @@ defmodule MusicBrainz.ReleaseGroupTest do
} }
result = ReleaseGroup.included_release_groups(release_group) result = ReleaseGroup.included_release_groups(release_group)
assert length(result) == 1 assert Enum.count_until(result, 2) == 1
assert hd(result).id == "rg-included-1" assert hd(result).id == "rg-included-1"
assert hd(result).type == :ep assert hd(result).type == :ep
end end
+2 -2
View File
@@ -89,7 +89,7 @@ defmodule MusicBrainzTest do
end) end)
assert {:ok, releases} = MusicBrainz.get_all_releases(@release_group_id) assert {:ok, releases} = MusicBrainz.get_all_releases(@release_group_id)
assert length(releases) == 142 assert Enum.count_until(releases, 143) == 142
assert releases == full_page["releases"] ++ tail_page["releases"] assert releases == full_page["releases"] ++ tail_page["releases"]
assert Agent.get(agent, & &1) == ["0", "100"] assert Agent.get(agent, & &1) == ["0", "100"]
end end
@@ -108,7 +108,7 @@ defmodule MusicBrainzTest do
end) end)
assert {:ok, releases} = MusicBrainz.get_all_releases(@release_group_id) assert {:ok, releases} = MusicBrainz.get_all_releases(@release_group_id)
assert length(releases) == 100 assert Enum.count_until(releases, 101) == 100
assert releases == full_page["releases"] assert releases == full_page["releases"]
end end
+2 -2
View File
@@ -39,7 +39,7 @@ defmodule MusicLibrary.ArtistsTest do
results = Artists.search_by_name("Marillion", 10) results = Artists.search_by_name("Marillion", 10)
assert length(results) == 1 assert Enum.count_until(results, 2) == 1
assert hd(results).artist.name == "Marillion" assert hd(results).artist.name == "Marillion"
end end
@@ -57,7 +57,7 @@ defmodule MusicLibrary.ArtistsTest do
results = Artists.search_by_name("i", 1) results = Artists.search_by_name("i", 1)
assert length(results) == 1 assert Enum.count_until(results, 2) == 1
end end
end end
+1 -1
View File
@@ -256,7 +256,7 @@ defmodule MusicLibrary.BarcodeScanTest do
errors = errors =
BarcodeScan.import_results([collected_result, not_found_result], DateTime.utc_now()) BarcodeScan.import_results([collected_result, not_found_result], DateTime.utc_now())
assert length(errors) == 2 assert Enum.count_until(errors, 3) == 2
assert {"1111111111", :already_collected} in errors assert {"1111111111", :already_collected} in errors
assert {"2222222222", :not_found} in errors assert {"2222222222", :not_found} in errors
end end
+1 -1
View File
@@ -27,7 +27,7 @@ defmodule MusicLibrary.BatchTest do
{:error, :test_failure} {:error, :test_failure}
end) end)
assert length(failed_ids) == 2 assert Enum.count_until(failed_ids, 3) == 2
assert r1.id in failed_ids assert r1.id in failed_ids
assert r2.id in failed_ids assert r2.id in failed_ids
end end
+3 -3
View File
@@ -124,7 +124,7 @@ defmodule MusicLibrary.CollectionTest do
assert [{:group, %{representative: rep, records: records}}] = result assert [{:group, %{representative: rep, records: records}}] = result
assert rep.id == cd.id assert rep.id == cd.id
assert length(records) == 2 assert Enum.count_until(records, 3) == 2
# Sorted by purchased_at ascending # Sorted by purchased_at ascending
assert Enum.map(records, & &1.id) == [cd.id, vinyl.id] assert Enum.map(records, & &1.id) == [cd.id, vinyl.id]
end end
@@ -396,7 +396,7 @@ defmodule MusicLibrary.CollectionTest do
lines = String.split(catalog, "\n") lines = String.split(catalog, "\n")
assert record_count == 2 assert record_count == 2
assert length(lines) == 2 assert Enum.count_until(lines, 3) == 2
# Stats section # Stats section
assert stats =~ "# Stats: 2 releases" assert stats =~ "# Stats: 2 releases"
@@ -446,7 +446,7 @@ defmodule MusicLibrary.CollectionTest do
lines = String.split(catalog, "\n") lines = String.split(catalog, "\n")
assert record_count == 1 assert record_count == 1
assert length(lines) == 1 assert Enum.count_until(lines, 2) == 1
line = hd(lines) line = hd(lines)
assert line =~ "cd" assert line =~ "cd"
@@ -10,13 +10,13 @@ defmodule MusicLibrary.Colors.KMeansExtractorTest do
describe "extract_dominant_colors/1" do describe "extract_dominant_colors/1" do
test "extracts 5 colors by default" do test "extracts 5 colors by default" do
assert {:ok, colors} = KMeansExtractor.extract_dominant_colors(@image_data) assert {:ok, colors} = KMeansExtractor.extract_dominant_colors(@image_data)
assert length(colors) == 5 assert Enum.count_until(colors, 6) == 5
assert Enum.all?(colors, &color_hex?/1) assert Enum.all?(colors, &color_hex?/1)
end end
test "extracts custom number of colors" do test "extracts custom number of colors" do
assert {:ok, colors} = KMeansExtractor.extract_dominant_colors(@image_data, 3) assert {:ok, colors} = KMeansExtractor.extract_dominant_colors(@image_data, 3)
assert length(colors) == 3 assert Enum.count_until(colors, 4) == 3
assert Enum.all?(colors, &color_hex?/1) assert Enum.all?(colors, &color_hex?/1)
end end
end end
+8 -8
View File
@@ -31,7 +31,7 @@ defmodule MusicLibrary.ErrorsTest do
result = Errors.list_errors() result = Errors.list_errors()
assert result.total == 2 assert result.total == 2
assert length(result.errors) == 2 assert Enum.count_until(result.errors, 3) == 2
ids = Enum.map(result.errors, & &1.id) ids = Enum.map(result.errors, & &1.id)
assert e1.id in ids assert e1.id in ids
assert e2.id in ids assert e2.id in ids
@@ -44,7 +44,7 @@ defmodule MusicLibrary.ErrorsTest do
result = Errors.list_errors(status: :resolved) result = Errors.list_errors(status: :resolved)
assert result.total == 1 assert result.total == 1
assert length(result.errors) == 1 assert Enum.count_until(result.errors, 2) == 1
assert hd(result.errors).id == e2.id assert hd(result.errors).id == e2.id
assert hd(result.errors).status == :resolved assert hd(result.errors).status == :resolved
end end
@@ -56,7 +56,7 @@ defmodule MusicLibrary.ErrorsTest do
result = Errors.list_errors(muted: true) result = Errors.list_errors(muted: true)
assert result.total == 1 assert result.total == 1
assert length(result.errors) == 1 assert Enum.count_until(result.errors, 2) == 1
assert hd(result.errors).id == e2.id assert hd(result.errors).id == e2.id
assert hd(result.errors).muted == true assert hd(result.errors).muted == true
end end
@@ -68,7 +68,7 @@ defmodule MusicLibrary.ErrorsTest do
result = Errors.list_errors(search: "specific text") result = Errors.list_errors(search: "specific text")
assert result.total == 1 assert result.total == 1
assert length(result.errors) == 1 assert Enum.count_until(result.errors, 2) == 1
assert hd(result.errors).id == e2.id assert hd(result.errors).id == e2.id
assert hd(result.errors).reason == "Second error with specific text" assert hd(result.errors).reason == "Second error with specific text"
end end
@@ -82,7 +82,7 @@ defmodule MusicLibrary.ErrorsTest do
result = Errors.list_errors(search: "100%") result = Errors.list_errors(search: "100%")
assert result.total == 1 assert result.total == 1
assert length(result.errors) == 1 assert Enum.count_until(result.errors, 2) == 1
assert hd(result.errors).id == e1.id assert hd(result.errors).id == e1.id
end end
@@ -94,7 +94,7 @@ defmodule MusicLibrary.ErrorsTest do
result = Errors.list_errors(limit: 2) result = Errors.list_errors(limit: 2)
assert result.total == 3 assert result.total == 3
assert length(result.errors) == 2 assert Enum.count_until(result.errors, 3) == 2
end end
test "respects offset" do test "respects offset" do
@@ -105,7 +105,7 @@ defmodule MusicLibrary.ErrorsTest do
result = Errors.list_errors(offset: 1, limit: 10) result = Errors.list_errors(offset: 1, limit: 10)
assert result.total == 3 assert result.total == 3
assert length(result.errors) == 2 assert Enum.count_until(result.errors, 3) == 2
end end
test "returns empty list when no errors match filters" do test "returns empty list when no errors match filters" do
@@ -137,7 +137,7 @@ defmodule MusicLibrary.ErrorsTest do
assert result.reason == "Something went wrong" assert result.reason == "Something went wrong"
assert result.occurrence_count == 2 assert result.occurrence_count == 2
refute is_nil(result.first_occurrence_at) refute is_nil(result.first_occurrence_at)
assert length(result.occurrences) == 2 assert Enum.count_until(result.occurrences, 3) == 2
# Occurrences sorted desc by inserted_at (most recent first) # Occurrences sorted desc by inserted_at (most recent first)
[occ1, occ2] = result.occurrences [occ1, occ2] = result.occurrences
+19 -15
View File
@@ -77,7 +77,7 @@ defmodule MusicLibrary.ListeningStatsTest do
tracks = list_tracks() tracks = list_tracks()
assert length(tracks) == 2 assert Enum.count_until(tracks, 3) == 2
track_titles = Enum.map(tracks, & &1.title) track_titles = Enum.map(tracks, & &1.title)
assert "First Track" in track_titles assert "First Track" in track_titles
assert "Second Track" in track_titles assert "Second Track" in track_titles
@@ -139,7 +139,7 @@ defmodule MusicLibrary.ListeningStatsTest do
tracks = list_tracks(%{query: "Special"}) tracks = list_tracks(%{query: "Special"})
assert length(tracks) == 1 assert Enum.count_until(tracks, 2) == 1
assert List.first(tracks).title == "Special Track" assert List.first(tracks).title == "Special Track"
end end
@@ -149,7 +149,7 @@ defmodule MusicLibrary.ListeningStatsTest do
tracks = list_tracks(%{query: "Special Artist"}) tracks = list_tracks(%{query: "Special Artist"})
assert length(tracks) == 1 assert Enum.count_until(tracks, 2) == 1
assert List.first(tracks).artist.name == "Special Artist" assert List.first(tracks).artist.name == "Special Artist"
end end
@@ -159,7 +159,7 @@ defmodule MusicLibrary.ListeningStatsTest do
tracks = list_tracks(%{query: "Special Album"}) tracks = list_tracks(%{query: "Special Album"})
assert length(tracks) == 1 assert Enum.count_until(tracks, 2) == 1
assert List.first(tracks).album.title == "Special Album" assert List.first(tracks).album.title == "Special Album"
end end
@@ -168,11 +168,11 @@ defmodule MusicLibrary.ListeningStatsTest do
# Get first 2 tracks # Get first 2 tracks
tracks_page_1 = list_tracks(%{page: 1, page_size: 2}) tracks_page_1 = list_tracks(%{page: 1, page_size: 2})
assert length(tracks_page_1) == 2 assert Enum.count_until(tracks_page_1, 3) == 2
# Get next 2 tracks # Get next 2 tracks
tracks_page_2 = list_tracks(%{page: 2, page_size: 2}) tracks_page_2 = list_tracks(%{page: 2, page_size: 2})
assert length(tracks_page_2) == 2 assert Enum.count_until(tracks_page_2, 3) == 2
# Ensure they're different tracks # Ensure they're different tracks
page_1_ids = Enum.map(tracks_page_1, & &1.scrobbled_at_uts) page_1_ids = Enum.map(tracks_page_1, & &1.scrobbled_at_uts)
@@ -386,10 +386,12 @@ defmodule MusicLibrary.ListeningStatsTest do
tracks = ListeningStats.list_tracks() tracks = ListeningStats.list_tracks()
titles = Enum.map(tracks, & &1.track.title) titles = Enum.map(tracks, & &1.track.title)
assert length(titles) == length(Enum.uniq(titles)), "list_tracks returned duplicate rows"
assert Enum.count(titles) == Enum.count(Enum.uniq(titles)),
"list_tracks returned duplicate rows"
for result <- tracks do for result <- tracks do
assert length(result.matching_records) == 2 assert Enum.count_until(result.matching_records, 3) == 2
record_ids = Enum.map(result.matching_records, & &1.id) record_ids = Enum.map(result.matching_records, & &1.id)
assert expected_record_id in record_ids assert expected_record_id in record_ids
@@ -402,11 +404,11 @@ defmodule MusicLibrary.ListeningStatsTest do
titles = Enum.map(recent_tracks, & &1.track.title) titles = Enum.map(recent_tracks, & &1.track.title)
assert length(titles) == length(Enum.uniq(titles)), assert Enum.count(titles) == Enum.count(Enum.uniq(titles)),
"recent_activity returned duplicate rows" "recent_activity returned duplicate rows"
for result <- recent_tracks do for result <- recent_tracks do
assert length(result.matching_records) == 2 assert Enum.count_until(result.matching_records, 3) == 2
record_ids = Enum.map(result.matching_records, & &1.id) record_ids = Enum.map(result.matching_records, & &1.id)
assert expected_record_id in record_ids assert expected_record_id in record_ids
@@ -417,7 +419,9 @@ defmodule MusicLibrary.ListeningStatsTest do
results = ListeningStats.get_top_albums(limit: 10) results = ListeningStats.get_top_albums(limit: 10)
marbles_entries = Enum.filter(results, fn r -> r.album_title == "Marbles" end) marbles_entries = Enum.filter(results, fn r -> r.album_title == "Marbles" end)
assert length(marbles_entries) == 1, "get_top_albums returned duplicate album entries"
assert Enum.count_until(marbles_entries, 2) == 1,
"get_top_albums returned duplicate album entries"
[entry] = marbles_entries [entry] = marbles_entries
assert entry.play_count == 2 assert entry.play_count == 2
@@ -433,7 +437,7 @@ defmodule MusicLibrary.ListeningStatsTest do
for result <- recent_tracks do for result <- recent_tracks do
assert is_list(result.matching_records) assert is_list(result.matching_records)
assert length(result.matching_records) == 2 assert Enum.count_until(result.matching_records, 3) == 2
for record <- result.matching_records do for record <- result.matching_records do
assert Map.has_key?(record, :id) assert Map.has_key?(record, :id)
@@ -489,7 +493,7 @@ defmodule MusicLibrary.ListeningStatsTest do
[result] = recent_tracks [result] = recent_tracks
assert length(result.matching_records) == 2 assert Enum.count_until(result.matching_records, 3) == 2
record_ids = Enum.map(result.matching_records, & &1.id) record_ids = Enum.map(result.matching_records, & &1.id)
assert collected.id in record_ids assert collected.id in record_ids
@@ -507,10 +511,10 @@ defmodule MusicLibrary.ListeningStatsTest do
results = ListeningStats.get_top_albums(limit: 10) results = ListeningStats.get_top_albums(limit: 10)
marbles_entries = Enum.filter(results, fn r -> r.album_title == "Marbles" end) marbles_entries = Enum.filter(results, fn r -> r.album_title == "Marbles" end)
assert length(marbles_entries) == 1 assert Enum.count_until(marbles_entries, 2) == 1
[entry] = marbles_entries [entry] = marbles_entries
assert length(entry.matching_records) == 2 assert Enum.count_until(entry.matching_records, 3) == 2
record_ids = Enum.map(entry.matching_records, & &1.id) record_ids = Enum.map(entry.matching_records, & &1.id)
assert collected.id in record_ids assert collected.id in record_ids
@@ -85,7 +85,7 @@ defmodule MusicLibrary.Logger.SingleLineFormatterTest do
|> IO.chardata_to_string() |> IO.chardata_to_string()
lines = String.split(result, "\n", trim: true) lines = String.split(result, "\n", trim: true)
assert length(lines) == 1 assert Enum.count_until(lines, 2) == 1
end end
test "includes level and timestamp" do test "includes level and timestamp" do
+8 -8
View File
@@ -106,7 +106,7 @@ defmodule MusicLibrary.MaintenanceTest do
result = Maintenance.get_artists_missing_musicbrainz_id() result = Maintenance.get_artists_missing_musicbrainz_id()
assert length(result) == 2 assert Enum.count_until(result, 3) == 2
artist_a = Enum.find(result, fn r -> r.artist_name == "Artist A" end) artist_a = Enum.find(result, fn r -> r.artist_name == "Artist A" end)
artist_b = Enum.find(result, fn r -> r.artist_name == "Artist B" end) artist_b = Enum.find(result, fn r -> r.artist_name == "Artist B" end)
@@ -123,7 +123,7 @@ defmodule MusicLibrary.MaintenanceTest do
result = Maintenance.get_artists_missing_musicbrainz_id() result = Maintenance.get_artists_missing_musicbrainz_id()
assert length(result) == 2 assert Enum.count_until(result, 3) == 2
assert List.first(result).artist_name == "Artist B" assert List.first(result).artist_name == "Artist B"
assert List.first(result).track_count == 3 assert List.first(result).track_count == 3
end end
@@ -135,7 +135,7 @@ defmodule MusicLibrary.MaintenanceTest do
result = Maintenance.get_artists_missing_musicbrainz_id(limit: 2) result = Maintenance.get_artists_missing_musicbrainz_id(limit: 2)
assert length(result) == 2 assert Enum.count_until(result, 3) == 2
end end
test "excludes artists with valid musicbrainz_id" do test "excludes artists with valid musicbrainz_id" do
@@ -144,7 +144,7 @@ defmodule MusicLibrary.MaintenanceTest do
result = Maintenance.get_artists_missing_musicbrainz_id() result = Maintenance.get_artists_missing_musicbrainz_id()
assert length(result) == 1 assert Enum.count_until(result, 2) == 1
assert List.first(result).artist_name == "Artist A" assert List.first(result).artist_name == "Artist A"
end end
end end
@@ -177,7 +177,7 @@ defmodule MusicLibrary.MaintenanceTest do
result = Maintenance.get_albums_missing_musicbrainz_id() result = Maintenance.get_albums_missing_musicbrainz_id()
assert length(result) == 2 assert Enum.count_until(result, 3) == 2
album_a = Enum.find(result, fn r -> r.album_title == "Album A" end) album_a = Enum.find(result, fn r -> r.album_title == "Album A" end)
album_b = Enum.find(result, fn r -> r.album_title == "Album B" end) album_b = Enum.find(result, fn r -> r.album_title == "Album B" end)
@@ -196,7 +196,7 @@ defmodule MusicLibrary.MaintenanceTest do
result = Maintenance.get_albums_missing_musicbrainz_id() result = Maintenance.get_albums_missing_musicbrainz_id()
assert length(result) == 2 assert Enum.count_until(result, 3) == 2
assert List.first(result).album_title == "Album B" assert List.first(result).album_title == "Album B"
assert List.first(result).track_count == 3 assert List.first(result).track_count == 3
end end
@@ -208,7 +208,7 @@ defmodule MusicLibrary.MaintenanceTest do
result = Maintenance.get_albums_missing_musicbrainz_id(limit: 2) result = Maintenance.get_albums_missing_musicbrainz_id(limit: 2)
assert length(result) == 2 assert Enum.count_until(result, 3) == 2
end end
test "excludes albums with valid musicbrainz_id" do test "excludes albums with valid musicbrainz_id" do
@@ -217,7 +217,7 @@ defmodule MusicLibrary.MaintenanceTest do
result = Maintenance.get_albums_missing_musicbrainz_id() result = Maintenance.get_albums_missing_musicbrainz_id()
assert length(result) == 1 assert Enum.count_until(result, 2) == 1
assert List.first(result).album_title == "Album A" assert List.first(result).album_title == "Album A"
end end
end end
@@ -34,7 +34,7 @@ defmodule MusicLibrary.OnlineStoreTemplatesTest do
online_store_template(%{name: "Bandcamp"}) online_store_template(%{name: "Bandcamp"})
results = OnlineStoreTemplates.list_templates(query: "Amazon") results = OnlineStoreTemplates.list_templates(query: "Amazon")
assert length(results) == 1 assert Enum.count_until(results, 2) == 1
assert hd(results).name == "Amazon UK" assert hd(results).name == "Amazon UK"
end end
@@ -43,7 +43,7 @@ defmodule MusicLibrary.OnlineStoreTemplatesTest do
online_store_template(%{name: "Store B", description: "digital downloads"}) online_store_template(%{name: "Store B", description: "digital downloads"})
results = OnlineStoreTemplates.list_templates(query: "vinyl") results = OnlineStoreTemplates.list_templates(query: "vinyl")
assert length(results) == 1 assert Enum.count_until(results, 2) == 1
assert hd(results).name == "Store A" assert hd(results).name == "Store A"
end end
@@ -51,7 +51,7 @@ defmodule MusicLibrary.OnlineStoreTemplatesTest do
for i <- 1..3, do: online_store_template(%{name: "Store #{i}"}) for i <- 1..3, do: online_store_template(%{name: "Store #{i}"})
results = OnlineStoreTemplates.list_templates(limit: 1) results = OnlineStoreTemplates.list_templates(limit: 1)
assert length(results) == 1 assert Enum.count_until(results, 2) == 1
end end
end end
+1 -1
View File
@@ -58,7 +58,7 @@ defmodule MusicLibrary.QueryReporterTest do
handlers = :telemetry.list_handlers(@event) handlers = :telemetry.list_handlers(@event)
matching = Enum.filter(handlers, &(&1.id == "music-library-query-reporter")) matching = Enum.filter(handlers, &(&1.id == "music-library-query-reporter"))
assert length(matching) == 1 assert Enum.count_until(matching, 2) == 1
end end
end end
+2 -2
View File
@@ -58,7 +58,7 @@ defmodule MusicLibrary.RecordSetsTest do
for i <- 1..5, do: record_set(%{name: "Set #{i}"}) for i <- 1..5, do: record_set(%{name: "Set #{i}"})
results = RecordSets.search_record_sets("", limit: 2) results = RecordSets.search_record_sets("", limit: 2)
assert length(results) == 2 assert Enum.count_until(results, 3) == 2
all = RecordSets.search_record_sets("") all = RecordSets.search_record_sets("")
offset_results = RecordSets.search_record_sets("", offset: 2, limit: 2) offset_results = RecordSets.search_record_sets("", offset: 2, limit: 2)
@@ -151,7 +151,7 @@ defmodule MusicLibrary.RecordSetsTest do
rec = record() rec = record()
assert {:ok, updated} = RecordSets.add_record_to_set(set, rec.id) assert {:ok, updated} = RecordSets.add_record_to_set(set, rec.id)
assert length(updated.items) == 1 assert Enum.count_until(updated.items, 2) == 1
assert hd(updated.items).record.id == rec.id assert hd(updated.items).record.id == rec.id
end end
@@ -54,7 +54,7 @@ defmodule MusicLibrary.Records.RecordReleaseTest do
rows = list_releases(record.id) rows = list_releases(record.id)
assert length(rows) == 2 assert Enum.count_until(rows, 3) == 2
assert Enum.all?(rows, fn row -> row.cover_hash == nil end) assert Enum.all?(rows, fn row -> row.cover_hash == nil end)
assert Enum.all?(rows, fn row -> row.purchased_at == nil end) assert Enum.all?(rows, fn row -> row.purchased_at == nil end)
end end
@@ -123,7 +123,7 @@ defmodule MusicLibrary.Records.RecordReleaseTest do
rows = list_releases(record.id) rows = list_releases(record.id)
assert length(rows) == 2 assert Enum.count_until(rows, 3) == 2
assert Enum.all?(rows, fn row -> row.cover_hash == "hash-new" end) assert Enum.all?(rows, fn row -> row.cover_hash == "hash-new" end)
end end
@@ -136,7 +136,7 @@ defmodule MusicLibrary.Records.RecordReleaseTest do
rows = list_releases(record.id) rows = list_releases(record.id)
assert length(rows) == 2 assert Enum.count_until(rows, 3) == 2
assert Enum.all?(rows, fn row -> row.purchased_at == ~U[2025-02-20 12:00:00Z] end) assert Enum.all?(rows, fn row -> row.purchased_at == ~U[2025-02-20 12:00:00Z] end)
end end
@@ -157,7 +157,7 @@ defmodule MusicLibrary.Records.RecordReleaseTest do
describe "before delete trigger" do describe "before delete trigger" do
test "remove all rows when the record is deleted" do test "remove all rows when the record is deleted" do
record = insert_record() record = insert_record()
assert length(list_releases(record.id)) == 2 assert Enum.count_until(list_releases(record.id), 3) == 2
Repo.delete!(record) Repo.delete!(record)
@@ -412,7 +412,7 @@ defmodule MusicLibrary.Records.SimilarityTest do
test "respects limit option", %{record1: record1} do test "respects limit option", %{record1: record1} do
similar = Similarity.find_similar(record1.id, limit: 1, max_distance: 1.0) similar = Similarity.find_similar(record1.id, limit: 1, max_distance: 1.0)
assert length(similar) == 1 assert Enum.count_until(similar, 2) == 1
end end
test "returns empty list for record without embedding" do test "returns empty list for record without embedding" do
+1 -1
View File
@@ -24,7 +24,7 @@ defmodule MusicLibrary.RecordsTest do
assert record.cover_hash == assert record.cover_hash ==
"599407DDF69907D4A60FE13CCAA824D25CF08DC124FD6AA3E8E7ECD98C885FFE" "599407DDF69907D4A60FE13CCAA824D25CF08DC124FD6AA3E8E7ECD98C885FFE"
assert length(record.dominant_colors) == 5 assert Enum.count_until(record.dominant_colors, 6) == 5
assert Enum.all?(record.dominant_colors, &color_hex?/1) assert Enum.all?(record.dominant_colors, &color_hex?/1)
end end
+2 -2
View File
@@ -278,7 +278,7 @@ defmodule MusicLibrary.ScrobbleRulesTest do
}) })
assert results = ScrobbleRules.apply_all_rules() assert results = ScrobbleRules.apply_all_rules()
assert length(results) == 2 assert Enum.count_until(results, 3) == 2
# Verify all results are successful # Verify all results are successful
Enum.each(results, fn result -> Enum.each(results, fn result ->
@@ -495,7 +495,7 @@ defmodule MusicLibrary.ScrobbleRulesTest do
results = ScrobbleRules.apply_all_rules() results = ScrobbleRules.apply_all_rules()
# Should have 4 results (one for each rule) # Should have 4 results (one for each rule)
assert length(results) == 4 assert Enum.count_until(results, 5) == 4
# All results should be successful # All results should be successful
Enum.each(results, fn result -> Enum.each(results, fn result ->
+4 -4
View File
@@ -93,10 +93,10 @@ defmodule MusicLibrary.SearchTest do
test "respects limit", %{collected: _collected} do test "respects limit", %{collected: _collected} do
results = Search.universal_search("Marillion", limit: 1) results = Search.universal_search("Marillion", limit: 1)
assert length(results.collection) <= 1 assert Enum.count_until(results.collection, 2) <= 1
assert length(results.wishlist) <= 1 assert Enum.count_until(results.wishlist, 2) <= 1
assert length(results.artists) <= 1 assert Enum.count_until(results.artists, 2) <= 1
assert length(results.record_sets) <= 1 assert Enum.count_until(results.record_sets, 2) <= 1
end end
end end
@@ -360,7 +360,7 @@ defmodule MusicLibraryWeb.Components.ChatTest do
# contains two user rows with the same content. # contains two user rows with the same content.
reloaded = Chats.get_chat!(chat.id) reloaded = Chats.get_chat!(chat.id)
user_messages = Enum.filter(reloaded.messages, &(&1.role == "user")) user_messages = Enum.filter(reloaded.messages, &(&1.role == "user"))
assert length(user_messages) == 2 assert Enum.count_until(user_messages, 3) == 2
end end
end end
end end
@@ -78,7 +78,7 @@ defmodule MusicLibraryWeb.ErrorControllerTest do
assert %{"errors" => returned, "total" => 3, "limit" => 50, "offset" => 0} = assert %{"errors" => returned, "total" => 3, "limit" => 50, "offset" => 0} =
json_response(conn, 200) json_response(conn, 200)
assert length(returned) == 3 assert Enum.count_until(returned, 4) == 3
# Verify each returned error has the expected fields # Verify each returned error has the expected fields
for error <- returned do for error <- returned do
@@ -138,7 +138,7 @@ defmodule MusicLibraryWeb.ErrorControllerTest do
assert %{"errors" => returned, "total" => 3, "limit" => 2, "offset" => 1} = assert %{"errors" => returned, "total" => 3, "limit" => 2, "offset" => 1} =
json_response(conn, 200) json_response(conn, 200)
assert length(returned) == 2 assert Enum.count_until(returned, 3) == 2
end end
test "returns empty list when no errors match", %{conn: conn} do test "returns empty list when no errors match", %{conn: conn} do
@@ -224,7 +224,7 @@ defmodule MusicLibraryWeb.ErrorControllerTest do
# Occurrences # Occurrences
occurrences = returned["occurrences"] occurrences = returned["occurrences"]
assert length(occurrences) == 2 assert Enum.count_until(occurrences, 3) == 2
# Most recent first (desc inserted_at) # Most recent first (desc inserted_at)
first_occ = hd(occurrences) first_occ = hd(occurrences)
@@ -240,7 +240,7 @@ defmodule MusicLibraryWeb.ErrorControllerTest do
# Stacktrace lines # Stacktrace lines
lines = first_occ["stacktrace"]["lines"] lines = first_occ["stacktrace"]["lines"]
assert length(lines) == 2 assert Enum.count_until(lines, 3) == 2
[line1, line2] = lines [line1, line2] = lines
assert line1["module"] == "OtherModule" assert line1["module"] == "OtherModule"
@@ -680,7 +680,7 @@ defmodule MusicLibraryWeb.CollectionLive.IndexTest do
# Verify exactly two distinct import jobs were enqueued # Verify exactly two distinct import jobs were enqueued
enqueued = all_enqueued(worker: ImportFromMusicbrainzRelease) enqueued = all_enqueued(worker: ImportFromMusicbrainzRelease)
assert length(enqueued) == 2 assert Enum.count_until(enqueued, 3) == 2
assert Enum.all?(enqueued, & &1.args["release_id"]) assert Enum.all?(enqueued, & &1.args["release_id"])
# No records should have been inserted synchronously # No records should have been inserted synchronously
@@ -176,7 +176,7 @@ defmodule MusicLibraryWeb.ScrobbledTracksLive.RulePickerTest do
assert_has(session, "#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 Enum.count_until(ScrobbleRules.list_scrobble_rules(type: :album), 2) == 1
end end
end end
end end
@@ -217,7 +217,7 @@ defmodule MusicLibraryWeb.LiveHelpers.RecordActionsTest do
updated = Records.get_record!(record.id) updated = Records.get_record!(record.id)
# FakeColorExtractor returns a fixed 5-color palette # FakeColorExtractor returns a fixed 5-color palette
assert length(updated.dominant_colors) == 5 assert Enum.count_until(updated.dominant_colors, 6) == 5
end end
@tag :capture_log @tag :capture_log