Stub color extractor in tests

Makes the test suite much faster
This commit is contained in:
Claudio Ortolina
2026-03-26 22:58:39 +00:00
parent 152b3ddb70
commit e575f2af9e
5 changed files with 35 additions and 3 deletions
+2
View File
@@ -101,6 +101,8 @@ config :music_library, OpenAI,
config :phoenix_test, :endpoint, MusicLibraryWeb.Endpoint config :phoenix_test, :endpoint, MusicLibraryWeb.Endpoint
config :music_library, color_extractor: MusicLibrary.Colors.FakeColorExtractor
config :music_library, Oban, testing: :manual config :music_library, Oban, testing: :manual
config :music_library, MusicLibrary.Mailer, adapter: Swoosh.Adapters.Test config :music_library, MusicLibrary.Mailer, adapter: Swoosh.Adapters.Test
+9
View File
@@ -0,0 +1,9 @@
defmodule MusicLibrary.Colors.Extractor do
@moduledoc """
Behaviour that defines the functions necessary to implement a dominant colors
extractor.
"""
@callback extract_dominant_colors(binary(), pos_integer()) ::
{:ok, [String.t()]} | {:error, term()}
end
@@ -3,9 +3,11 @@ defmodule MusicLibrary.Colors.KMeansExtractor do
Extracts dominant colors from images using K-Means clustering via the dominant_colors library. Extracts dominant colors from images using K-Means clustering via the dominant_colors library.
""" """
@behaviour MusicLibrary.Colors.Extractor
alias Vix.Vips.Image alias Vix.Vips.Image
@spec extract_dominant_colors(binary(), pos_integer()) :: {:ok, [String.t()]} | {:error, term()} @impl true
def extract_dominant_colors(image_data, num_colors \\ 5) do def extract_dominant_colors(image_data, num_colors \\ 5) do
:telemetry.span( :telemetry.span(
[:music_library, :colors, :extract], [:music_library, :colors, :extract],
+7 -2
View File
@@ -7,10 +7,15 @@ defmodule MusicLibrary.Records do
alias MusicLibrary.Artists alias MusicLibrary.Artists
alias MusicLibrary.Assets alias MusicLibrary.Assets
alias MusicLibrary.Colors.KMeansExtractor
alias MusicLibrary.Records.{ArtistRecord, Record, SearchIndex, SearchParser} alias MusicLibrary.Records.{ArtistRecord, Record, SearchIndex, SearchParser}
alias MusicLibrary.{Repo, Worker} alias MusicLibrary.{Repo, Worker}
@color_extractor Application.compile_env(
:music_library,
:color_extractor,
MusicLibrary.Colors.KMeansExtractor
)
@type import_opts :: [ @type import_opts :: [
format: atom(), format: atom(),
purchased_at: DateTime.t() | nil, purchased_at: DateTime.t() | nil,
@@ -305,7 +310,7 @@ defmodule MusicLibrary.Records do
def extract_colors(record) do def extract_colors(record) do
asset = Assets.get!(record.cover_hash) asset = Assets.get!(record.cover_hash)
with {:ok, colors} <- KMeansExtractor.extract_dominant_colors(asset.content) do with {:ok, colors} <- @color_extractor.extract_dominant_colors(asset.content) do
update_record(record, %{dominant_colors: colors}) update_record(record, %{dominant_colors: colors})
end end
end end
+14
View File
@@ -0,0 +1,14 @@
defmodule MusicLibrary.Colors.FakeColorExtractor do
@moduledoc """
Test stub for `MusicLibrary.Colors.KMeansExtractor`.
Returns hardcoded colors to avoid CPU-intensive K-means clustering in tests.
"""
@behaviour MusicLibrary.Colors.Extractor
@impl true
def extract_dominant_colors(_image_data, _num_colors \\ 5) do
{:ok, ["#000000", "#c0c0c0", "#c08080", "#404000", "#804040"]}
end
end