package reply import ( "context" "encoding/json" "log/slog" "net/http" "net/http/httptest" "testing" ) func TestCompleteSendsOpenAIRequestAndParsesReply(t *testing.T) { var ( gotAuth string gotSession string gotPath string gotBody chatRequest ) srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { gotAuth = r.Header.Get("Authorization") gotSession = r.Header.Get("x-opencode-session") gotPath = r.URL.Path if err := json.NewDecoder(r.Body).Decode(&gotBody); err != nil { t.Errorf("decode request: %v", err) } _ = json.NewEncoder(w).Encode(chatResponse{ Model: "test-model", Choices: []struct { Message chatMessage `json:"message"` }{{Message: chatMessage{Role: "assistant", Content: " Thanks, got it. "}}}, }) })) defer srv.Close() c := NewClient(srv.URL, "secret-key", "auto/best-chat", slog.New(slog.DiscardHandler)) if !c.Configured() { t.Fatal("client should be configured with a key") } got, err := c.Complete(context.Background(), "system prompt", "user prompt") if err != nil { t.Fatalf("Complete() error = %v", err) } if got != "Thanks, got it." { t.Errorf("Complete() = %q, want trimmed reply", got) } if gotPath != "/chat/completions" { t.Errorf("path = %q, want /chat/completions", gotPath) } if gotAuth != "Bearer secret-key" { t.Errorf("Authorization = %q", gotAuth) } if gotSession == "" { t.Error("x-opencode-session header was not set") } if gotBody.Model != "auto/best-chat" || gotBody.Stream { t.Errorf("request = %+v, want non-streaming auto/best-chat", gotBody) } if len(gotBody.Messages) != 2 || gotBody.Messages[0].Role != "system" || gotBody.Messages[1].Role != "user" { t.Errorf("messages = %+v", gotBody.Messages) } } func TestCompleteNotConfigured(t *testing.T) { c := NewClient("http://127.0.0.1:1/v1", "", "auto/best-chat", slog.New(slog.DiscardHandler)) if c.Configured() { t.Fatal("client should not be configured without a key") } if _, err := c.Complete(context.Background(), "s", "u"); err != ErrNotConfigured { t.Fatalf("Complete() error = %v, want ErrNotConfigured", err) } } func TestCompleteReportsHTTPError(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { http.Error(w, "nope", http.StatusUnauthorized) })) defer srv.Close() c := NewClient(srv.URL, "key", "m", slog.New(slog.DiscardHandler)) _, err := c.Complete(context.Background(), "s", "u") if err == nil { t.Fatal("Complete() error = nil, want an error") } }