binding_test.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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 testFormBinding(t *testing.T, method, path, badPath, body, badBody string) {
  53. b := Form
  54. assert.Equal(t, b.Name(), "form")
  55. obj := FooBarStruct{}
  56. req := requestWithBody(method, path, body)
  57. if method == "POST" {
  58. req.Header.Add("Content-Type", MIMEPOSTForm)
  59. }
  60. err := b.Bind(req, &obj)
  61. assert.NoError(t, err)
  62. assert.Equal(t, obj.Foo, "bar")
  63. assert.Equal(t, obj.Bar, "foo")
  64. obj = FooBarStruct{}
  65. req = requestWithBody(method, badPath, badBody)
  66. err = JSON.Bind(req, &obj)
  67. assert.Error(t, err)
  68. }
  69. func testBodyBinding(t *testing.T, b Binding, name, path, badPath, body, badBody string) {
  70. assert.Equal(t, b.Name(), name)
  71. obj := FooStruct{}
  72. req := requestWithBody("POST", path, body)
  73. err := b.Bind(req, &obj)
  74. assert.NoError(t, err)
  75. assert.Equal(t, obj.Foo, "bar")
  76. obj = FooStruct{}
  77. req = requestWithBody("POST", badPath, badBody)
  78. err = JSON.Bind(req, &obj)
  79. assert.Error(t, err)
  80. }
  81. func requestWithBody(method, path, body string) (req *http.Request) {
  82. req, _ = http.NewRequest(method, path, bytes.NewBufferString(body))
  83. return
  84. }