|
@@ -0,0 +1,61 @@
|
|
|
|
+package rest
|
|
|
|
+
|
|
|
|
+import (
|
|
|
|
+ "errors"
|
|
|
|
+ "net/http"
|
|
|
|
+ "net/http/httptest"
|
|
|
|
+ "strings"
|
|
|
|
+ "testing"
|
|
|
|
+)
|
|
|
|
+
|
|
|
|
+func TestReadRequestJSON(t *testing.T) {
|
|
|
|
+ type TestInput struct {
|
|
|
|
+ Title string `json:"title"`
|
|
|
|
+ Serves int `json:"serves"`
|
|
|
|
+ Author string `json:"author,omitempty"`
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ type TestCase struct {
|
|
|
|
+ Req *http.Request
|
|
|
|
+ Input TestInput
|
|
|
|
+ Err error
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ testCases := []TestCase{
|
|
|
|
+ {
|
|
|
|
+ Req: httptest.NewRequest("POST", "/recipes", nil),
|
|
|
|
+ Err: errors.New("unexpected end of JSON input"),
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ Req: httptest.NewRequest("POST", "/recipes", strings.NewReader(`{"title":"Gnocchi","serves":2}`)),
|
|
|
|
+ Input: TestInput{Title: "Gnocchi", Serves: 2},
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ Req: httptest.NewRequest("POST", "/recipes", strings.NewReader(`{"title":"Spaghetti","serves":4,"author":"Mom"}`)),
|
|
|
|
+ Input: TestInput{Title: "Spaghetti", Serves: 4, Author: "Mom"},
|
|
|
|
+ },
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for i, tc := range testCases {
|
|
|
|
+ t.Logf("(%d) Testing request body against %+v", i, tc.Input)
|
|
|
|
+
|
|
|
|
+ input := TestInput{}
|
|
|
|
+ err := ReadRequestJSON(tc.Req, &input)
|
|
|
|
+
|
|
|
|
+ if err != nil {
|
|
|
|
+ if tc.Err != nil {
|
|
|
|
+ // Compare error strings, as json.SyntaxError isn't directly comparable
|
|
|
|
+ if err.Error() != tc.Err.Error() {
|
|
|
|
+ t.Errorf("Expected error %v, got %v", tc.Err, err)
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ t.Errorf("Expected error %v, got %v", tc.Err, err)
|
|
|
|
+ }
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if input != tc.Input {
|
|
|
|
+ t.Errorf("Expected %v, got %v", tc.Input, input)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|