diff --git a/api/genera.go b/api/genera.go new file mode 100644 index 0000000..3abc161 --- /dev/null +++ b/api/genera.go @@ -0,0 +1,61 @@ +package api + +import ( + "encoding/json" + "strconv" + + "github.com/gorilla/mux" + + "net/http" + + "github.com/thermokarst/bactdb/models" +) + +func serveGenus(w http.ResponseWriter, r *http.Request) error { + id, err := strconv.ParseInt(mux.Vars(r)["Id"], 10, 0) + if err != nil { + return err + } + + genus, err := store.Genera.Get(id) + if err != nil { + return err + } + + return writeJSON(w, genus) +} + +func serveCreateGenus(w http.ResponseWriter, r *http.Request) error { + var genus models.Genus + err := json.NewDecoder(r.Body).Decode(&genus) + if err != nil { + return err + } + + created, err := store.Genera.Create(&genus) + if err != nil { + return err + } + if created { + w.WriteHeader(http.StatusCreated) + } + + return writeJSON(w, genus) +} + +func serveGenera(w http.ResponseWriter, r *http.Request) error { + var opt models.GenusListOptions + if err := schemaDecoder.Decode(&opt, r.URL.Query()); err != nil { + return err + } + + genera, err := store.Genera.List(&opt) + if err != nil { + return err + } + if genera == nil { + genera = []*models.Genus{} + } + + return writeJSON(w, genera) +} diff --git a/api/genera_test.go b/api/genera_test.go new file mode 100644 index 0000000..d2ab758 --- /dev/null +++ b/api/genera_test.go @@ -0,0 +1,90 @@ +package api + +import ( + "testing" + + "github.com/thermokarst/bactdb/models" +) + +func TestGenus_Get(t *testing.T) { + setup() + + want := &models.Genus{Id: 1, GenusName: "Test Genus"} + + calledGet := false + store.Genera.(*models.MockGeneraService).Get_ = func(id int64) (*models.Genus, error) { + if id != want.Id { + t.Errorf("wanted request for genus %d but got %d", want.Id, id) + } + calledGet = true + return want, nil + } + + got, err := apiClient.Genera.Get(want.Id) + if err != nil { + t.Fatal(err) + } + + if !calledGet { + t.Error("!calledGet") + } + if !normalizeDeepEqual(want, got) { + t.Errorf("got genus %+v but wanted genus %+v", got, want) + } +} + +func TestGenus_Create(t *testing.T) { + setup() + + want := &models.Genus{Id: 1, GenusName: "Test Genus"} + + calledPost := false + store.Genera.(*models.MockGeneraService).Create_ = func(genus *models.Genus) (bool, error) { + if !normalizeDeepEqual(want, genus) { + t.Errorf("wanted request for genus %d but got %d", want, genus) + } + calledPost = true + return true, nil + } + + success, err := apiClient.Genera.Create(want) + if err != nil { + t.Fatal(err) + } + + if !calledPost { + t.Error("!calledPost") + } + if !success { + t.Error("!success") + } +} + +func TestGenus_List(t *testing.T) { + setup() + + want := []*models.Genus{{Id: 1, GenusName: "Test Genus"}} + wantOpt := &models.GenusListOptions{ListOptions: models.ListOptions{Page: 1, PerPage: 10}} + + calledList := false + store.Genera.(*models.MockGeneraService).List_ = func(opt *models.GenusListOptions) ([]*models.Genus, error) { + if !normalizeDeepEqual(wantOpt, opt) { + t.Errorf("wanted options %d but got %d", wantOpt, opt) + } + calledList = true + return want, nil + } + + genera, err := apiClient.Genera.List(wantOpt) + if err != nil { + t.Fatal(err) + } + + if !calledList { + t.Error("!calledList") + } + + if !normalizeDeepEqual(&want, &genera) { + t.Errorf("got genera %+v but wanted genera %+v", genera, want) + } +} diff --git a/api/handler.go b/api/handler.go index 93dd042..59e1718 100644 --- a/api/handler.go +++ b/api/handler.go @@ -18,9 +18,15 @@ var ( func Handler() *mux.Router { m := router.API() + m.Get(router.User).Handler(handler(serveUser)) m.Get(router.CreateUser).Handler(handler(serveCreateUser)) m.Get(router.Users).Handler(handler(serveUsers)) + + m.Get(router.Genus).Handler(handler(serveGenus)) + m.Get(router.CreateGenus).Handler(handler(serveCreateGenus)) + m.Get(router.Genera).Handler(handler(serveGenera)) + return m } diff --git a/datastore/migrations/00002_AddGenera_up.sql b/datastore/migrations/00002_AddGenera_up.sql index a9e0f5c..3fa4d79 100644 --- a/datastore/migrations/00002_AddGenera_up.sql +++ b/datastore/migrations/00002_AddGenera_up.sql @@ -5,9 +5,9 @@ CREATE TABLE genera ( id BIGSERIAL NOT NULL, genusname CHARACTER VARYING(100), - created_at TIMESTAMP WITH TIME ZONE, - updated_at TIMESTAMP WITH TIME ZONE, - deleted_at TIMESTAMP WITH TIME ZONE, + createdat TIMESTAMP WITH TIME ZONE, + updatedat TIMESTAMP WITH TIME ZONE, + deletedat TIMESTAMP WITH TIME ZONE, CONSTRAINT genus_pkey PRIMARY KEY (id) );