From e368426aadf97efd30963fb5dd2cdd9d42195095 Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Wed, 26 Nov 2014 22:51:09 -0900 Subject: [PATCH] List text measurement types --- api/handler.go | 1 + api/text_measurement_types.go | 17 ++++++++++++ api/text_measurement_types_test.go | 29 ++++++++++++++++++++ datastore/text_measurement_types.go | 12 ++++++++ datastore/text_measurement_types_test.go | 23 ++++++++++++++++ models/text_measurement_types.go | 35 ++++++++++++++++++++++++ models/text_measurement_types_test.go | 33 ++++++++++++++++++++++ router/api.go | 1 + router/routes.go | 1 + 9 files changed, 152 insertions(+) diff --git a/api/handler.go b/api/handler.go index f535115..d99c7b7 100644 --- a/api/handler.go +++ b/api/handler.go @@ -55,6 +55,7 @@ func Handler() *mux.Router { m.Get(router.TextMeasurementType).Handler(handler(serveTextMeasurementType)) m.Get(router.CreateTextMeasurementType).Handler(handler(serveCreateTextMeasurementType)) + m.Get(router.TextMeasurementTypes).Handler(handler(serveTextMeasurementTypeList)) return m } diff --git a/api/text_measurement_types.go b/api/text_measurement_types.go index f1fba37..c309fc8 100644 --- a/api/text_measurement_types.go +++ b/api/text_measurement_types.go @@ -40,3 +40,20 @@ func serveCreateTextMeasurementType(w http.ResponseWriter, r *http.Request) erro return writeJSON(w, text_measurement_type) } + +func serveTextMeasurementTypeList(w http.ResponseWriter, r *http.Request) error { + var opt models.TextMeasurementTypeListOptions + if err := schemaDecoder.Decode(&opt, r.URL.Query()); err != nil { + return err + } + + text_measurement_types, err := store.TextMeasurementTypes.List(&opt) + if err != nil { + return err + } + if text_measurement_types == nil { + text_measurement_types = []*models.TextMeasurementType{} + } + + return writeJSON(w, text_measurement_types) +} diff --git a/api/text_measurement_types_test.go b/api/text_measurement_types_test.go index af03918..f5d3e3f 100644 --- a/api/text_measurement_types_test.go +++ b/api/text_measurement_types_test.go @@ -65,3 +65,32 @@ func TestTextMeasurementType_Create(t *testing.T) { t.Error("!success") } } + +func TestTextMeasurementType_List(t *testing.T) { + setup() + + want := []*models.TextMeasurementType{newTextMeasurementType()} + wantOpt := &models.TextMeasurementTypeListOptions{ListOptions: models.ListOptions{Page: 1, PerPage: 10}} + + calledList := false + store.TextMeasurementTypes.(*models.MockTextMeasurementTypesService).List_ = func(opt *models.TextMeasurementTypeListOptions) ([]*models.TextMeasurementType, error) { + if !normalizeDeepEqual(wantOpt, opt) { + t.Errorf("wanted options %d but got %d", wantOpt, opt) + } + calledList = true + return want, nil + } + + text_measurement_types, err := apiClient.TextMeasurementTypes.List(wantOpt) + if err != nil { + t.Fatal(err) + } + + if !calledList { + t.Error("!calledList") + } + + if !normalizeDeepEqual(&want, &text_measurement_types) { + t.Errorf("got text_measurement_types %+v but wanted text_measurement_types %+v", text_measurement_types, want) + } +} diff --git a/datastore/text_measurement_types.go b/datastore/text_measurement_types.go index 22d7738..9ea83ff 100644 --- a/datastore/text_measurement_types.go +++ b/datastore/text_measurement_types.go @@ -34,3 +34,15 @@ func (s *textMeasurementTypesStore) Create(text_measurement_type *models.TextMea } return true, nil } + +func (s *textMeasurementTypesStore) List(opt *models.TextMeasurementTypeListOptions) ([]*models.TextMeasurementType, error) { + if opt == nil { + opt = &models.TextMeasurementTypeListOptions{} + } + var text_measurement_types []*models.TextMeasurementType + err := s.dbh.Select(&text_measurement_types, `SELECT * FROM text_measurement_types LIMIT $1 OFFSET $2;`, opt.PerPageOrDefault(), opt.Offset()) + if err != nil { + return nil, err + } + return text_measurement_types, nil +} diff --git a/datastore/text_measurement_types_test.go b/datastore/text_measurement_types_test.go index 1bb7b28..74b3ba9 100644 --- a/datastore/text_measurement_types_test.go +++ b/datastore/text_measurement_types_test.go @@ -62,3 +62,26 @@ func TestTextMeasurementTypesStore_Create_db(t *testing.T) { t.Error("want nonzero text_measurement_type.Id after submitting") } } + +func TestTextMeasurementTypesStore_List_db(t *testing.T) { + tx, _ := DB.Begin() + defer tx.Rollback() + + want_text_measurement_type := insertTextMeasurementType(t, tx) + want := []*models.TextMeasurementType{want_text_measurement_type} + + d := NewDatastore(tx) + + text_measurement_types, err := d.TextMeasurementTypes.List(&models.TextMeasurementTypeListOptions{ListOptions: models.ListOptions{Page: 1, PerPage: 10}}) + if err != nil { + t.Fatal(err) + } + + for i := range want { + normalizeTime(&want[i].CreatedAt, &want[i].UpdatedAt, &want[i].DeletedAt) + normalizeTime(&text_measurement_types[i].CreatedAt, &text_measurement_types[i].UpdatedAt, &text_measurement_types[i].DeletedAt) + } + if !reflect.DeepEqual(text_measurement_types, want) { + t.Errorf("got text_measurement_types %+v, want %+v", text_measurement_types, want) + } +} diff --git a/models/text_measurement_types.go b/models/text_measurement_types.go index 33aebb7..68625c7 100644 --- a/models/text_measurement_types.go +++ b/models/text_measurement_types.go @@ -29,6 +29,9 @@ type TextMeasurementTypesService interface { // Get a text measurement type Get(id int64) (*TextMeasurementType, error) + // List all text measurement types + List(opt *TextMeasurementTypeListOptions) ([]*TextMeasurementType, error) + // Create a text measurement type Create(text_measurement_type *TextMeasurementType) (bool, error) } @@ -82,8 +85,33 @@ func (s *textMeasurementTypesService) Create(text_measurement_type *TextMeasurem return resp.StatusCode == http.StatusCreated, nil } +type TextMeasurementTypeListOptions struct { + ListOptions +} + +func (s *textMeasurementTypesService) List(opt *TextMeasurementTypeListOptions) ([]*TextMeasurementType, error) { + url, err := s.client.url(router.TextMeasurementTypes, nil, opt) + if err != nil { + return nil, err + } + + req, err := s.client.NewRequest("GET", url.String(), nil) + if err != nil { + return nil, err + } + + var text_measurement_types []*TextMeasurementType + _, err = s.client.Do(req, &text_measurement_types) + if err != nil { + return nil, err + } + + return text_measurement_types, nil +} + type MockTextMeasurementTypesService struct { Get_ func(id int64) (*TextMeasurementType, error) + List_ func(opt *TextMeasurementTypeListOptions) ([]*TextMeasurementType, error) Create_ func(text_measurement_type *TextMeasurementType) (bool, error) } @@ -102,3 +130,10 @@ func (s *MockTextMeasurementTypesService) Create(text_measurement_type *TextMeas } return s.Create_(text_measurement_type) } + +func (s *MockTextMeasurementTypesService) List(opt *TextMeasurementTypeListOptions) ([]*TextMeasurementType, error) { + if s.List_ == nil { + return nil, nil + } + return s.List_(opt) +} diff --git a/models/text_measurement_types_test.go b/models/text_measurement_types_test.go index b292da4..f40bf38 100644 --- a/models/text_measurement_types_test.go +++ b/models/text_measurement_types_test.go @@ -79,3 +79,36 @@ func TestTextMeasurementTypeService_Create(t *testing.T) { t.Errorf("TextMeasurementTypes.Create returned %+v, want %+v", text_measurement_type, want) } } + +func TestTextMeasurementTypeService_List(t *testing.T) { + setup() + defer teardown() + + want := []*TextMeasurementType{newTextMeasurementType()} + + var called bool + mux.HandleFunc(urlPath(t, router.TextMeasurementTypes, nil), func(w http.ResponseWriter, r *http.Request) { + called = true + testMethod(t, r, "GET") + testFormValues(t, r, values{}) + + writeJSON(w, want) + }) + + text_measurement_type, err := client.TextMeasurementTypes.List(nil) + if err != nil { + t.Errorf("TextMeasurementTypes.List returned error: %v", err) + } + + if !called { + t.Fatal("!called") + } + + for _, u := range want { + normalizeTime(&u.CreatedAt, &u.UpdatedAt, &u.DeletedAt) + } + + if !reflect.DeepEqual(text_measurement_type, want) { + t.Errorf("TextMeasurementTypes.List return %+v, want %+v", text_measurement_type, want) + } +} diff --git a/router/api.go b/router/api.go index 70bc4e8..5024dd7 100644 --- a/router/api.go +++ b/router/api.go @@ -46,6 +46,7 @@ func API() *mux.Router { m.Path("/observations/{Id:.+}").Methods("DELETE").Name(DeleteObservation) // TextMeasurementTypes + m.Path("/text_measurement_types/").Methods("GET").Name(TextMeasurementTypes) m.Path("/text_measurement_types/").Methods("POST").Name(CreateTextMeasurementType) m.Path("/text_measurement_types/{Id:.+}").Methods("GET").Name(TextMeasurementType) diff --git a/router/routes.go b/router/routes.go index b46e8db..3b72596 100644 --- a/router/routes.go +++ b/router/routes.go @@ -37,4 +37,5 @@ const ( TextMeasurementType = "text_measurement_type:get" CreateTextMeasurementType = "text_measurement_type:create" + TextMeasurementTypes = "text_measurement_type:list" )