binding_test.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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. "net/http"
  8. "testing"
  9. "github.com/stretchr/testify/assert"
  10. )
  11. type FooStruct struct {
  12. Foo string `json:"foo" form:"foo" xml:"foo" binding:"required"`
  13. }
  14. type FooBarStruct struct {
  15. FooStruct
  16. Bar string `json:"bar" form:"bar" xml:"bar" binding:"required"`
  17. }
  18. func TestBindingDefault(t *testing.T) {
  19. assert.Equal(t, Default("GET", ""), Form)
  20. assert.Equal(t, Default("GET", MIMEJSON), Form)
  21. assert.Equal(t, Default("POST", MIMEJSON), JSON)
  22. assert.Equal(t, Default("PUT", MIMEJSON), JSON)
  23. assert.Equal(t, Default("POST", MIMEXML), XML)
  24. assert.Equal(t, Default("PUT", MIMEXML2), XML)
  25. assert.Equal(t, Default("POST", MIMEPOSTForm), Form)
  26. assert.Equal(t, Default("PUT", MIMEPOSTForm), Form)
  27. assert.Equal(t, Default("POST", MIMEMultipartPOSTForm), Form)
  28. assert.Equal(t, Default("PUT", MIMEMultipartPOSTForm), Form)
  29. }
  30. func TestBindingJSON(t *testing.T) {
  31. testBodyBinding(t,
  32. JSON, "json",
  33. "/", "/",
  34. `{"foo": "bar"}`, `{"bar": "foo"}`)
  35. }
  36. func TestBindingForm(t *testing.T) {
  37. testFormBinding(t, "POST",
  38. "/", "/",
  39. "foo=bar&bar=foo", "bar2=foo")
  40. }
  41. func TestBindingForm2(t *testing.T) {
  42. testFormBinding(t, "GET",
  43. "/?foo=bar&bar=foo", "/?bar2=foo",
  44. "", "")
  45. }
  46. func TestBindingXML(t *testing.T) {
  47. testBodyBinding(t,
  48. XML, "xml",
  49. "/", "/",
  50. "<map><foo>bar</foo></map>", "<map><bar>foo</bar></map>")
  51. }
  52. func TestValidationFails(t *testing.T) {
  53. var obj FooStruct
  54. req := requestWithBody("POST", "/", `{"bar": "foo"}`)
  55. err := JSON.Bind(req, &obj)
  56. assert.Error(t, err)
  57. }
  58. func TestValidationDisabled(t *testing.T) {
  59. backup := Validator
  60. Validator = nil
  61. defer func() { Validator = backup }()
  62. var obj FooStruct
  63. req := requestWithBody("POST", "/", `{"bar": "foo"}`)
  64. err := JSON.Bind(req, &obj)
  65. assert.NoError(t, err)
  66. }
  67. func testFormBinding(t *testing.T, method, path, badPath, body, badBody string) {
  68. b := Form
  69. assert.Equal(t, b.Name(), "form")
  70. obj := FooBarStruct{}
  71. req := requestWithBody(method, path, body)
  72. if method == "POST" {
  73. req.Header.Add("Content-Type", MIMEPOSTForm)
  74. }
  75. err := b.Bind(req, &obj)
  76. assert.NoError(t, err)
  77. assert.Equal(t, obj.Foo, "bar")
  78. assert.Equal(t, obj.Bar, "foo")
  79. obj = FooBarStruct{}
  80. req = requestWithBody(method, badPath, badBody)
  81. err = JSON.Bind(req, &obj)
  82. assert.Error(t, err)
  83. }
  84. func testBodyBinding(t *testing.T, b Binding, name, path, badPath, body, badBody string) {
  85. assert.Equal(t, b.Name(), name)
  86. obj := FooStruct{}
  87. req := requestWithBody("POST", path, body)
  88. err := b.Bind(req, &obj)
  89. assert.NoError(t, err)
  90. assert.Equal(t, obj.Foo, "bar")
  91. obj = FooStruct{}
  92. req = requestWithBody("POST", badPath, badBody)
  93. err = JSON.Bind(req, &obj)
  94. assert.Error(t, err)
  95. }
  96. func requestWithBody(method, path, body string) (req *http.Request) {
  97. req, _ = http.NewRequest(method, path, bytes.NewBufferString(body))
  98. return
  99. }