From 09dba7d63edb0b34e62bf264077a66ef365638c9 Mon Sep 17 00:00:00 2001 From: Unknown Date: Thu, 8 May 2014 22:12:05 -0400 Subject: [PATCH] Clean names --- modules/auth/admin.go | 2 +- modules/auth/apiv1/miscellaneous.go | 4 +- modules/auth/auth.go | 8 +- modules/auth/authentication.go | 2 +- modules/auth/issue.go | 2 +- modules/auth/release.go | 2 +- modules/auth/repo.go | 8 +- modules/auth/setting.go | 2 +- modules/auth/user.go | 4 +- modules/middleware/binding/binding.go | 26 +- modules/middleware/binding/binding_test.go | 701 --------------------- 11 files changed, 30 insertions(+), 731 deletions(-) delete mode 100644 modules/middleware/binding/binding_test.go diff --git a/modules/auth/admin.go b/modules/auth/admin.go index 02a4dc489..668afd9a3 100644 --- a/modules/auth/admin.go +++ b/modules/auth/admin.go @@ -34,7 +34,7 @@ func (f *AdminEditUserForm) Name(field string) string { return names[field] } -func (f *AdminEditUserForm) Validate(errors *binding.BindingErrors, req *http.Request, context martini.Context) { +func (f *AdminEditUserForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) { data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) validate(errors, data, f) } diff --git a/modules/auth/apiv1/miscellaneous.go b/modules/auth/apiv1/miscellaneous.go index 4d0d25659..726a08014 100644 --- a/modules/auth/apiv1/miscellaneous.go +++ b/modules/auth/apiv1/miscellaneous.go @@ -22,12 +22,12 @@ type MarkdownForm struct { Context string `form:"context"` } -func (f *MarkdownForm) Validate(errs *binding.BindingErrors, req *http.Request, ctx martini.Context) { +func (f *MarkdownForm) Validate(errs *binding.Errors, req *http.Request, ctx martini.Context) { data := ctx.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) validateApiReq(errs, data, f) } -func validateApiReq(errs *binding.BindingErrors, data base.TmplData, f interface{}) { +func validateApiReq(errs *binding.Errors, data base.TmplData, f interface{}) { if errs.Count() == 0 { return } else if len(errs.Overall) > 0 { diff --git a/modules/auth/auth.go b/modules/auth/auth.go index a7b281e4c..4587b3835 100644 --- a/modules/auth/auth.go +++ b/modules/auth/auth.go @@ -39,7 +39,7 @@ func (f *RegisterForm) Name(field string) string { return names[field] } -func (f *RegisterForm) Validate(errs *binding.BindingErrors, req *http.Request, ctx martini.Context) { +func (f *RegisterForm) Validate(errs *binding.Errors, req *http.Request, ctx martini.Context) { data := ctx.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) validate(errs, data, f) } @@ -58,7 +58,7 @@ func (f *LogInForm) Name(field string) string { return names[field] } -func (f *LogInForm) Validate(errs *binding.BindingErrors, req *http.Request, ctx martini.Context) { +func (f *LogInForm) Validate(errs *binding.Errors, req *http.Request, ctx martini.Context) { data := ctx.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) validate(errs, data, f) } @@ -72,7 +72,7 @@ func GetMinMaxSize(field reflect.StructField) string { return "" } -func validate(errs *binding.BindingErrors, data base.TmplData, f Form) { +func validate(errs *binding.Errors, data base.TmplData, f Form) { if errs.Count() == 0 { return } else if len(errs.Overall) > 0 { @@ -182,7 +182,7 @@ func (f *InstallForm) Name(field string) string { return names[field] } -func (f *InstallForm) Validate(errors *binding.BindingErrors, req *http.Request, context martini.Context) { +func (f *InstallForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) { data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) validate(errors, data, f) } diff --git a/modules/auth/authentication.go b/modules/auth/authentication.go index 51a9469cb..1a5fdcb05 100644 --- a/modules/auth/authentication.go +++ b/modules/auth/authentication.go @@ -42,7 +42,7 @@ func (f *AuthenticationForm) Name(field string) string { return names[field] } -func (f *AuthenticationForm) Validate(errors *binding.BindingErrors, req *http.Request, context martini.Context) { +func (f *AuthenticationForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) { data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) validate(errors, data, f) } diff --git a/modules/auth/issue.go b/modules/auth/issue.go index e8f8ac201..f3cad520c 100644 --- a/modules/auth/issue.go +++ b/modules/auth/issue.go @@ -29,7 +29,7 @@ func (f *CreateIssueForm) Name(field string) string { return names[field] } -func (f *CreateIssueForm) Validate(errors *binding.BindingErrors, req *http.Request, context martini.Context) { +func (f *CreateIssueForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) { data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) validate(errors, data, f) } diff --git a/modules/auth/release.go b/modules/auth/release.go index 7774b914a..7fadb3c08 100644 --- a/modules/auth/release.go +++ b/modules/auth/release.go @@ -30,7 +30,7 @@ func (f *NewReleaseForm) Name(field string) string { return names[field] } -func (f *NewReleaseForm) Validate(errors *binding.BindingErrors, req *http.Request, context martini.Context) { +func (f *NewReleaseForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) { data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) validate(errors, data, f) } diff --git a/modules/auth/repo.go b/modules/auth/repo.go index 37b9f1d1e..f880cdf5d 100644 --- a/modules/auth/repo.go +++ b/modules/auth/repo.go @@ -31,7 +31,7 @@ func (f *CreateRepoForm) Name(field string) string { return names[field] } -func (f *CreateRepoForm) Validate(errors *binding.BindingErrors, req *http.Request, context martini.Context) { +func (f *CreateRepoForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) { data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) validate(errors, data, f) } @@ -55,7 +55,7 @@ func (f *MigrateRepoForm) Name(field string) string { return names[field] } -func (f *MigrateRepoForm) Validate(errors *binding.BindingErrors, req *http.Request, context martini.Context) { +func (f *MigrateRepoForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) { data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) validate(errors, data, f) } @@ -79,7 +79,7 @@ func (f *RepoSettingForm) Name(field string) string { return names[field] } -func (f *RepoSettingForm) Validate(errors *binding.BindingErrors, req *http.Request, context martini.Context) { +func (f *RepoSettingForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) { data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) validate(errors, data, f) } @@ -100,7 +100,7 @@ func (f *NewWebhookForm) Name(field string) string { return names[field] } -func (f *NewWebhookForm) Validate(errors *binding.BindingErrors, req *http.Request, context martini.Context) { +func (f *NewWebhookForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) { data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) validate(errors, data, f) } diff --git a/modules/auth/setting.go b/modules/auth/setting.go index 7bae2451f..b828c92b5 100644 --- a/modules/auth/setting.go +++ b/modules/auth/setting.go @@ -27,7 +27,7 @@ func (f *AddSSHKeyForm) Name(field string) string { return names[field] } -func (f *AddSSHKeyForm) Validate(errors *binding.BindingErrors, req *http.Request, context martini.Context) { +func (f *AddSSHKeyForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) { data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) validate(errors, data, f) } diff --git a/modules/auth/user.go b/modules/auth/user.go index bc3216fe3..e672a9c10 100644 --- a/modules/auth/user.go +++ b/modules/auth/user.go @@ -94,7 +94,7 @@ func (f *UpdateProfileForm) Name(field string) string { return names[field] } -func (f *UpdateProfileForm) Validate(errs *binding.BindingErrors, req *http.Request, ctx martini.Context) { +func (f *UpdateProfileForm) Validate(errs *binding.Errors, req *http.Request, ctx martini.Context) { data := ctx.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) validate(errs, data, f) } @@ -114,7 +114,7 @@ func (f *UpdatePasswdForm) Name(field string) string { return names[field] } -func (f *UpdatePasswdForm) Validate(errs *binding.BindingErrors, req *http.Request, ctx martini.Context) { +func (f *UpdatePasswdForm) Validate(errs *binding.Errors, req *http.Request, ctx martini.Context) { data := ctx.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) validate(errs, data, f) } diff --git a/modules/middleware/binding/binding.go b/modules/middleware/binding/binding.go index 93fb51d99..bf8ab52b2 100644 --- a/modules/middleware/binding/binding.go +++ b/modules/middleware/binding/binding.go @@ -184,7 +184,7 @@ var ( urlPattern = regexp.MustCompile(`(http|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?`) ) -func validateStruct(errors *BindingErrors, obj interface{}) { +func validateStruct(errors *Errors, obj interface{}) { typ := reflect.TypeOf(obj) val := reflect.ValueOf(obj) @@ -279,7 +279,7 @@ func validateStruct(errors *BindingErrors, obj interface{}) { } } -func mapForm(formStruct reflect.Value, form map[string][]string, errors *BindingErrors) { +func mapForm(formStruct reflect.Value, form map[string][]string, errors *Errors) { typ := formStruct.Elem().Type() for i := 0; i < typ.NumField(); i++ { @@ -320,7 +320,7 @@ func mapForm(formStruct reflect.Value, form map[string][]string, errors *Binding // This is a "default" handler, of sorts, and you are // welcome to use your own instead. The Bind middleware // invokes this automatically for convenience. -func ErrorHandler(errs BindingErrors, resp http.ResponseWriter) { +func ErrorHandler(errs Errors, resp http.ResponseWriter) { if errs.Count() > 0 { resp.Header().Set("Content-Type", "application/json; charset=utf-8") if _, ok := errs.Overall[BindingDeserializationError]; ok { @@ -338,7 +338,7 @@ func ErrorHandler(errs BindingErrors, resp http.ResponseWriter) { // matching value from the request (via Form middleware) in the // same type, so that not all deserialized values have to be strings. // Supported types are string, int, float, and bool. -func setWithProperType(valueKind reflect.Kind, val string, structField reflect.Value, nameInTag string, errors *BindingErrors) { +func setWithProperType(valueKind reflect.Kind, val string, structField reflect.Value, nameInTag string, errors *Errors) { switch valueKind { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: if val == "" { @@ -399,7 +399,7 @@ func ensureNotPointer(obj interface{}) { // Performs validation and combines errors from validation // with errors from deserialization, then maps both the // resulting struct and the errors to the context. -func validateAndMap(obj reflect.Value, context martini.Context, errors *BindingErrors, ifacePtr ...interface{}) { +func validateAndMap(obj reflect.Value, context martini.Context, errors *Errors, ifacePtr ...interface{}) { context.Invoke(Validate(obj.Interface())) errors.Combine(getErrors(context)) context.Map(*errors) @@ -409,12 +409,12 @@ func validateAndMap(obj reflect.Value, context martini.Context, errors *BindingE } } -func newErrors() *BindingErrors { - return &BindingErrors{make(map[string]string), make(map[string]string)} +func newErrors() *Errors { + return &Errors{make(map[string]string), make(map[string]string)} } -func getErrors(context martini.Context) BindingErrors { - return context.Get(reflect.TypeOf(BindingErrors{})).Interface().(BindingErrors) +func getErrors(context martini.Context) Errors { + return context.Get(reflect.TypeOf(Errors{})).Interface().(Errors) } type ( @@ -422,7 +422,7 @@ type ( // validation before the request even gets to your application. // The Validate method will be executed during the validation phase. Validator interface { - Validate(*BindingErrors, *http.Request, martini.Context) + Validate(*Errors, *http.Request, martini.Context) } ) @@ -434,18 +434,18 @@ var ( // Errors represents the contract of the response body when the // binding step fails before getting to the application. -type BindingErrors struct { +type Errors struct { Overall map[string]string `json:"overall"` Fields map[string]string `json:"fields"` } // Total errors is the sum of errors with the request overall // and errors on individual fields. -func (err BindingErrors) Count() int { +func (err Errors) Count() int { return len(err.Overall) + len(err.Fields) } -func (this *BindingErrors) Combine(other BindingErrors) { +func (this *Errors) Combine(other Errors) { for key, val := range other.Fields { if _, exists := this.Fields[key]; !exists { this.Fields[key] = val diff --git a/modules/middleware/binding/binding_test.go b/modules/middleware/binding/binding_test.go deleted file mode 100644 index 65fca00ca..000000000 --- a/modules/middleware/binding/binding_test.go +++ /dev/null @@ -1,701 +0,0 @@ -// Copyright 2013 The Martini Contrib Authors. All rights reserved. -// Copyright 2014 The Gogs Authors. All rights reserved. -// Use of this source code is governed by a MIT-style -// license that can be found in the LICENSE file. - -package binding - -import ( - "bytes" - "mime/multipart" - "net/http" - "net/http/httptest" - "strconv" - "strings" - "testing" - - "github.com/go-martini/martini" -) - -func TestBind(t *testing.T) { - testBind(t, false) -} - -func TestBindWithInterface(t *testing.T) { - testBind(t, true) -} - -func TestMultipartBind(t *testing.T) { - index := 0 - for test, expectStatus := range bindMultipartTests { - handler := func(post BlogPost, errors Errors) { - handle(test, t, index, post, errors) - } - recorder := testMultipart(t, test, Bind(BlogPost{}), handler, index) - - if recorder.Code != expectStatus { - t.Errorf("On test case %v, got status code %d but expected %d", test, recorder.Code, expectStatus) - } - - index++ - } -} - -func TestForm(t *testing.T) { - testForm(t, false) -} - -func TestFormWithInterface(t *testing.T) { - testForm(t, true) -} - -func TestEmptyForm(t *testing.T) { - testEmptyForm(t) -} - -func TestMultipartForm(t *testing.T) { - for index, test := range multipartformTests { - handler := func(post BlogPost, errors Errors) { - handle(test, t, index, post, errors) - } - testMultipart(t, test, MultipartForm(BlogPost{}), handler, index) - } -} - -func TestMultipartFormWithInterface(t *testing.T) { - for index, test := range multipartformTests { - handler := func(post Modeler, errors Errors) { - post.Create(test, t, index) - } - testMultipart(t, test, MultipartForm(BlogPost{}, (*Modeler)(nil)), handler, index) - } -} - -func TestJson(t *testing.T) { - testJson(t, false) -} - -func TestJsonWithInterface(t *testing.T) { - testJson(t, true) -} - -func TestEmptyJson(t *testing.T) { - testEmptyJson(t) -} - -func TestValidate(t *testing.T) { - handlerMustErr := func(errors Errors) { - if errors.Count() == 0 { - t.Error("Expected at least one error, got 0") - } - } - handlerNoErr := func(errors Errors) { - if errors.Count() > 0 { - t.Error("Expected no errors, got", errors.Count()) - } - } - - performValidationTest(&BlogPost{"", "...", 0, 0, []int{}}, handlerMustErr, t) - performValidationTest(&BlogPost{"Good Title", "Good content", 0, 0, []int{}}, handlerNoErr, t) - - performValidationTest(&User{Name: "Jim", Home: Address{"", ""}}, handlerMustErr, t) - performValidationTest(&User{Name: "Jim", Home: Address{"required", ""}}, handlerNoErr, t) -} - -func handle(test testCase, t *testing.T, index int, post BlogPost, errors Errors) { - assertEqualField(t, "Title", index, test.ref.Title, post.Title) - assertEqualField(t, "Content", index, test.ref.Content, post.Content) - assertEqualField(t, "Views", index, test.ref.Views, post.Views) - - for i := range test.ref.Multiple { - if i >= len(post.Multiple) { - t.Errorf("Expected: %v (size %d) to have same size as: %v (size %d)", post.Multiple, len(post.Multiple), test.ref.Multiple, len(test.ref.Multiple)) - break - } - if test.ref.Multiple[i] != post.Multiple[i] { - t.Errorf("Expected: %v to deep equal: %v", post.Multiple, test.ref.Multiple) - break - } - } - - if test.ok && errors.Count() > 0 { - t.Errorf("%+v should be OK (0 errors), but had errors: %+v", test, errors) - } else if !test.ok && errors.Count() == 0 { - t.Errorf("%+v should have errors, but was OK (0 errors)", test) - } -} - -func handleEmpty(test emptyPayloadTestCase, t *testing.T, index int, section BlogSection, errors Errors) { - assertEqualField(t, "Title", index, test.ref.Title, section.Title) - assertEqualField(t, "Content", index, test.ref.Content, section.Content) - - if test.ok && errors.Count() > 0 { - t.Errorf("%+v should be OK (0 errors), but had errors: %+v", test, errors) - } else if !test.ok && errors.Count() == 0 { - t.Errorf("%+v should have errors, but was OK (0 errors)", test) - } -} - -func testBind(t *testing.T, withInterface bool) { - index := 0 - for test, expectStatus := range bindTests { - m := martini.Classic() - recorder := httptest.NewRecorder() - handler := func(post BlogPost, errors Errors) { handle(test, t, index, post, errors) } - binding := Bind(BlogPost{}) - - if withInterface { - handler = func(post BlogPost, errors Errors) { - post.Create(test, t, index) - } - binding = Bind(BlogPost{}, (*Modeler)(nil)) - } - - switch test.method { - case "GET": - m.Get(route, binding, handler) - case "POST": - m.Post(route, binding, handler) - } - - req, err := http.NewRequest(test.method, test.path, strings.NewReader(test.payload)) - req.Header.Add("Content-Type", test.contentType) - - if err != nil { - t.Error(err) - } - m.ServeHTTP(recorder, req) - - if recorder.Code != expectStatus { - t.Errorf("On test case %v, got status code %d but expected %d", test, recorder.Code, expectStatus) - } - - index++ - } -} - -func testJson(t *testing.T, withInterface bool) { - for index, test := range jsonTests { - recorder := httptest.NewRecorder() - handler := func(post BlogPost, errors Errors) { handle(test, t, index, post, errors) } - binding := Json(BlogPost{}) - - if withInterface { - handler = func(post BlogPost, errors Errors) { - post.Create(test, t, index) - } - binding = Bind(BlogPost{}, (*Modeler)(nil)) - } - - m := martini.Classic() - switch test.method { - case "GET": - m.Get(route, binding, handler) - case "POST": - m.Post(route, binding, handler) - case "PUT": - m.Put(route, binding, handler) - case "DELETE": - m.Delete(route, binding, handler) - } - - req, err := http.NewRequest(test.method, route, strings.NewReader(test.payload)) - if err != nil { - t.Error(err) - } - m.ServeHTTP(recorder, req) - } -} - -func testEmptyJson(t *testing.T) { - for index, test := range emptyPayloadTests { - recorder := httptest.NewRecorder() - handler := func(section BlogSection, errors Errors) { handleEmpty(test, t, index, section, errors) } - binding := Json(BlogSection{}) - - m := martini.Classic() - switch test.method { - case "GET": - m.Get(route, binding, handler) - case "POST": - m.Post(route, binding, handler) - case "PUT": - m.Put(route, binding, handler) - case "DELETE": - m.Delete(route, binding, handler) - } - - req, err := http.NewRequest(test.method, route, strings.NewReader(test.payload)) - if err != nil { - t.Error(err) - } - m.ServeHTTP(recorder, req) - } -} - -func testForm(t *testing.T, withInterface bool) { - for index, test := range formTests { - recorder := httptest.NewRecorder() - handler := func(post BlogPost, errors Errors) { handle(test, t, index, post, errors) } - binding := Form(BlogPost{}) - - if withInterface { - handler = func(post BlogPost, errors Errors) { - post.Create(test, t, index) - } - binding = Form(BlogPost{}, (*Modeler)(nil)) - } - - m := martini.Classic() - switch test.method { - case "GET": - m.Get(route, binding, handler) - case "POST": - m.Post(route, binding, handler) - } - - req, err := http.NewRequest(test.method, test.path, nil) - if err != nil { - t.Error(err) - } - m.ServeHTTP(recorder, req) - } -} - -func testEmptyForm(t *testing.T) { - for index, test := range emptyPayloadTests { - recorder := httptest.NewRecorder() - handler := func(section BlogSection, errors Errors) { handleEmpty(test, t, index, section, errors) } - binding := Form(BlogSection{}) - - m := martini.Classic() - switch test.method { - case "GET": - m.Get(route, binding, handler) - case "POST": - m.Post(route, binding, handler) - } - - req, err := http.NewRequest(test.method, test.path, nil) - if err != nil { - t.Error(err) - } - m.ServeHTTP(recorder, req) - } -} - -func testMultipart(t *testing.T, test testCase, middleware martini.Handler, handler martini.Handler, index int) *httptest.ResponseRecorder { - recorder := httptest.NewRecorder() - - m := martini.Classic() - m.Post(route, middleware, handler) - - body := &bytes.Buffer{} - writer := multipart.NewWriter(body) - writer.WriteField("title", test.ref.Title) - writer.WriteField("content", test.ref.Content) - writer.WriteField("views", strconv.Itoa(test.ref.Views)) - if len(test.ref.Multiple) != 0 { - for _, value := range test.ref.Multiple { - writer.WriteField("multiple", strconv.Itoa(value)) - } - } - - req, err := http.NewRequest(test.method, test.path, body) - req.Header.Add("Content-Type", writer.FormDataContentType()) - - if err != nil { - t.Error(err) - } - - err = writer.Close() - if err != nil { - t.Error(err) - } - - m.ServeHTTP(recorder, req) - - return recorder -} - -func assertEqualField(t *testing.T, fieldname string, testcasenumber int, expected interface{}, got interface{}) { - if expected != got { - t.Errorf("%s: expected=%s, got=%s in test case %d\n", fieldname, expected, got, testcasenumber) - } -} - -func performValidationTest(data interface{}, handler func(Errors), t *testing.T) { - recorder := httptest.NewRecorder() - m := martini.Classic() - m.Get(route, Validate(data), handler) - - req, err := http.NewRequest("GET", route, nil) - if err != nil { - t.Error("HTTP error:", err) - } - - m.ServeHTTP(recorder, req) -} - -func (self BlogPost) Validate(errors *Errors, req *http.Request) { - if len(self.Title) < 4 { - errors.Fields["Title"] = "Too short; minimum 4 characters" - } - if len(self.Content) > 1024 { - errors.Fields["Content"] = "Too long; maximum 1024 characters" - } - if len(self.Content) < 5 { - errors.Fields["Content"] = "Too short; minimum 5 characters" - } -} - -func (self BlogPost) Create(test testCase, t *testing.T, index int) { - assertEqualField(t, "Title", index, test.ref.Title, self.Title) - assertEqualField(t, "Content", index, test.ref.Content, self.Content) - assertEqualField(t, "Views", index, test.ref.Views, self.Views) - - for i := range test.ref.Multiple { - if i >= len(self.Multiple) { - t.Errorf("Expected: %v (size %d) to have same size as: %v (size %d)", self.Multiple, len(self.Multiple), test.ref.Multiple, len(test.ref.Multiple)) - break - } - if test.ref.Multiple[i] != self.Multiple[i] { - t.Errorf("Expected: %v to deep equal: %v", self.Multiple, test.ref.Multiple) - break - } - } -} - -func (self BlogSection) Create(test emptyPayloadTestCase, t *testing.T, index int) { - // intentionally left empty -} - -type ( - testCase struct { - method string - path string - payload string - contentType string - ok bool - ref *BlogPost - } - - emptyPayloadTestCase struct { - method string - path string - payload string - contentType string - ok bool - ref *BlogSection - } - - Modeler interface { - Create(test testCase, t *testing.T, index int) - } - - BlogPost struct { - Title string `form:"title" json:"title" binding:"required"` - Content string `form:"content" json:"content"` - Views int `form:"views" json:"views"` - internal int `form:"-"` - Multiple []int `form:"multiple"` - } - - BlogSection struct { - Title string `form:"title" json:"title"` - Content string `form:"content" json:"content"` - } - - User struct { - Name string `json:"name" binding:"required"` - Home Address `json:"address" binding:"required"` - } - - Address struct { - Street1 string `json:"street1" binding:"required"` - Street2 string `json:"street2"` - } -) - -var ( - bindTests = map[testCase]int{ - // These should bail at the deserialization/binding phase - testCase{ - "POST", - path, - `{ bad JSON `, - "application/json", - false, - new(BlogPost), - }: http.StatusBadRequest, - testCase{ - "POST", - path, - `not multipart but has content-type`, - "multipart/form-data", - false, - new(BlogPost), - }: http.StatusBadRequest, - testCase{ - "POST", - path, - `no content-type and not URL-encoded or JSON"`, - "", - false, - new(BlogPost), - }: http.StatusBadRequest, - - // These should deserialize, then bail at the validation phase - testCase{ - "POST", - path + "?title= This is wrong ", - `not URL-encoded but has content-type`, - "x-www-form-urlencoded", - false, - new(BlogPost), - }: 422, // according to comments in Form() -> although the request is not url encoded, ParseForm does not complain - testCase{ - "GET", - path + "?content=This+is+the+content", - ``, - "x-www-form-urlencoded", - false, - &BlogPost{Title: "", Content: "This is the content"}, - }: 422, - testCase{ - "GET", - path + "", - `{"content":"", "title":"Blog Post Title"}`, - "application/json", - false, - &BlogPost{Title: "Blog Post Title", Content: ""}, - }: 422, - - // These should succeed - testCase{ - "GET", - path + "", - `{"content":"This is the content", "title":"Blog Post Title"}`, - "application/json", - true, - &BlogPost{Title: "Blog Post Title", Content: "This is the content"}, - }: http.StatusOK, - testCase{ - "GET", - path + "?content=This+is+the+content&title=Blog+Post+Title", - ``, - "", - true, - &BlogPost{Title: "Blog Post Title", Content: "This is the content"}, - }: http.StatusOK, - testCase{ - "GET", - path + "?content=This is the content&title=Blog+Post+Title", - `{"content":"This is the content", "title":"Blog Post Title"}`, - "", - true, - &BlogPost{Title: "Blog Post Title", Content: "This is the content"}, - }: http.StatusOK, - testCase{ - "GET", - path + "", - `{"content":"This is the content", "title":"Blog Post Title"}`, - "", - true, - &BlogPost{Title: "Blog Post Title", Content: "This is the content"}, - }: http.StatusOK, - } - - bindMultipartTests = map[testCase]int{ - // This should deserialize, then bail at the validation phase - testCase{ - "POST", - path, - "", - "multipart/form-data", - false, - &BlogPost{Title: "", Content: "This is the content"}, - }: 422, - // This should succeed - testCase{ - "POST", - path, - "", - "multipart/form-data", - true, - &BlogPost{Title: "This is the Title", Content: "This is the content"}, - }: http.StatusOK, - } - - formTests = []testCase{ - { - "GET", - path + "?content=This is the content", - "", - "", - false, - &BlogPost{Title: "", Content: "This is the content"}, - }, - { - "POST", - path + "?content=This+is+the+content&title=Blog+Post+Title&views=3", - "", - "", - false, // false because POST requests should have a body, not just a query string - &BlogPost{Title: "Blog Post Title", Content: "This is the content", Views: 3}, - }, - { - "GET", - path + "?content=This+is+the+content&title=Blog+Post+Title&views=3&multiple=5&multiple=10&multiple=15&multiple=20", - "", - "", - true, - &BlogPost{Title: "Blog Post Title", Content: "This is the content", Views: 3, Multiple: []int{5, 10, 15, 20}}, - }, - } - - multipartformTests = []testCase{ - { - "POST", - path, - "", - "multipart/form-data", - false, - &BlogPost{Title: "", Content: "This is the content"}, - }, - { - "POST", - path, - "", - "multipart/form-data", - false, - &BlogPost{Title: "Blog Post Title", Views: 3}, - }, - { - "POST", - path, - "", - "multipart/form-data", - true, - &BlogPost{Title: "Blog Post Title", Content: "This is the content", Views: 3, Multiple: []int{5, 10, 15, 20}}, - }, - } - - emptyPayloadTests = []emptyPayloadTestCase{ - { - "GET", - "", - "", - "", - true, - &BlogSection{}, - }, - { - "POST", - "", - "", - "", - true, - &BlogSection{}, - }, - { - "PUT", - "", - "", - "", - true, - &BlogSection{}, - }, - { - "DELETE", - "", - "", - "", - true, - &BlogSection{}, - }, - } - - jsonTests = []testCase{ - // bad requests - { - "GET", - "", - `{blah blah blah}`, - "", - false, - &BlogPost{}, - }, - { - "POST", - "", - `{asdf}`, - "", - false, - &BlogPost{}, - }, - { - "PUT", - "", - `{blah blah blah}`, - "", - false, - &BlogPost{}, - }, - { - "DELETE", - "", - `{;sdf _SDf- }`, - "", - false, - &BlogPost{}, - }, - - // Valid-JSON requests - { - "GET", - "", - `{"content":"This is the content"}`, - "", - false, - &BlogPost{Title: "", Content: "This is the content"}, - }, - { - "POST", - "", - `{}`, - "application/json", - false, - &BlogPost{Title: "", Content: ""}, - }, - { - "POST", - "", - `{"content":"This is the content", "title":"Blog Post Title"}`, - "", - true, - &BlogPost{Title: "Blog Post Title", Content: "This is the content"}, - }, - { - "PUT", - "", - `{"content":"This is the content", "title":"Blog Post Title"}`, - "", - true, - &BlogPost{Title: "Blog Post Title", Content: "This is the content"}, - }, - { - "DELETE", - "", - `{"content":"This is the content", "title":"Blog Post Title"}`, - "", - true, - &BlogPost{Title: "Blog Post Title", Content: "This is the content"}, - }, - } -) - -const ( - route = "/blogposts/create" - path = "http://localhost:3000" + route -)