| package openai |
|
|
| import ( |
| "bytes" |
| "context" |
| "encoding/json" |
| "net/http" |
| "net/http/httptest" |
| "testing" |
|
|
| "github.com/go-chi/chi/v5" |
|
|
| "ds2api/internal/account" |
| "ds2api/internal/auth" |
| "ds2api/internal/config" |
| ) |
|
|
| func newResolverWithConfigJSON(t *testing.T, cfgJSON string) (*config.Store, *auth.Resolver) { |
| t.Helper() |
| t.Setenv("DS2API_CONFIG_JSON", cfgJSON) |
| store := config.LoadStore() |
| pool := account.NewPool(store) |
| resolver := auth.NewResolver(store, pool, func(_ context.Context, _ config.Account) (string, error) { |
| return "unused", nil |
| }) |
| return store, resolver |
| } |
|
|
| func TestEmbeddingsRouteContract(t *testing.T) { |
| store, resolver := newResolverWithConfigJSON(t, `{"embeddings":{"provider":"deterministic"}}`) |
| h := &openAITestSurface{Store: store, Auth: resolver} |
| r := chi.NewRouter() |
| registerOpenAITestRoutes(r, h) |
|
|
| t.Run("unauthorized", func(t *testing.T) { |
| body := bytes.NewBufferString(`{"model":"gpt-4o","input":"hello"}`) |
| req := httptest.NewRequest(http.MethodPost, "/v1/embeddings", body) |
| req.Header.Set("Content-Type", "application/json") |
| rec := httptest.NewRecorder() |
| r.ServeHTTP(rec, req) |
| if rec.Code != http.StatusUnauthorized { |
| t.Fatalf("expected 401, got %d body=%s", rec.Code, rec.Body.String()) |
| } |
| }) |
|
|
| t.Run("ok", func(t *testing.T) { |
| body := bytes.NewBufferString(`{"model":"gpt-4o","input":["a","b"]}`) |
| req := httptest.NewRequest(http.MethodPost, "/v1/embeddings", body) |
| req.Header.Set("Authorization", "Bearer test-token") |
| req.Header.Set("Content-Type", "application/json") |
| rec := httptest.NewRecorder() |
| r.ServeHTTP(rec, req) |
| if rec.Code != http.StatusOK { |
| t.Fatalf("expected 200, got %d body=%s", rec.Code, rec.Body.String()) |
| } |
| var out map[string]any |
| if err := json.Unmarshal(rec.Body.Bytes(), &out); err != nil { |
| t.Fatalf("decode response failed: %v", err) |
| } |
| if out["object"] != "list" { |
| t.Fatalf("unexpected object: %#v", out["object"]) |
| } |
| data, _ := out["data"].([]any) |
| if len(data) != 2 { |
| t.Fatalf("expected 2 embeddings, got %d", len(data)) |
| } |
| }) |
| } |
|
|
| func TestEmbeddingsRouteProviderMissing(t *testing.T) { |
| store, resolver := newResolverWithConfigJSON(t, `{}`) |
| h := &openAITestSurface{Store: store, Auth: resolver} |
| r := chi.NewRouter() |
| registerOpenAITestRoutes(r, h) |
|
|
| body := bytes.NewBufferString(`{"model":"gpt-4o","input":"hello"}`) |
| req := httptest.NewRequest(http.MethodPost, "/v1/embeddings", body) |
| req.Header.Set("Authorization", "Bearer test-token") |
| req.Header.Set("Content-Type", "application/json") |
| rec := httptest.NewRecorder() |
| r.ServeHTTP(rec, req) |
| if rec.Code != http.StatusNotImplemented { |
| t.Fatalf("expected 501, got %d body=%s", rec.Code, rec.Body.String()) |
| } |
| var out map[string]any |
| if err := json.Unmarshal(rec.Body.Bytes(), &out); err != nil { |
| t.Fatalf("decode response failed: %v", err) |
| } |
| errObj, _ := out["error"].(map[string]any) |
| if _, ok := errObj["code"]; !ok { |
| t.Fatalf("expected error.code in response: %#v", out) |
| } |
| if _, ok := errObj["param"]; !ok { |
| t.Fatalf("expected error.param in response: %#v", out) |
| } |
| } |
|
|