From 431ba7ed91cbbf94acf0470c5d2f0561047024c2 Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Fri, 28 Nov 2014 17:26:01 -0900 Subject: [PATCH] Delete a text measurement type --- api/handler.go | 1 + api/text_measurement_types.go | 14 ++++++++++ api/text_measurement_types_test.go | 27 ++++++++++++++++++ datastore/text_measurement_types.go | 16 +++++++++++ datastore/text_measurement_types_test.go | 19 +++++++++++++ models/text_measurement_types.go | 35 +++++++++++++++++++++++- models/text_measurement_types_test.go | 29 ++++++++++++++++++++ router/api.go | 1 + router/routes.go | 1 + 9 files changed, 142 insertions(+), 1 deletion(-) diff --git a/api/handler.go b/api/handler.go index 388cea9..20c2a83 100644 --- a/api/handler.go +++ b/api/handler.go @@ -57,6 +57,7 @@ func Handler() *mux.Router { m.Get(router.CreateTextMeasurementType).Handler(handler(serveCreateTextMeasurementType)) m.Get(router.TextMeasurementTypes).Handler(handler(serveTextMeasurementTypeList)) m.Get(router.UpdateTextMeasurementType).Handler(handler(serveUpdateTextMeasurementType)) + m.Get(router.DeleteTextMeasurementType).Handler(handler(serveDeleteTextMeasurementType)) return m } diff --git a/api/text_measurement_types.go b/api/text_measurement_types.go index 587a0a4..08c5b37 100644 --- a/api/text_measurement_types.go +++ b/api/text_measurement_types.go @@ -76,3 +76,17 @@ func serveUpdateTextMeasurementType(w http.ResponseWriter, r *http.Request) erro return writeJSON(w, text_measurement_type) } + +func serveDeleteTextMeasurementType(w http.ResponseWriter, r *http.Request) error { + id, _ := strconv.ParseInt(mux.Vars(r)["Id"], 10, 0) + + deleted, err := store.TextMeasurementTypes.Delete(id) + if err != nil { + return err + } + if deleted { + w.WriteHeader(http.StatusOK) + } + + return writeJSON(w, &models.TextMeasurementType{}) +} diff --git a/api/text_measurement_types_test.go b/api/text_measurement_types_test.go index db6b148..ad1c726 100644 --- a/api/text_measurement_types_test.go +++ b/api/text_measurement_types_test.go @@ -124,3 +124,30 @@ func TestTextMeasurementType_Update(t *testing.T) { t.Error("!success") } } + +func TestTextMeasurementType_Delete(t *testing.T) { + setup() + + want := newTextMeasurementType() + + calledDelete := false + store.TextMeasurementTypes.(*models.MockTextMeasurementTypesService).Delete_ = func(id int64) (bool, error) { + if id != want.Id { + t.Errorf("wanted request for text_measurement_type %d but got %d", want.Id, id) + } + calledDelete = true + return true, nil + } + + success, err := apiClient.TextMeasurementTypes.Delete(want.Id) + if err != nil { + t.Fatal(err) + } + + if !calledDelete { + t.Error("!calledDelete") + } + if !success { + t.Error("!success") + } +} diff --git a/datastore/text_measurement_types.go b/datastore/text_measurement_types.go index f415ddb..f0cb79a 100644 --- a/datastore/text_measurement_types.go +++ b/datastore/text_measurement_types.go @@ -69,3 +69,19 @@ func (s *textMeasurementTypesStore) Update(id int64, text_measurement_type *mode return true, nil } + +func (s *textMeasurementTypesStore) Delete(id int64) (bool, error) { + text_measurement_type, err := s.Get(id) + if err != nil { + return false, err + } + + deleted, err := s.dbh.Delete(text_measurement_type) + if err != nil { + return false, err + } + if deleted == 0 { + return false, ErrNoRowsDeleted + } + return true, nil +} diff --git a/datastore/text_measurement_types_test.go b/datastore/text_measurement_types_test.go index b8112c0..713632b 100644 --- a/datastore/text_measurement_types_test.go +++ b/datastore/text_measurement_types_test.go @@ -105,3 +105,22 @@ func TestTextMeasurementTypesStore_Update_db(t *testing.T) { t.Error("!updated") } } + +func TestTextMeasurementTypesStore_Delete_db(t *testing.T) { + tx, _ := DB.Begin() + defer tx.Rollback() + + text_measurement_type := insertTextMeasurementType(t, tx) + + d := NewDatastore(tx) + + // Delete it + deleted, err := d.TextMeasurementTypes.Delete(text_measurement_type.Id) + if err != nil { + t.Fatal(err) + } + + if !deleted { + t.Error("!delete") + } +} diff --git a/models/text_measurement_types.go b/models/text_measurement_types.go index a56c32b..05fdf43 100644 --- a/models/text_measurement_types.go +++ b/models/text_measurement_types.go @@ -35,8 +35,11 @@ type TextMeasurementTypesService interface { // Create a text measurement type Create(text_measurement_type *TextMeasurementType) (bool, error) - // Updated a text measurement type + // Update a text measurement type Update(id int64, TextMeasurementType *TextMeasurementType) (updated bool, err error) + + // Delete a text measurement type + Delete(id int64) (deleted bool, err error) } var ( @@ -133,11 +136,34 @@ func (s *textMeasurementTypesService) Update(id int64, text_measurement_type *Te return resp.StatusCode == http.StatusOK, nil } +func (s *textMeasurementTypesService) Delete(id int64) (bool, error) { + strId := strconv.FormatInt(id, 10) + + url, err := s.client.url(router.DeleteTextMeasurementType, map[string]string{"Id": strId}, nil) + if err != nil { + return false, err + } + + req, err := s.client.NewRequest("DELETE", url.String(), nil) + if err != nil { + return false, err + } + + var text_measurement_type *TextMeasurementType + resp, err := s.client.Do(req, &text_measurement_type) + if err != nil { + return false, err + } + + return resp.StatusCode == http.StatusOK, nil +} + type MockTextMeasurementTypesService struct { Get_ func(id int64) (*TextMeasurementType, error) List_ func(opt *TextMeasurementTypeListOptions) ([]*TextMeasurementType, error) Create_ func(text_measurement_type *TextMeasurementType) (bool, error) Update_ func(id int64, text_measurement_type *TextMeasurementType) (bool, error) + Delete_ func(id int64) (bool, error) } var _ TextMeasurementTypesService = &MockTextMeasurementTypesService{} @@ -169,3 +195,10 @@ func (s *MockTextMeasurementTypesService) Update(id int64, text_measurement_type } return s.Update_(id, text_measurement_type) } + +func (s *MockTextMeasurementTypesService) Delete(id int64) (bool, error) { + if s.Delete_ == nil { + return false, nil + } + return s.Delete_(id) +} diff --git a/models/text_measurement_types_test.go b/models/text_measurement_types_test.go index 7db0b51..b77cfa2 100644 --- a/models/text_measurement_types_test.go +++ b/models/text_measurement_types_test.go @@ -143,3 +143,32 @@ func TestTextMeasurementTypeService_Update(t *testing.T) { t.Fatal("!called") } } + +func TestTextMeasurementTypeService_Delete(t *testing.T) { + setup() + defer teardown() + + want := newTextMeasurementType() + + var called bool + mux.HandleFunc(urlPath(t, router.DeleteTextMeasurementType, map[string]string{"Id": "1"}), func(w http.ResponseWriter, r *http.Request) { + called = true + testMethod(t, r, "DELETE") + + w.WriteHeader(http.StatusOK) + writeJSON(w, want) + }) + + deleted, err := client.TextMeasurementTypes.Delete(want.Id) + if err != nil { + t.Errorf("TextMeasurementTypes.Delete returned error: %v", err) + } + + if !deleted { + t.Error("!deleted") + } + + if !called { + t.Fatal("!called") + } +} diff --git a/router/api.go b/router/api.go index 3f8f5ac..0c6f439 100644 --- a/router/api.go +++ b/router/api.go @@ -50,6 +50,7 @@ func API() *mux.Router { m.Path("/text_measurement_types/").Methods("POST").Name(CreateTextMeasurementType) m.Path("/text_measurement_types/{Id:.+}").Methods("GET").Name(TextMeasurementType) m.Path("/text_measurement_types/{Id:.+}").Methods("PUT").Name(UpdateTextMeasurementType) + m.Path("/text_measurement_types/{Id:.+}").Methods("DELETE").Name(DeleteTextMeasurementType) return m } diff --git a/router/routes.go b/router/routes.go index ee03b09..63a693e 100644 --- a/router/routes.go +++ b/router/routes.go @@ -39,4 +39,5 @@ const ( CreateTextMeasurementType = "text_measurement_type:create" TextMeasurementTypes = "text_measurement_type:list" UpdateTextMeasurementType = "text_measurement_type:update" + DeleteTextMeasurementType = "text_measurement_type:delete" )