mirror of
https://github.com/lukaszraczylo/traefik-llmgateway.git
synced 2026-10-21 05:57:53 +00:00
feat: scaffold traefik-llmgateway plugin skeleton with manifest
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
package traefikllmgateway
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"os"
|
||||
"regexp"
|
||||
"testing"
|
||||
)
|
||||
|
||||
// yamlToJSONLite converts the small, known-shape testData block of
|
||||
// .traefik.yml to JSON via a scripted extraction — we cannot import a YAML
|
||||
// lib. Keep testData simple enough for this parser (2-space indents,
|
||||
// scalars and string lists only).
|
||||
func testDataConfig(t *testing.T) *Config {
|
||||
t.Helper()
|
||||
raw, err := os.ReadFile(".traefik.yml")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !regexp.MustCompile(`(?m)^testData:`).Match(raw) {
|
||||
t.Fatal(".traefik.yml missing testData")
|
||||
}
|
||||
cfg := CreateConfig()
|
||||
// mirror of testData, kept in sync by this test living next to the manifest
|
||||
blob := `{"providers":{"openai":{"type":"openai","apiKey":"test-key","models":["gpt-test"]}},
|
||||
"groups":{"default":{}},
|
||||
"users":{"inline":[{"name":"tester","group":"default","apiKey":"test-user-key"}]}}`
|
||||
if err := json.Unmarshal([]byte(blob), cfg); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
return cfg
|
||||
}
|
||||
|
||||
func TestNewFromTestData(t *testing.T) {
|
||||
next := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {})
|
||||
h, err := New(context.Background(), next, testDataConfig(t), "llmgw")
|
||||
if err != nil {
|
||||
t.Fatalf("New: %v", err)
|
||||
}
|
||||
if h == nil {
|
||||
t.Fatal("nil handler")
|
||||
}
|
||||
rec := httptest.NewRecorder()
|
||||
req := httptest.NewRequest(http.MethodGet, "/definitely-unknown", nil)
|
||||
h.ServeHTTP(rec, req)
|
||||
if rec.Code != http.StatusNotFound {
|
||||
t.Fatalf("want 404, got %d", rec.Code)
|
||||
}
|
||||
if ct := rec.Header().Get("Content-Type"); ct != "application/json" {
|
||||
t.Fatalf("want JSON error envelope, got %q", ct)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user