package tdclient import ( "context" "net/http" "net/http/httptest" "testing" ) func TestVersion(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/api/version" { t.Errorf("unexpected path %q", r.URL.Path) } // Unauthenticated per terdut-server's own router.go comment: no // Authorization header should be required, and none is sent here. w.Header().Set("Content-Type", "application/json") w.Write([]byte(`{"version":"v0.20.0"}`)) //nolint:errcheck })) defer srv.Close() got, err := New(srv.URL).Version(context.Background()) if err != nil { t.Fatalf("Version() error = %v", err) } if got != "v0.20.0" { t.Errorf("Version() = %q, want %q", got, "v0.20.0") } } func TestVersionUnreachable(t *testing.T) { // A closed server: connection refused, the same shape a bad // spec.endpoint produces against a real cluster. srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {})) srv.Close() if _, err := New(srv.URL).Version(context.Background()); err == nil { t.Fatal("Version() error = nil, want a connection error") } } func TestVersionErrorStatus(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(`{"error":"internal error"}`)) //nolint:errcheck })) defer srv.Close() _, err := New(srv.URL).Version(context.Background()) if err == nil { t.Fatal("Version() error = nil, want a StatusError") } var statusErr *StatusError if !asStatusError(err, &statusErr) { t.Fatalf("Version() error = %v (%T), want *StatusError", err, err) } if statusErr.Code != http.StatusInternalServerError { t.Errorf("StatusError.Code = %d, want %d", statusErr.Code, http.StatusInternalServerError) } if statusErr.Message != "internal error" { t.Errorf("StatusError.Message = %q, want %q", statusErr.Message, "internal error") } } // asStatusError is errors.As without importing errors twice in a tiny test // file — kept local since no other test here needs it. func asStatusError(err error, target **StatusError) bool { se, ok := err.(*StatusError) if !ok { return false } *target = se return true } func TestWithTokenSetsAuthorizationHeader(t *testing.T) { var gotAuth string srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { gotAuth = r.Header.Get("Authorization") w.Write([]byte(`{"version":"v0.20.0"}`)) //nolint:errcheck })) defer srv.Close() c := New(srv.URL).WithToken("tdsa_abc123") if _, err := c.Version(context.Background()); err != nil { t.Fatalf("Version() error = %v", err) } if want := "Bearer tdsa_abc123"; gotAuth != want { t.Errorf("Authorization header = %q, want %q", gotAuth, want) } }