Return controlled errors from genre population

Closes #142
This commit is contained in:
Claudio Ortolina
2026-03-30 15:01:42 +01:00
parent 92a36b915a
commit c913dab692
3 changed files with 79 additions and 6 deletions
+29
View File
@@ -344,4 +344,33 @@ defmodule MusicLibrary.RecordsTest do
assert Assets.get(updated_record.cover_hash).content == expected_content
end
end
describe "populate_genres/1" do
test "updates record genres from OpenAI response" do
record = record(%{genres: []})
genres = ["progressive rock", "art rock", "symphonic rock"]
Req.Test.stub(OpenAI.API, fn conn ->
Req.Test.json(conn, %{
"choices" => [
%{"message" => %{"content" => JSON.encode!(%{"genres" => genres})}}
]
})
end)
assert {:ok, updated} = Records.populate_genres(record)
assert updated.genres == genres
end
@tag :capture_log
test "returns error tuple when OpenAI API fails" do
record = record(%{genres: []})
Req.Test.stub(OpenAI.API, fn conn ->
Plug.Conn.send_resp(conn, 500, JSON.encode!(%{"error" => "internal server error"}))
end)
assert {:error, _reason} = Records.populate_genres(record)
end
end
end
@@ -0,0 +1,44 @@
defmodule MusicLibrary.Worker.PopulateGenresTest do
use MusicLibrary.DataCase
import MusicLibrary.Fixtures.Records
alias MusicLibrary.Records
alias MusicLibrary.Worker.PopulateGenres
describe "perform/1" do
test "populates genres and enqueues embedding generation" do
record = record(%{genres: []})
genres = ["progressive rock", "art rock", "symphonic rock"]
Req.Test.stub(OpenAI.API, fn conn ->
Req.Test.json(conn, %{
"choices" => [
%{"message" => %{"content" => JSON.encode!(%{"genres" => genres})}}
]
})
end)
assert :ok = perform_job(PopulateGenres, %{"id" => record.id})
updated = Records.get_record!(record.id)
assert updated.genres == genres
assert_enqueued(
worker: MusicLibrary.Worker.GenerateRecordEmbedding,
args: %{"record_id" => record.id}
)
end
@tag :capture_log
test "returns error when OpenAI API fails" do
record = record(%{genres: []})
Req.Test.stub(OpenAI.API, fn conn ->
Plug.Conn.send_resp(conn, 500, JSON.encode!(%{"error" => "internal server error"}))
end)
assert {:error, _reason} = perform_job(PopulateGenres, %{"id" => record.id})
end
end
end