package openai import ( "context" "encoding/json" "net/http" "net/http/httptest" "testing" "time" ) func TestNewClient_EmptyKey(t *testing.T) { if _, err := NewClient(" "); err == nil { t.Fatal("expected error for empty API key") } } func TestCreateChatCompletion_Success(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if got, want := r.Header.Get("Authorization"), "Bearer test-key"; got != want { t.Fatalf("expected auth header %q, got %q", want, got) } if got, want := r.URL.Path, "/chat/completions"; got != want { t.Fatalf("expected path %q, got %q", want, got) } response := ChatCompletionResponse{ ID: "chatcmpl-1", Object: "chat.completion", Choices: []ChatCompletionChoice{ { Index: 0, Message: ChatMessage{ Role: "assistant", Content: "Hello!", }, FinishReason: "stop", }, }, Usage: Usage{PromptTokens: 1, CompletionTokens: 1, TotalTokens: 2}, } w.Header().Set("Content-Type", "application/json") if err := json.NewEncoder(w).Encode(response); err != nil { t.Fatalf("failed to encode response: %v", err) } })) defer ts.Close() client, err := NewClient("test-key", WithBaseURL(ts.URL), WithHTTPClient(ts.Client())) if err != nil { t.Fatalf("NewClient returned error: %v", err) } ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() resp, err := client.CreateChatCompletion(ctx, ChatCompletionRequest{ Model: "gpt-test", Messages: []ChatMessage{ {Role: "user", Content: "Hello?"}, }, }) if err != nil { t.Fatalf("CreateChatCompletion returned error: %v", err) } if resp.Choices[0].Message.Content != "Hello!" { t.Fatalf("unexpected response content: %q", resp.Choices[0].Message.Content) } } func TestCreateChatCompletion_Error(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusUnauthorized) _ = json.NewEncoder(w).Encode(ErrorResponse{Error: APIError{Message: "invalid"}}) })) defer ts.Close() client, err := NewClient("test-key", WithBaseURL(ts.URL), WithHTTPClient(ts.Client())) if err != nil { t.Fatalf("NewClient returned error: %v", err) } ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() _, err = client.CreateChatCompletion(ctx, ChatCompletionRequest{Model: "gpt-test"}) if err == nil { t.Fatal("expected error for unauthorized response") } }