render_test.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  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 render
  5. import (
  6. "encoding/xml"
  7. "html/template"
  8. "net/http/httptest"
  9. "testing"
  10. "github.com/stretchr/testify/assert"
  11. )
  12. // TODO unit tests
  13. // test errors
  14. func TestRenderJSON(t *testing.T) {
  15. w := httptest.NewRecorder()
  16. data := map[string]interface{}{
  17. "foo": "bar",
  18. }
  19. err := (JSON{data}).Render(w)
  20. assert.NoError(t, err)
  21. assert.Equal(t, w.Body.String(), "{\"foo\":\"bar\"}\n")
  22. assert.Equal(t, w.Header().Get("Content-Type"), "application/json; charset=utf-8")
  23. }
  24. func TestRenderIndentedJSON(t *testing.T) {
  25. w := httptest.NewRecorder()
  26. data := map[string]interface{}{
  27. "foo": "bar",
  28. "bar": "foo",
  29. }
  30. err := (IndentedJSON{data}).Render(w)
  31. assert.NoError(t, err)
  32. assert.Equal(t, w.Body.String(), "{\n \"bar\": \"foo\",\n \"foo\": \"bar\"\n}")
  33. assert.Equal(t, w.Header().Get("Content-Type"), "application/json; charset=utf-8")
  34. }
  35. type xmlmap map[string]interface{}
  36. // Allows type H to be used with xml.Marshal
  37. func (h xmlmap) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
  38. start.Name = xml.Name{
  39. Space: "",
  40. Local: "map",
  41. }
  42. if err := e.EncodeToken(start); err != nil {
  43. return err
  44. }
  45. for key, value := range h {
  46. elem := xml.StartElement{
  47. Name: xml.Name{Space: "", Local: key},
  48. Attr: []xml.Attr{},
  49. }
  50. if err := e.EncodeElement(value, elem); err != nil {
  51. return err
  52. }
  53. }
  54. if err := e.EncodeToken(xml.EndElement{Name: start.Name}); err != nil {
  55. return err
  56. }
  57. return nil
  58. }
  59. func TestRenderXML(t *testing.T) {
  60. w := httptest.NewRecorder()
  61. data := xmlmap{
  62. "foo": "bar",
  63. }
  64. err := (XML{data}).Render(w)
  65. assert.NoError(t, err)
  66. assert.Equal(t, w.Body.String(), "<map><foo>bar</foo></map>")
  67. assert.Equal(t, w.Header().Get("Content-Type"), "application/xml; charset=utf-8")
  68. }
  69. func TestRenderRedirect(t *testing.T) {
  70. // TODO
  71. }
  72. func TestRenderData(t *testing.T) {
  73. w := httptest.NewRecorder()
  74. data := []byte("#!PNG some raw data")
  75. err := (Data{
  76. ContentType: "image/png",
  77. Data: data,
  78. }).Render(w)
  79. assert.NoError(t, err)
  80. assert.Equal(t, w.Body.String(), "#!PNG some raw data")
  81. assert.Equal(t, w.Header().Get("Content-Type"), "image/png")
  82. }
  83. func TestRenderString(t *testing.T) {
  84. w := httptest.NewRecorder()
  85. err := (String{
  86. Format: "hola %s %d",
  87. Data: []interface{}{"manu", 2},
  88. }).Render(w)
  89. assert.NoError(t, err)
  90. assert.Equal(t, w.Body.String(), "hola manu 2")
  91. assert.Equal(t, w.Header().Get("Content-Type"), "text/plain; charset=utf-8")
  92. }
  93. func TestRenderHTMLTemplate(t *testing.T) {
  94. w := httptest.NewRecorder()
  95. templ := template.Must(template.New("t").Parse(`Hello {{.name}}`))
  96. htmlRender := HTMLProduction{Template: templ}
  97. instance := htmlRender.Instance("t", map[string]interface{}{
  98. "name": "alexandernyquist",
  99. })
  100. err := instance.Render(w)
  101. assert.NoError(t, err)
  102. assert.Equal(t, w.Body.String(), "Hello alexandernyquist")
  103. assert.Equal(t, w.Header().Get("Content-Type"), "text/html; charset=utf-8")
  104. }