diff --git a/server/response_test.go b/server/response_test.go new file mode 100644 index 0000000..df8a94f --- /dev/null +++ b/server/response_test.go @@ -0,0 +1,75 @@ +package server + +import ( + "encoding/json" + "errors" + "net/http" + "net/http/httptest" + "testing" + + "gopkg.in/mgo.v2/bson" +) + +func TestResponse(t *testing.T) { + cases := map[string]struct { + foo func(*REST, http.ResponseWriter) + body string + status int + }{ + "OK": { + foo: func(rest *REST, w http.ResponseWriter) { + rest.respOK(w) + }, + body: `{"ok":true}`, + status: http.StatusOK, + }, + "not found": { + foo: func(rest *REST, w http.ResponseWriter) { + rest.respNotFound(w) + }, + body: `{"error":"not found"}`, + status: http.StatusNotFound, + }, + "conflict": { + foo: func(rest *REST, w http.ResponseWriter) { + rest.respConflict(w) + }, + body: `{"error":"collision found"}`, + status: http.StatusConflict, + }, + "error": { + foo: func(rest *REST, w http.ResponseWriter) { + rest.respError(w, errors.New("my err")) + }, + body: `{"error":"my err"}`, + status: http.StatusInternalServerError, + }, + "bad req": { + foo: func(rest *REST, w http.ResponseWriter) { + rest.respBadRequest(w, "bad dog") + }, + body: `{"error":"bad dog"}`, + status: http.StatusBadRequest, + }, + } + + for name, d := range cases { + c := d + t.Run(name, func(t *testing.T) { + rest := &REST{} + w := httptest.NewRecorder() + c.foo(rest, w) + if w.Code != c.status { + t.Fatalf("want status %d, got %d", c.status, w.Code) + } + var m bson.M + if err := json.NewDecoder(w.Body).Decode(&m); err != nil { + t.Fatal(err) + } + body, _ := json.Marshal(m) + if s := string(body); s != c.body { + t.Fatalf("want body %q, got %q", c.body, s) + } + }) + } +}