package compat import ( "context" "encoding/json" "io" "log/slog" "net/http" "net/http/httptest" "sync/atomic" "testing" ) func discardLogger() *slog.Logger { return slog.New(slog.NewTextHandler(io.Discard, nil)) } func TestEmbedRetriesTransientFailures(t *testing.T) { var calls atomic.Int32 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if calls.Add(1) < 3 { http.Error(w, "temporary failure", http.StatusServiceUnavailable) return } _ = json.NewEncoder(w).Encode(map[string]any{ "data": []map[string]any{ {"embedding": []float32{1, 2, 3}}, }, }) })) defer server.Close() client := New(Config{ Name: "test", BaseURL: server.URL, APIKey: "secret", EmbeddingModel: "embed-model", MetadataModel: "meta-model", HTTPClient: server.Client(), Log: discardLogger(), Dimensions: 3, }) embedding, err := client.Embed(context.Background(), "hello") if err != nil { t.Fatalf("Embed() error = %v", err) } if len(embedding) != 3 { t.Fatalf("embedding len = %d, want 3", len(embedding)) } if got := calls.Load(); got != 3 { t.Fatalf("call count = %d, want 3", got) } } func TestExtractMetadataParsesCodeFencedJSON(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { _ = json.NewEncoder(w).Encode(map[string]any{ "choices": []map[string]any{ { "message": map[string]any{ "content": "```json\n{\"people\":[\"Alice\"],\"action_items\":[],\"dates_mentioned\":[],\"topics\":[\"memory\"],\"type\":\"idea\",\"source\":\"mcp\"}\n```", }, }, }, }) })) defer server.Close() client := New(Config{ Name: "test", BaseURL: server.URL, APIKey: "secret", EmbeddingModel: "embed-model", MetadataModel: "meta-model", HTTPClient: server.Client(), Log: discardLogger(), }) metadata, err := client.ExtractMetadata(context.Background(), "hello") if err != nil { t.Fatalf("ExtractMetadata() error = %v", err) } if metadata.Type != "idea" { t.Fatalf("metadata type = %q, want idea", metadata.Type) } if len(metadata.People) != 1 || metadata.People[0] != "Alice" { t.Fatalf("metadata people = %#v, want [Alice]", metadata.People) } }