Better unit tests for binding forms

This commit is contained in:
Manu Mtz-Almeida 2015-05-26 17:22:39 +02:00
parent ec1ce34d32
commit a843d320a5
1 changed files with 55 additions and 71 deletions

View File

@ -14,7 +14,6 @@ import (
"testing" "testing"
"time" "time"
"github.com/gin-gonic/gin/binding"
"github.com/manucorporat/sse" "github.com/manucorporat/sse"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
@ -34,24 +33,25 @@ func createTestContext() (c *Context, w *httptest.ResponseRecorder, r *Engine) {
return return
} }
func createMultipartForm() (body *bytes.Buffer, header string, err error) { func createMultipartRequest() *http.Request {
boundary := "--testboundary" boundary := "--testboundary"
header = MIMEMultipartPOSTForm + "; boundary=" + boundary body := new(bytes.Buffer)
body = &bytes.Buffer{}
mw := multipart.NewWriter(body) mw := multipart.NewWriter(body)
defer mw.Close() defer mw.Close()
if err = mw.SetBoundary(boundary); err != nil { must(mw.SetBoundary(boundary))
return must(mw.WriteField("foo", "bar"))
must(mw.WriteField("bar", "foo"))
req, err := http.NewRequest("POST", "/", body)
must(err)
req.Header.Set("Content-Type", MIMEMultipartPOSTForm+"; boundary="+boundary)
return req
}
func must(err error) {
if err != nil {
panic(err.Error())
} }
if err = mw.WriteField("foo", "bar"); err != nil {
return
}
if err = mw.WriteField("bar", "foo"); err != nil {
return
}
return
} }
func TestContextReset(t *testing.T) { func TestContextReset(t *testing.T) {
@ -135,7 +135,7 @@ func TestContextCopy(t *testing.T) {
assert.Equal(t, cp.Params, c.Params) assert.Equal(t, cp.Params, c.Params)
} }
func TestContextFormParse(t *testing.T) { func TestContextQuery(t *testing.T) {
c, _, _ := createTestContext() c, _, _ := createTestContext()
c.Request, _ = http.NewRequest("GET", "http://example.com/?foo=bar&page=10", nil) c.Request, _ = http.NewRequest("GET", "http://example.com/?foo=bar&page=10", nil)
@ -152,7 +152,7 @@ func TestContextFormParse(t *testing.T) {
assert.Empty(t, c.PostForm("NoKey")) assert.Empty(t, c.PostForm("NoKey"))
} }
func TestContextPostFormParse(t *testing.T) { func TestContextQueryAndPostForm(t *testing.T) {
c, _, _ := createTestContext() c, _, _ := createTestContext()
body := bytes.NewBufferString("foo=bar&page=11&both=POST") body := bytes.NewBufferString("foo=bar&page=11&both=POST")
c.Request, _ = http.NewRequest("POST", "/?both=GET&id=main", body) c.Request, _ = http.NewRequest("POST", "/?both=GET&id=main", body)
@ -169,6 +169,7 @@ func TestContextPostFormParse(t *testing.T) {
assert.Equal(t, c.PostForm("both"), "POST") assert.Equal(t, c.PostForm("both"), "POST")
assert.Equal(t, c.Query("both"), "GET") assert.Equal(t, c.Query("both"), "GET")
assert.Equal(t, c.DefaultPostForm("id", "000"), "000")
assert.Equal(t, c.Query("id"), "main") assert.Equal(t, c.Query("id"), "main")
assert.Empty(t, c.PostForm("id")) assert.Empty(t, c.PostForm("id"))
@ -176,10 +177,35 @@ func TestContextPostFormParse(t *testing.T) {
assert.Empty(t, c.PostForm("NoKey")) assert.Empty(t, c.PostForm("NoKey"))
assert.Empty(t, c.Query("NoKey")) assert.Empty(t, c.Query("NoKey"))
c.Param("page") var obj struct {
c.Query("page") Foo string `form:"foo"`
c.PostForm("page") Id string `form:"id"`
Page string `form:"page"`
Both string `form:"both"`
}
assert.NoError(t, c.Bind(&obj))
assert.Equal(t, obj.Foo, "bar")
assert.Equal(t, obj.Id, "main")
assert.Equal(t, obj.Page, "11")
assert.Equal(t, obj.Both, "POST")
}
func TestContextPostFormMultipart(t *testing.T) {
c, _, _ := createTestContext()
c.Request = createMultipartRequest()
var obj struct {
Foo string `form:"foo"`
Bar string `form:"bar"`
}
assert.NoError(t, c.Bind(&obj))
assert.Equal(t, obj.Bar, "foo")
assert.Equal(t, obj.Foo, "bar")
assert.Empty(t, c.Query("foo"))
assert.Empty(t, c.Query("bar"))
assert.Equal(t, c.PostForm("foo"), "bar")
assert.Equal(t, c.PostForm("bar"), "foo")
} }
// Tests that the response is serialized as JSON // Tests that the response is serialized as JSON
@ -451,10 +477,11 @@ func TestContextContentType(t *testing.T) {
assert.Equal(t, c.ContentType(), "application/json") assert.Equal(t, c.ContentType(), "application/json")
} }
func TestContextAutoBind(t *testing.T) { func TestContextAutoBindJSON(t *testing.T) {
c, w, _ := createTestContext() c, _, _ := createTestContext()
c.Request, _ = http.NewRequest("POST", "/", bytes.NewBufferString("{\"foo\":\"bar\", \"bar\":\"foo\"}")) c.Request, _ = http.NewRequest("POST", "/", bytes.NewBufferString("{\"foo\":\"bar\", \"bar\":\"foo\"}"))
c.Request.Header.Add("Content-Type", MIMEJSON) c.Request.Header.Add("Content-Type", MIMEJSON)
var obj struct { var obj struct {
Foo string `json:"foo"` Foo string `json:"foo"`
Bar string `json:"bar"` Bar string `json:"bar"`
@ -462,26 +489,19 @@ func TestContextAutoBind(t *testing.T) {
assert.NoError(t, c.Bind(&obj)) assert.NoError(t, c.Bind(&obj))
assert.Equal(t, obj.Bar, "foo") assert.Equal(t, obj.Bar, "foo")
assert.Equal(t, obj.Foo, "bar") assert.Equal(t, obj.Foo, "bar")
assert.Equal(t, w.Body.Len(), 0) assert.Empty(t, c.Errors)
} }
func TestContextMultipartPostFormAutoBind(t *testing.T) { func TestContextBindWithJSON(t *testing.T) {
c, w, _ := createTestContext() c, w, _ := createTestContext()
c.Request, _ = http.NewRequest("POST", "/", bytes.NewBufferString("{\"foo\":\"bar\", \"bar\":\"foo\"}"))
c.Request.Header.Add("Content-Type", MIMEXML) // set fake content-type
var obj struct { var obj struct {
Foo string `form:"foo"` Foo string `json:"foo"`
Bar string `form:"bar"` Bar string `json:"bar"`
} }
assert.NoError(t, c.BindJSON(&obj))
body, header, err := createMultipartForm()
if err != nil {
t.Error(err)
}
c.Request, _ = http.NewRequest("POST", "/", body)
c.Request.Header.Add("Content-Type", header)
assert.NoError(t, c.Bind(&obj))
assert.Equal(t, obj.Bar, "foo") assert.Equal(t, obj.Bar, "foo")
assert.Equal(t, obj.Foo, "bar") assert.Equal(t, obj.Foo, "bar")
assert.Equal(t, w.Body.Len(), 0) assert.Equal(t, w.Body.Len(), 0)
@ -506,42 +526,6 @@ func TestContextBadAutoBind(t *testing.T) {
assert.True(t, c.IsAborted()) assert.True(t, c.IsAborted())
} }
func TestContextBindWith(t *testing.T) {
c, w, _ := createTestContext()
c.Request, _ = http.NewRequest("POST", "/", bytes.NewBufferString("{\"foo\":\"bar\", \"bar\":\"foo\"}"))
c.Request.Header.Add("Content-Type", MIMEXML)
var obj struct {
Foo string `json:"foo"`
Bar string `json:"bar"`
}
assert.NoError(t, c.BindWith(&obj, binding.JSON))
assert.Equal(t, obj.Bar, "foo")
assert.Equal(t, obj.Foo, "bar")
assert.Equal(t, w.Body.Len(), 0)
}
func TestContextMultipartBindWith(t *testing.T) {
c, w, _ := createTestContext()
var obj struct {
Foo string `form:"foo"`
Bar string `form:"bar"`
}
body, header, err := createMultipartForm()
if err != nil {
t.Error(err)
}
c.Request, _ = http.NewRequest("POST", "/", body)
c.Request.Header.Add("Content-Type", header)
assert.NoError(t, c.BindWith(&obj, binding.Form))
assert.Equal(t, obj.Bar, "foo")
assert.Equal(t, obj.Foo, "bar")
assert.Equal(t, w.Body.Len(), 0)
}
func TestContextGolangContext(t *testing.T) { func TestContextGolangContext(t *testing.T) {
c, _, _ := createTestContext() c, _, _ := createTestContext()
c.Request, _ = http.NewRequest("POST", "/", bytes.NewBufferString("{\"foo\":\"bar\", \"bar\":\"foo\"}")) c.Request, _ = http.NewRequest("POST", "/", bytes.NewBufferString("{\"foo\":\"bar\", \"bar\":\"foo\"}"))