defmodule OpenAITest do use ExUnit.Case, async: true describe "gpt/1" do test "delegates to API with resolved config" do Req.Test.stub(OpenAI.API, fn conn -> assert conn.request_path == "/v1/chat/completions" Req.Test.json(conn, %{ "choices" => [ %{"message" => %{"content" => ~s({"answer": "42"})}} ] }) end) completion = %{model: "gpt-4.1-mini", content: "test", role: "user", temperature: 0.5} assert {:ok, %{"answer" => "42"}} = OpenAI.gpt(completion) end end describe "embeddings/1" do test "delegates to API with resolved config" do embedding = [0.1, 0.2, 0.3] Req.Test.stub(OpenAI.API, fn conn -> assert conn.request_path == "/v1/embeddings" Req.Test.json(conn, %{ "data" => [%{"embedding" => embedding}] }) end) assert {:ok, ^embedding} = OpenAI.embeddings("test text") end end describe "chat_stream/2" do test "streams chunks via callback" do test_pid = self() Req.Test.stub(OpenAI.API, fn conn -> assert conn.request_path == "/v1/responses" body = "data: #{JSON.encode!(%{"type" => "response.output_text.delta", "delta" => "Hi"})}\n\n" <> "data: #{JSON.encode!(%{"type" => "response.completed"})}\n\n" conn |> Plug.Conn.put_resp_content_type("text/event-stream") |> Plug.Conn.send_resp(200, body) end) assert :ok = OpenAI.chat_stream( [%{role: "user", content: "hello"}], on_chunk: fn chunk -> send(test_pid, {:chunk, chunk}) end ) assert_received {:chunk, "Hi"} end end end