| package ollama |
|
|
| import ( |
| "encoding/json" |
| "github.com/go-chi/chi/v5" |
| "net/http" |
| "net/http/httptest" |
| "strings" |
| "testing" |
| ) |
|
|
| type ollamaTestSurface struct { |
| Store ConfigReader |
| handler *Handler |
| } |
|
|
| func (h *ollamaTestSurface) apiHandler() *Handler { |
| if h.handler == nil { |
| h.handler = &Handler{Store: h.Store} |
| } |
| return h.handler |
| } |
|
|
| func registerOllamaTestRoutes(r chi.Router, h *ollamaTestSurface) { |
| r.Get("/api/version", h.apiHandler().GetVersion) |
| r.Get("/api/tags", h.apiHandler().ListOllamaModels) |
| r.Post("/api/show", h.apiHandler().GetOllamaModel) |
| } |
|
|
| func TestGetOllamaVersionRoute(t *testing.T) { |
| h := &ollamaTestSurface{} |
| r := chi.NewRouter() |
| registerOllamaTestRoutes(r, h) |
| req := httptest.NewRequest(http.MethodGet, "/api/version", nil) |
| 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()) |
| } |
| } |
|
|
| func TestGetOllamaModelsRoute(t *testing.T) { |
| h := &ollamaTestSurface{} |
| r := chi.NewRouter() |
| registerOllamaTestRoutes(r, h) |
| req := httptest.NewRequest(http.MethodGet, "/api/tags", nil) |
| 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()) |
| } |
| } |
|
|
| func TestGetOllamaModelRoute(t *testing.T) { |
| h := &ollamaTestSurface{} |
| r := chi.NewRouter() |
| registerOllamaTestRoutes(r, h) |
|
|
| t.Run("direct", func(t *testing.T) { |
| body := `{"model":"deepseek-v4-flash"}` |
| req := httptest.NewRequest(http.MethodPost, "/api/show", strings.NewReader(body)) |
| 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 payload map[string]any |
| if err := json.Unmarshal(rec.Body.Bytes(), &payload); err != nil { |
| t.Fatalf("expected valid json body, got err=%v body=%s", err, rec.Body.String()) |
| } |
| if _, ok := payload["id"]; !ok { |
| t.Fatalf("expected response has lowercase id field, body=%s", rec.Body.String()) |
| } |
| if _, ok := payload["ID"]; ok { |
| t.Fatalf("expected response does not expose uppercase ID field, body=%s", rec.Body.String()) |
| } |
| }) |
|
|
| t.Run("direct_nothinking", func(t *testing.T) { |
| body := `{"model":"deepseek-v4-flash-nothinking"}` |
| req := httptest.NewRequest(http.MethodPost, "/api/show", strings.NewReader(body)) |
| 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()) |
| } |
| }) |
|
|
| t.Run("direct_expert", func(t *testing.T) { |
| body := `{"model":"deepseek-v4-pro"}` |
| req := httptest.NewRequest(http.MethodPost, "/api/show", strings.NewReader(body)) |
| 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()) |
| } |
| }) |
|
|
| t.Run("direct_vision", func(t *testing.T) { |
| body := `{"model":"deepseek-v4-vision"}` |
| req := httptest.NewRequest(http.MethodPost, "/api/show", strings.NewReader(body)) |
| 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()) |
| } |
| }) |
| } |
|
|
| func TestGetOllamaModelRouteNotFound(t *testing.T) { |
| h := &ollamaTestSurface{} |
| r := chi.NewRouter() |
| registerOllamaTestRoutes(r, h) |
|
|
| body := `{"model":"not-exists"}` |
| req := httptest.NewRequest(http.MethodPost, "/api/show", strings.NewReader(body)) |
| req.Header.Set("Content-Type", "application/json") |
| rec := httptest.NewRecorder() |
| r.ServeHTTP(rec, req) |
| if rec.Code != http.StatusNotFound { |
| t.Fatalf("expected 404, got %d body=%s", rec.Code, rec.Body.String()) |
| } |
| } |
|
|