Genera: api.
This commit is contained in:
		
							parent
							
								
									533adbdd09
								
							
						
					
					
						commit
						59a0cfd4bf
					
				
					 4 changed files with 160 additions and 3 deletions
				
			
		
							
								
								
									
										61
									
								
								api/genera.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								api/genera.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -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) | ||||||
|  | } | ||||||
							
								
								
									
										90
									
								
								api/genera_test.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								api/genera_test.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -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) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -18,9 +18,15 @@ var ( | ||||||
| 
 | 
 | ||||||
| func Handler() *mux.Router { | func Handler() *mux.Router { | ||||||
| 	m := router.API() | 	m := router.API() | ||||||
|  | 
 | ||||||
| 	m.Get(router.User).Handler(handler(serveUser)) | 	m.Get(router.User).Handler(handler(serveUser)) | ||||||
| 	m.Get(router.CreateUser).Handler(handler(serveCreateUser)) | 	m.Get(router.CreateUser).Handler(handler(serveCreateUser)) | ||||||
| 	m.Get(router.Users).Handler(handler(serveUsers)) | 	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 | 	return m | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -5,9 +5,9 @@ CREATE TABLE genera ( | ||||||
|     id BIGSERIAL NOT NULL, |     id BIGSERIAL NOT NULL, | ||||||
|     genusname CHARACTER VARYING(100), |     genusname CHARACTER VARYING(100), | ||||||
| 
 | 
 | ||||||
|     created_at TIMESTAMP WITH TIME ZONE, |     createdat TIMESTAMP WITH TIME ZONE, | ||||||
|     updated_at TIMESTAMP WITH TIME ZONE, |     updatedat TIMESTAMP WITH TIME ZONE, | ||||||
|     deleted_at TIMESTAMP WITH TIME ZONE, |     deletedat TIMESTAMP WITH TIME ZONE, | ||||||
| 
 | 
 | ||||||
|     CONSTRAINT genus_pkey PRIMARY KEY (id) |     CONSTRAINT genus_pkey PRIMARY KEY (id) | ||||||
| ); | ); | ||||||
|  |  | ||||||
		Reference in a new issue
	
	 Matthew Dillon
						Matthew Dillon