diff --git a/frame.go b/frame.go index cd864e97b..5b8b06f63 100644 --- a/frame.go +++ b/frame.go @@ -446,7 +446,7 @@ func (f *Frame) GetFields() (*FrameSchema, error) { // Ensure frame supports fields. if !f.RangeEnabled() { - return nil, nil + return nil, ErrFrameFieldsNotAllowed } err := f.loadSchema() if err != nil { diff --git a/handler.go b/handler.go index 03707b26d..674f1baa4 100644 --- a/handler.go +++ b/handler.go @@ -849,7 +849,10 @@ func (h *Handler) handleGetFrameField(w http.ResponseWriter, r *http.Request) { index := h.Holder.index(indexName) frame := index.frame(frameName) schema, err := frame.GetFields() - if err != nil { + if err == ErrFrameFieldsNotAllowed { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } else if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } diff --git a/handler_test.go b/handler_test.go index 62361b060..6e8ebab88 100644 --- a/handler_test.go +++ b/handler_test.go @@ -1072,13 +1072,28 @@ func TestHandler_Frame_GetFields(t *testing.T) { } else if field.Max != 100 { t.Fatalf("expected field's max: x, actuall max: %v", field.Max) } - // - // - //if field := f.Field("x"); field != nil { - // t.Fatalf("expected nil field, got: %#v", field) - //} }) + + t.Run("ErrFrameFieldNotAllowed", func(t *testing.T) { + idx := hldr.MustCreateIndexIfNotExists("i", pilosa.IndexOptions{}) + _, err := idx.CreateFrameIfNotExists("f1", pilosa.FrameOptions{RangeEnabled: false}) + + resp, err := http.Get(s.URL + "/index/i/frame/f1/fields") + if err != nil { + t.Fatal(err) + } + if err != nil { + t.Fatal(err) + } else if resp.StatusCode != http.StatusBadRequest { + t.Fatalf("unexpected status code: %d", resp.StatusCode) + } else if body, err := ioutil.ReadAll(resp.Body); err != nil { + t.Fatal(err) + } else if strings.TrimSpace(string(body)) != `frame fields not allowed` { + t.Fatalf("unexpected body: %q", body) + } + }) + } type FrameFields struct {