render_test.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  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. func TestRenderSecureJSON(t *testing.T) {
  54. w1 := httptest.NewRecorder()
  55. data := map[string]interface{}{
  56. "foo": "bar",
  57. }
  58. err1 := (SecureJSON{"while(1);", data}).Render(w1)
  59. assert.NoError(t, err1)
  60. assert.Equal(t, "{\"foo\":\"bar\"}", w1.Body.String())
  61. assert.Equal(t, "application/json; charset=utf-8", w1.Header().Get("Content-Type"))
  62. w2 := httptest.NewRecorder()
  63. datas := []map[string]interface{}{{
  64. "foo": "bar",
  65. }, {
  66. "bar": "foo",
  67. }}
  68. err2 := (SecureJSON{"while(1);", datas}).Render(w2)
  69. assert.NoError(t, err2)
  70. assert.Equal(t, "while(1);[{\"foo\":\"bar\"},{\"bar\":\"foo\"}]", w2.Body.String())
  71. assert.Equal(t, "application/json; charset=utf-8", w2.Header().Get("Content-Type"))
  72. }
  73. type xmlmap map[string]interface{}
  74. // Allows type H to be used with xml.Marshal
  75. func (h xmlmap) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
  76. start.Name = xml.Name{
  77. Space: "",
  78. Local: "map",
  79. }
  80. if err := e.EncodeToken(start); err != nil {
  81. return err
  82. }
  83. for key, value := range h {
  84. elem := xml.StartElement{
  85. Name: xml.Name{Space: "", Local: key},
  86. Attr: []xml.Attr{},
  87. }
  88. if err := e.EncodeElement(value, elem); err != nil {
  89. return err
  90. }
  91. }
  92. if err := e.EncodeToken(xml.EndElement{Name: start.Name}); err != nil {
  93. return err
  94. }
  95. return nil
  96. }
  97. func TestRenderXML(t *testing.T) {
  98. w := httptest.NewRecorder()
  99. data := xmlmap{
  100. "foo": "bar",
  101. }
  102. err := (XML{data}).Render(w)
  103. assert.NoError(t, err)
  104. assert.Equal(t, w.Body.String(), "<map><foo>bar</foo></map>")
  105. assert.Equal(t, w.Header().Get("Content-Type"), "application/xml; charset=utf-8")
  106. }
  107. func TestRenderRedirect(t *testing.T) {
  108. // TODO
  109. }
  110. func TestRenderData(t *testing.T) {
  111. w := httptest.NewRecorder()
  112. data := []byte("#!PNG some raw data")
  113. err := (Data{
  114. ContentType: "image/png",
  115. Data: data,
  116. }).Render(w)
  117. assert.NoError(t, err)
  118. assert.Equal(t, w.Body.String(), "#!PNG some raw data")
  119. assert.Equal(t, w.Header().Get("Content-Type"), "image/png")
  120. }
  121. func TestRenderString(t *testing.T) {
  122. w := httptest.NewRecorder()
  123. err := (String{
  124. Format: "hola %s %d",
  125. Data: []interface{}{"manu", 2},
  126. }).Render(w)
  127. assert.NoError(t, err)
  128. assert.Equal(t, w.Body.String(), "hola manu 2")
  129. assert.Equal(t, w.Header().Get("Content-Type"), "text/plain; charset=utf-8")
  130. }
  131. func TestRenderHTMLTemplate(t *testing.T) {
  132. w := httptest.NewRecorder()
  133. templ := template.Must(template.New("t").Parse(`Hello {{.name}}`))
  134. htmlRender := HTMLProduction{Template: templ}
  135. instance := htmlRender.Instance("t", map[string]interface{}{
  136. "name": "alexandernyquist",
  137. })
  138. err := instance.Render(w)
  139. assert.NoError(t, err)
  140. assert.Equal(t, w.Body.String(), "Hello alexandernyquist")
  141. assert.Equal(t, w.Header().Get("Content-Type"), "text/html; charset=utf-8")
  142. }