http_test.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. package protocol
  2. import (
  3. "errors"
  4. "log"
  5. "net/http"
  6. "net/http/httptest"
  7. "testing"
  8. "github.com/stretchr/testify/assert"
  9. )
  10. func TestHTTPError_Error(t *testing.T) {
  11. err := HTTPError{StatusCode: 400, Body: "bad request"}
  12. assert.Equal(t, "bad request", err.Error())
  13. }
  14. func TestHTTPProtocol_BadRequest(t *testing.T) {
  15. hp := HTTPProtocol{}
  16. err := hp.BadRequest("bad req")
  17. assert.Equal(t, http.StatusBadRequest, err.StatusCode)
  18. assert.Equal(t, "bad req", err.Body)
  19. }
  20. func TestHTTPProtocol_UnprocessableEntity(t *testing.T) {
  21. hp := HTTPProtocol{}
  22. err := hp.UnprocessableEntity("")
  23. assert.Equal(t, http.StatusUnprocessableEntity, err.StatusCode)
  24. assert.Equal(t, "Unprocessable Entity", err.Body)
  25. err2 := hp.UnprocessableEntity("custom")
  26. assert.Equal(t, "custom", err2.Body)
  27. }
  28. func TestHTTPProtocol_InternalServerError(t *testing.T) {
  29. hp := HTTPProtocol{}
  30. err := hp.InternalServerError("")
  31. assert.Equal(t, http.StatusInternalServerError, err.StatusCode)
  32. assert.Equal(t, "Internal Server Error", err.Body)
  33. err2 := hp.InternalServerError("custom")
  34. assert.Equal(t, "custom", err2.Body)
  35. }
  36. func TestHTTPProtocol_NotImplemented(t *testing.T) {
  37. hp := HTTPProtocol{}
  38. err := hp.NotImplemented("")
  39. assert.Equal(t, http.StatusNotImplemented, err.StatusCode)
  40. assert.Equal(t, "Not Implemented", err.Body)
  41. err2 := hp.NotImplemented("custom")
  42. assert.Equal(t, "custom", err2.Body)
  43. }
  44. func TestHTTPProtocol_Forbidden(t *testing.T) {
  45. hp := HTTPProtocol{}
  46. err := hp.Forbidden("")
  47. assert.Equal(t, http.StatusForbidden, err.StatusCode)
  48. assert.Equal(t, "Forbidden", err.Body)
  49. err2 := hp.Forbidden("custom")
  50. assert.Equal(t, "custom", err2.Body)
  51. }
  52. func TestHTTPProtocol_NotFound(t *testing.T) {
  53. hp := HTTPProtocol{}
  54. err := hp.NotFound()
  55. assert.Equal(t, http.StatusNotFound, err.StatusCode)
  56. assert.Equal(t, "Not Found", err.Body)
  57. }
  58. func TestHTTPProtocol_ToResponse(t *testing.T) {
  59. hp := HTTPProtocol{}
  60. resp := hp.ToResponse("data", nil)
  61. assert.Equal(t, http.StatusOK, resp.Code)
  62. assert.Equal(t, "data", resp.Data)
  63. resp2 := hp.ToResponse("data", errors.New("fail"))
  64. assert.Equal(t, http.StatusInternalServerError, resp2.Code)
  65. assert.Equal(t, "fail", resp2.Message)
  66. }
  67. func TestHTTPProtocol_WriteRawOK(t *testing.T) {
  68. hp := HTTPProtocol{}
  69. rw := httptest.NewRecorder()
  70. hp.WriteRawOK(rw)
  71. assert.Equal(t, http.StatusOK, rw.Code)
  72. assert.Equal(t, "application/json", rw.Header().Get("Content-Type"))
  73. assert.Equal(t, "0", rw.Header().Get("Content-Length"))
  74. }
  75. func TestHTTPProtocol_WriteRawNoContent(t *testing.T) {
  76. hp := HTTPProtocol{}
  77. rw := httptest.NewRecorder()
  78. hp.WriteRawNoContent(rw)
  79. assert.Equal(t, http.StatusNoContent, rw.Code)
  80. assert.Equal(t, "application/json", rw.Header().Get("Content-Type"))
  81. }
  82. func TestHTTPProtocol_WriteJSONData(t *testing.T) {
  83. hp := HTTPProtocol{}
  84. rw := httptest.NewRecorder()
  85. hp.WriteJSONData(rw, map[string]string{"foo": "bar"})
  86. assert.Equal(t, http.StatusOK, rw.Code)
  87. assert.Contains(t, rw.Body.String(), "foo")
  88. }
  89. func TestHTTPProtocol_WriteRawError(t *testing.T) {
  90. hp := HTTPProtocol{}
  91. rw := httptest.NewRecorder()
  92. hp.WriteRawError(rw, http.StatusBadRequest, "bad")
  93. assert.Equal(t, http.StatusBadRequest, rw.Code)
  94. assert.Equal(t, "text/plain; charset=utf-8", rw.Header().Get("Content-Type"))
  95. assert.Contains(t, rw.Body.String(), "bad")
  96. }
  97. func TestHTTPProtocol_WriteEncodedError(t *testing.T) {
  98. hp := HTTPProtocol{}
  99. rw := httptest.NewRecorder()
  100. hp.WriteEncodedError(rw, http.StatusBadRequest, map[string]string{"err": "bad"})
  101. assert.Equal(t, http.StatusBadRequest, rw.Code)
  102. assert.Contains(t, rw.Body.String(), "bad")
  103. }
  104. func TestHTTPProtocol_WriteData(t *testing.T) {
  105. hp := HTTPProtocol{}
  106. rw := httptest.NewRecorder()
  107. hp.WriteData(rw, map[string]string{"foo": "bar"})
  108. assert.Equal(t, http.StatusOK, rw.Code)
  109. assert.Contains(t, rw.Body.String(), "foo")
  110. }
  111. func TestHTTPProtocol_WriteDataWithWarning(t *testing.T) {
  112. hp := HTTPProtocol{}
  113. rw := httptest.NewRecorder()
  114. hp.WriteDataWithWarning(rw, map[string]string{"foo": "bar"}, "warn")
  115. assert.Equal(t, http.StatusOK, rw.Code)
  116. assert.Contains(t, rw.Body.String(), "warn")
  117. }
  118. func TestHTTPProtocol_WriteDataWithMessage(t *testing.T) {
  119. hp := HTTPProtocol{}
  120. rw := httptest.NewRecorder()
  121. hp.WriteDataWithMessage(rw, map[string]string{"foo": "bar"}, "msg")
  122. assert.Equal(t, http.StatusOK, rw.Code)
  123. assert.Contains(t, rw.Body.String(), "msg")
  124. }
  125. func TestHTTPProtocol_WriteDataWithMessageAndWarning(t *testing.T) {
  126. hp := HTTPProtocol{}
  127. rw := httptest.NewRecorder()
  128. hp.WriteDataWithMessageAndWarning(rw, map[string]string{"foo": "bar"}, "msg", "warn")
  129. assert.Equal(t, http.StatusOK, rw.Code)
  130. assert.Contains(t, rw.Body.String(), "msg")
  131. assert.Contains(t, rw.Body.String(), "warn")
  132. }
  133. func TestHTTPProtocol_WriteError(t *testing.T) {
  134. hp := HTTPProtocol{}
  135. rw := httptest.NewRecorder()
  136. hp.WriteError(rw, HTTPError{StatusCode: 400, Body: "fail"})
  137. assert.Equal(t, 400, rw.Code)
  138. body := rw.Body.String()
  139. log.Println("body: " + body)
  140. assert.Contains(t, body, "fail")
  141. }
  142. func TestHTTPProtocol_WriteResponse(t *testing.T) {
  143. hp := HTTPProtocol{}
  144. rw := httptest.NewRecorder()
  145. resp := &HTTPResponse{Code: 200, Data: "foo"}
  146. hp.WriteResponse(rw, resp)
  147. assert.Equal(t, 200, rw.Code)
  148. assert.Contains(t, rw.Body.String(), "foo")
  149. }
  150. func TestHTTPProtocol_WriteData_Structure(t *testing.T) {
  151. hp := HTTPProtocol{}
  152. rw := httptest.NewRecorder()
  153. data := map[string]string{"foo": "bar"}
  154. hp.WriteData(rw, data)
  155. assert.Equal(t, http.StatusOK, rw.Code)
  156. assert.Equal(t, "application/json", rw.Header().Get("Content-Type"))
  157. // Check the structure of the JSON response
  158. body := rw.Body.String()
  159. assert.Contains(t, body, "\"code\":200")
  160. assert.Contains(t, body, "\"data\":{\"foo\":\"bar\"}")
  161. assert.NotContains(t, body, "message")
  162. assert.NotContains(t, body, "warning")
  163. }