sse_test.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  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 sse
  5. import (
  6. "bytes"
  7. "net/http/httptest"
  8. "testing"
  9. "github.com/stretchr/testify/assert"
  10. )
  11. func TestEncodeOnlyData(t *testing.T) {
  12. w := new(bytes.Buffer)
  13. err := Encode(w, Event{
  14. Data: "junk\n\njk\nid:fake",
  15. })
  16. assert.NoError(t, err)
  17. assert.Equal(t, w.String(), "data: junk\\n\\njk\\nid:fake\n\n")
  18. }
  19. func TestEncodeWithEvent(t *testing.T) {
  20. w := new(bytes.Buffer)
  21. err := Encode(w, Event{
  22. Event: "t\n:<>\r\test",
  23. Data: "junk\n\njk\nid:fake",
  24. })
  25. assert.NoError(t, err)
  26. assert.Equal(t, w.String(), "event: t\\n:<>\\r\test\ndata: junk\\n\\njk\\nid:fake\n\n")
  27. }
  28. func TestEncodeWithId(t *testing.T) {
  29. w := new(bytes.Buffer)
  30. err := Encode(w, Event{
  31. Id: "t\n:<>\r\test",
  32. Data: "junk\n\njk\nid:fa\rke",
  33. })
  34. assert.NoError(t, err)
  35. assert.Equal(t, w.String(), "id: t\\n:<>\\r\test\ndata: junk\\n\\njk\\nid:fa\\rke\n\n")
  36. }
  37. func TestEncodeWithRetry(t *testing.T) {
  38. w := new(bytes.Buffer)
  39. err := Encode(w, Event{
  40. Retry: 11,
  41. Data: "junk\n\njk\nid:fake\n",
  42. })
  43. assert.NoError(t, err)
  44. assert.Equal(t, w.String(), "retry: 11\ndata: junk\\n\\njk\\nid:fake\\n\n\n")
  45. }
  46. func TestEncodeWithEverything(t *testing.T) {
  47. w := new(bytes.Buffer)
  48. err := Encode(w, Event{
  49. Event: "abc",
  50. Id: "12345",
  51. Retry: 10,
  52. Data: "some data",
  53. })
  54. assert.NoError(t, err)
  55. assert.Equal(t, w.String(), "id: 12345\nevent: abc\nretry: 10\ndata: some data\n\n")
  56. }
  57. func TestEncodeMap(t *testing.T) {
  58. w := new(bytes.Buffer)
  59. err := Encode(w, Event{
  60. Event: "a map",
  61. Data: map[string]interface{}{
  62. "foo": "b\n\rar",
  63. "bar": "id: 2",
  64. },
  65. })
  66. assert.NoError(t, err)
  67. assert.Equal(t, w.String(), "event: a map\ndata: {\"bar\":\"id: 2\",\"foo\":\"b\\n\\rar\"}\n\n")
  68. }
  69. func TestEncodeSlice(t *testing.T) {
  70. w := new(bytes.Buffer)
  71. err := Encode(w, Event{
  72. Event: "a slice",
  73. Data: []interface{}{1, "text", map[string]interface{}{"foo": "bar"}},
  74. })
  75. assert.NoError(t, err)
  76. assert.Equal(t, w.String(), "event: a slice\ndata: [1,\"text\",{\"foo\":\"bar\"}]\n\n")
  77. }
  78. func TestEncodeStruct(t *testing.T) {
  79. myStruct := struct {
  80. A int
  81. B string `json:"value"`
  82. }{1, "number"}
  83. w := new(bytes.Buffer)
  84. err := Encode(w, Event{
  85. Event: "a struct",
  86. Data: myStruct,
  87. })
  88. assert.NoError(t, err)
  89. assert.Equal(t, w.String(), "event: a struct\ndata: {\"A\":1,\"value\":\"number\"}\n\n")
  90. w.Reset()
  91. err = Encode(w, Event{
  92. Event: "a struct",
  93. Data: &myStruct,
  94. })
  95. assert.NoError(t, err)
  96. assert.Equal(t, w.String(), "event: a struct\ndata: {\"A\":1,\"value\":\"number\"}\n\n")
  97. }
  98. func TestEncodeInteger(t *testing.T) {
  99. w := new(bytes.Buffer)
  100. err := Encode(w, Event{
  101. Event: "an integer",
  102. Data: 1,
  103. })
  104. assert.NoError(t, err)
  105. assert.Equal(t, w.String(), "event: an integer\ndata: 1\n\n")
  106. }
  107. func TestEncodeFloat(t *testing.T) {
  108. w := new(bytes.Buffer)
  109. err := Encode(w, Event{
  110. Event: "Float",
  111. Data: 1.5,
  112. })
  113. assert.NoError(t, err)
  114. assert.Equal(t, w.String(), "event: Float\ndata: 1.5\n\n")
  115. }
  116. func TestEncodeStream(t *testing.T) {
  117. w := new(bytes.Buffer)
  118. Encode(w, Event{
  119. Event: "float",
  120. Data: 1.5,
  121. })
  122. Encode(w, Event{
  123. Id: "123",
  124. Data: map[string]interface{}{"foo": "bar", "bar": "foo"},
  125. })
  126. Encode(w, Event{
  127. Id: "124",
  128. Event: "chat",
  129. Data: "hi! dude",
  130. })
  131. assert.Equal(t, w.String(), "event: float\ndata: 1.5\n\nid: 123\ndata: {\"bar\":\"foo\",\"foo\":\"bar\"}\n\nid: 124\nevent: chat\ndata: hi! dude\n\n")
  132. }
  133. func TestRenderSSE(t *testing.T) {
  134. w := httptest.NewRecorder()
  135. err := (Event{
  136. Event: "msg",
  137. Data: "hi! how are you?",
  138. }).Write(w)
  139. assert.NoError(t, err)
  140. assert.Equal(t, w.Body.String(), "event: msg\ndata: hi! how are you?\n\n")
  141. assert.Equal(t, w.Header().Get("Content-Type"), "text/event-stream")
  142. assert.Equal(t, w.Header().Get("Cache-Control"), "no-cache")
  143. }