package main import ( "context" "encoding/json" "io" "net/http" "net/http/httptest" "strings" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestBrainClient_Query_Success(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { assert.Equal(t, http.MethodPost, r.Method) assert.Equal(t, "/query", r.URL.Path) body, _ := io.ReadAll(r.Body) var got struct { Query string `json:"query"` Limit int `json:"limit"` } require.NoError(t, json.Unmarshal(body, &got)) assert.Equal(t, "find-h", got.Query) assert.Equal(t, 3, got.Limit) w.Header().Set("Content-Type", "application/json") _, _ = w.Write([]byte(`{"results":[{"path":"knowledge/x.md","title":"x","excerpt":"...","score":7}]}`)) })) defer srv.Close() c := &brainClient{baseURL: srv.URL, http: srv.Client()} res, err := c.Query(context.Background(), "find-h", 3) require.NoError(t, err) require.Len(t, res.Results, 1) assert.Equal(t, "knowledge/x.md", res.Results[0].Path) assert.Equal(t, 7, res.Results[0].Score) } func TestBrainClient_Query_TransportError(t *testing.T) { c := &brainClient{baseURL: "http://127.0.0.1:1", http: http.DefaultClient} _, err := c.Query(context.Background(), "x", 5) assert.Error(t, err) } func TestBrainClient_Query_Non200(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusInternalServerError) _, _ = w.Write([]byte("boom")) })) defer srv.Close() c := &brainClient{baseURL: srv.URL, http: srv.Client()} _, err := c.Query(context.Background(), "x", 5) require.Error(t, err) assert.Contains(t, err.Error(), "500") } func TestBrainClient_Write_Success(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { assert.Equal(t, "/write", r.URL.Path) assert.Equal(t, http.MethodPost, r.Method) body, _ := io.ReadAll(r.Body) var got struct { Type string `json:"type"` Slug string `json:"slug"` Content string `json:"content"` } require.NoError(t, json.Unmarshal(body, &got)) assert.Equal(t, "knowledge", got.Type) assert.Equal(t, "find-h", got.Slug) assert.Equal(t, "# body\n", got.Content) w.Header().Set("Content-Type", "application/json") _, _ = w.Write([]byte(`{"path":"knowledge/find-h.md"}`)) })) defer srv.Close() c := &brainClient{baseURL: srv.URL, http: srv.Client()} res, err := c.Write(context.Background(), "knowledge", "find-h", strings.NewReader("# body\n")) require.NoError(t, err) assert.Equal(t, "knowledge/find-h.md", res.Path) } func TestNewBrainClient_DefaultURL(t *testing.T) { t.Setenv("BRAIN_URL", "") c := newBrainClient() assert.Equal(t, "http://koala:30330", c.baseURL) } func TestNewBrainClient_OverrideURL(t *testing.T) { t.Setenv("BRAIN_URL", "http://localhost:9999") c := newBrainClient() assert.Equal(t, "http://localhost:9999", c.baseURL) }