package httpclient import ( "context" "encoding/json" "errors" "io" "log/slog" "net/http" "net/http/httptest" "net/url" "sync" "testing" "git.yeij.top/AskaEth/Cyrene_v2/internal/logger" ) func discardLogger() *slog.Logger { return logger.New(logger.Options{Out: io.Discard}) } func TestGetJSON_EnvelopeAndAuth(t *testing.T) { t.Parallel() var mu sync.Mutex var auth string srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { mu.Lock() auth = r.Header.Get("Authorization") mu.Unlock() _ = json.NewEncoder(w).Encode(map[string]any{ "code": 0, "message": "ok", "data": map[string]any{"url": "wss://gw.example.com/gateway"}, }) })) defer srv.Close() c := New( WithBaseURL(srv.URL), WithToken("secret-token"), WithHTTPClient(srv.Client()), WithLogger(discardLogger()), ) data, err := c.GetJSON(context.Background(), "/gateway/index", url.Values{"compress": {"0"}}) if err != nil { t.Fatalf("GetJSON: %v", err) } if string(data) != `{"url":"wss://gw.example.com/gateway"}` { t.Errorf("data = %s", string(data)) } mu.Lock() defer mu.Unlock() if auth != "Bearer secret-token" { t.Errorf("Authorization = %q, want Bearer secret-token", auth) } } func TestDoJSON_NonZeroCode(t *testing.T) { t.Parallel() srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { _ = json.NewEncoder(w).Encode(map[string]any{"code": 40101, "message": "invalid token", "data": struct{}{}}) })) defer srv.Close() c := New(WithBaseURL(srv.URL), WithHTTPClient(srv.Client()), WithLogger(discardLogger())) _, err := c.DoJSON(context.Background(), http.MethodPost, "/message/create", map[string]any{"a": 1}) if !errors.Is(err, ErrAPI) { t.Fatalf("err = %v, want ErrAPI", err) } } func TestDoJSON_StatusError(t *testing.T) { t.Parallel() srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusUnauthorized) _, _ = w.Write([]byte("unauthorized")) })) defer srv.Close() c := New(WithBaseURL(srv.URL), WithHTTPClient(srv.Client()), WithLogger(discardLogger())) _, err := c.DoJSON(context.Background(), http.MethodGet, "/gateway/index", nil) if !errors.Is(err, ErrAPI) { t.Fatalf("err = %v, want ErrAPI", err) } } func TestGetJSON_NonEnvelopeBodyPassedThrough(t *testing.T) { t.Parallel() srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { _, _ = w.Write([]byte(`[1,2,3]`)) })) defer srv.Close() c := New(WithBaseURL(srv.URL), WithHTTPClient(srv.Client()), WithLogger(discardLogger())) data, err := c.GetJSON(context.Background(), "/list", nil) if err != nil { t.Fatalf("GetJSON: %v", err) } if string(data) != "[1,2,3]" { t.Errorf("data = %s, want [1,2,3]", string(data)) } }