binding_test.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. // Copyright 2014 Manu Martinez-Almeida. All rights reserved.
  2. // Use of this source code is governed by a MIT style
  3. // license that can be found in the LICENSE file.
  4. package binding
  5. import (
  6. "bytes"
  7. "mime/multipart"
  8. "net/http"
  9. "testing"
  10. "github.com/stretchr/testify/assert"
  11. )
  12. type FooStruct struct {
  13. Foo string `json:"foo" form:"foo" xml:"foo" binding:"required"`
  14. }
  15. type FooBarStruct struct {
  16. FooStruct
  17. Bar string `json:"bar" form:"bar" xml:"bar" binding:"required"`
  18. }
  19. func TestBindingDefault(t *testing.T) {
  20. assert.Equal(t, Default("GET", ""), Form)
  21. assert.Equal(t, Default("GET", MIMEJSON), Form)
  22. assert.Equal(t, Default("POST", MIMEJSON), JSON)
  23. assert.Equal(t, Default("PUT", MIMEJSON), JSON)
  24. assert.Equal(t, Default("POST", MIMEXML), XML)
  25. assert.Equal(t, Default("PUT", MIMEXML2), XML)
  26. assert.Equal(t, Default("POST", MIMEPOSTForm), Form)
  27. assert.Equal(t, Default("PUT", MIMEPOSTForm), Form)
  28. assert.Equal(t, Default("POST", MIMEMultipartPOSTForm), Form)
  29. assert.Equal(t, Default("PUT", MIMEMultipartPOSTForm), Form)
  30. }
  31. func TestBindingJSON(t *testing.T) {
  32. testBodyBinding(t,
  33. JSON, "json",
  34. "/", "/",
  35. `{"foo": "bar"}`, `{"bar": "foo"}`)
  36. }
  37. func TestBindingForm(t *testing.T) {
  38. testFormBinding(t, "POST",
  39. "/", "/",
  40. "foo=bar&bar=foo", "bar2=foo")
  41. }
  42. func TestBindingForm2(t *testing.T) {
  43. testFormBinding(t, "GET",
  44. "/?foo=bar&bar=foo", "/?bar2=foo",
  45. "", "")
  46. }
  47. func TestBindingXML(t *testing.T) {
  48. testBodyBinding(t,
  49. XML, "xml",
  50. "/", "/",
  51. "<map><foo>bar</foo></map>", "<map><bar>foo</bar></map>")
  52. }
  53. func createFormPostRequest() *http.Request {
  54. req, _ := http.NewRequest("POST", "/?foo=getfoo&bar=getbar", bytes.NewBufferString("foo=bar&bar=foo"))
  55. req.Header.Set("Content-Type", MIMEPOSTForm)
  56. return req
  57. }
  58. func createFormMultipartRequest() *http.Request {
  59. boundary := "--testboundary"
  60. body := new(bytes.Buffer)
  61. mw := multipart.NewWriter(body)
  62. defer mw.Close()
  63. mw.SetBoundary(boundary)
  64. mw.WriteField("foo", "bar")
  65. mw.WriteField("bar", "foo")
  66. req, _ := http.NewRequest("POST", "/?foo=getfoo&bar=getbar", body)
  67. req.Header.Set("Content-Type", MIMEMultipartPOSTForm+"; boundary="+boundary)
  68. return req
  69. }
  70. func TestBindingFormPost(t *testing.T) {
  71. req := createFormPostRequest()
  72. var obj FooBarStruct
  73. FormPost.Bind(req, &obj)
  74. assert.Equal(t, obj.Foo, "bar")
  75. assert.Equal(t, obj.Bar, "foo")
  76. }
  77. func TestBindingFormMultipart(t *testing.T) {
  78. req := createFormMultipartRequest()
  79. var obj FooBarStruct
  80. FormMultipart.Bind(req, &obj)
  81. assert.Equal(t, obj.Foo, "bar")
  82. assert.Equal(t, obj.Bar, "foo")
  83. }
  84. func TestValidationFails(t *testing.T) {
  85. var obj FooStruct
  86. req := requestWithBody("POST", "/", `{"bar": "foo"}`)
  87. err := JSON.Bind(req, &obj)
  88. assert.Error(t, err)
  89. }
  90. func TestValidationDisabled(t *testing.T) {
  91. backup := Validator
  92. Validator = nil
  93. defer func() { Validator = backup }()
  94. var obj FooStruct
  95. req := requestWithBody("POST", "/", `{"bar": "foo"}`)
  96. err := JSON.Bind(req, &obj)
  97. assert.NoError(t, err)
  98. }
  99. func testFormBinding(t *testing.T, method, path, badPath, body, badBody string) {
  100. b := Form
  101. assert.Equal(t, b.Name(), "form")
  102. obj := FooBarStruct{}
  103. req := requestWithBody(method, path, body)
  104. if method == "POST" {
  105. req.Header.Add("Content-Type", MIMEPOSTForm)
  106. }
  107. err := b.Bind(req, &obj)
  108. assert.NoError(t, err)
  109. assert.Equal(t, obj.Foo, "bar")
  110. assert.Equal(t, obj.Bar, "foo")
  111. obj = FooBarStruct{}
  112. req = requestWithBody(method, badPath, badBody)
  113. err = JSON.Bind(req, &obj)
  114. assert.Error(t, err)
  115. }
  116. func testBodyBinding(t *testing.T, b Binding, name, path, badPath, body, badBody string) {
  117. assert.Equal(t, b.Name(), name)
  118. obj := FooStruct{}
  119. req := requestWithBody("POST", path, body)
  120. err := b.Bind(req, &obj)
  121. assert.NoError(t, err)
  122. assert.Equal(t, obj.Foo, "bar")
  123. obj = FooStruct{}
  124. req = requestWithBody("POST", badPath, badBody)
  125. err = JSON.Bind(req, &obj)
  126. assert.Error(t, err)
  127. }
  128. func requestWithBody(method, path, body string) (req *http.Request) {
  129. req, _ = http.NewRequest(method, path, bytes.NewBufferString(body))
  130. return
  131. }