render_test.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  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. return e.EncodeToken(xml.EndElement{Name: start.Name})
  93. }
  94. func TestRenderXML(t *testing.T) {
  95. w := httptest.NewRecorder()
  96. data := xmlmap{
  97. "foo": "bar",
  98. }
  99. err := (XML{data}).Render(w)
  100. assert.NoError(t, err)
  101. assert.Equal(t, w.Body.String(), "<map><foo>bar</foo></map>")
  102. assert.Equal(t, w.Header().Get("Content-Type"), "application/xml; charset=utf-8")
  103. }
  104. func TestRenderRedirect(t *testing.T) {
  105. // TODO
  106. }
  107. func TestRenderData(t *testing.T) {
  108. w := httptest.NewRecorder()
  109. data := []byte("#!PNG some raw data")
  110. err := (Data{
  111. ContentType: "image/png",
  112. Data: data,
  113. }).Render(w)
  114. assert.NoError(t, err)
  115. assert.Equal(t, w.Body.String(), "#!PNG some raw data")
  116. assert.Equal(t, w.Header().Get("Content-Type"), "image/png")
  117. }
  118. func TestRenderString(t *testing.T) {
  119. w := httptest.NewRecorder()
  120. err := (String{
  121. Format: "hola %s %d",
  122. Data: []interface{}{"manu", 2},
  123. }).Render(w)
  124. assert.NoError(t, err)
  125. assert.Equal(t, w.Body.String(), "hola manu 2")
  126. assert.Equal(t, w.Header().Get("Content-Type"), "text/plain; charset=utf-8")
  127. }
  128. func TestRenderHTMLTemplate(t *testing.T) {
  129. w := httptest.NewRecorder()
  130. templ := template.Must(template.New("t").Parse(`Hello {{.name}}`))
  131. htmlRender := HTMLProduction{Template: templ}
  132. instance := htmlRender.Instance("t", map[string]interface{}{
  133. "name": "alexandernyquist",
  134. })
  135. err := instance.Render(w)
  136. assert.NoError(t, err)
  137. assert.Equal(t, w.Body.String(), "Hello alexandernyquist")
  138. assert.Equal(t, w.Header().Get("Content-Type"), "text/html; charset=utf-8")
  139. }