@@ -256,7 +256,7 @@ defmodule MusicLibrary.Records do
|
||||
end
|
||||
end
|
||||
|
||||
@spec populate_genres(Record.t()) :: {:ok, Record.t()} | {:error, Ecto.Changeset.t()}
|
||||
@spec populate_genres(Record.t()) :: {:ok, Record.t()} | {:error, Ecto.Changeset.t() | term()}
|
||||
def populate_genres(record) do
|
||||
artists = Enum.map_join(record.artists, ",", fn a -> a.name end)
|
||||
|
||||
@@ -270,12 +270,12 @@ defmodule MusicLibrary.Records do
|
||||
"""
|
||||
}
|
||||
|
||||
{:ok, response} = OpenAI.gpt(completion)
|
||||
|
||||
with {:ok, response} <- OpenAI.gpt(completion) do
|
||||
record
|
||||
|> Record.add_genres(response["genres"])
|
||||
|> Repo.update()
|
||||
end
|
||||
end
|
||||
|
||||
@spec populate_genres_async(Record.t()) :: {:ok, Oban.Job.t()} | {:error, Ecto.Changeset.t()}
|
||||
def populate_genres_async(record) do
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user