render_test.go 3.5 KB

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