response_test.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package response
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "net/http"
  6. "net/http/httptest"
  7. "testing"
  8. "github.com/stretchr/testify/assert"
  9. "github.com/stretchr/testify/require"
  10. "github.com/zeromicro/go-zero/rest/httpx"
  11. )
  12. // TC-0265: 触发404等
  13. func TestNewCodeError(t *testing.T) {
  14. err := NewCodeError(400, "bad request")
  15. assert.Equal(t, 400, err.Code())
  16. assert.Equal(t, "bad request", err.Error())
  17. assert.Equal(t, 2, err.ShowType())
  18. }
  19. // TC-0265: 触发404等
  20. func TestCodeErrorHelpers(t *testing.T) {
  21. tests := []struct {
  22. name string
  23. fn func(string) *CodeError
  24. code int
  25. msg string
  26. }{
  27. {"ErrBadRequest", ErrBadRequest, 400, "test bad"},
  28. {"ErrUnauthorized", ErrUnauthorized, 401, "test unauth"},
  29. {"ErrForbidden", ErrForbidden, 403, "test forbidden"},
  30. {"ErrNotFound", ErrNotFound, 404, "test not found"},
  31. {"ErrConflict", ErrConflict, 409, "test conflict"},
  32. }
  33. for _, tt := range tests {
  34. t.Run(tt.name, func(t *testing.T) {
  35. err := tt.fn(tt.msg)
  36. assert.Equal(t, tt.code, err.Code())
  37. assert.Equal(t, tt.msg, err.Error())
  38. assert.Equal(t, 2, err.ShowType())
  39. })
  40. }
  41. }
  42. // TC-0265: 触发404等
  43. func TestCodeError_AsInterface(t *testing.T) {
  44. var err error = NewCodeError(404, "not found")
  45. var ce *CodeError
  46. ok := errors.As(err, &ce)
  47. assert.True(t, ok)
  48. assert.Equal(t, 404, ce.Code())
  49. assert.Equal(t, "not found", ce.Error())
  50. }
  51. // TC-0265: 触发404等
  52. func TestCodeError_NonCodeError(t *testing.T) {
  53. err := errors.New("internal error")
  54. var ce *CodeError
  55. ok := errors.As(err, &ce)
  56. assert.False(t, ok)
  57. }
  58. // TC-0265: 触发404等
  59. func TestSetup_ErrorHandler_CodeError(t *testing.T) {
  60. Setup()
  61. handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  62. httpx.ErrorCtx(r.Context(), w, ErrBadRequest("参数错误"))
  63. })
  64. req := httptest.NewRequest(http.MethodPost, "/test", nil)
  65. rr := httptest.NewRecorder()
  66. handler.ServeHTTP(rr, req)
  67. assert.Equal(t, http.StatusOK, rr.Code)
  68. var body Body
  69. err := json.Unmarshal(rr.Body.Bytes(), &body)
  70. require.NoError(t, err)
  71. assert.False(t, body.Success)
  72. assert.Equal(t, 400, body.ErrorCode)
  73. assert.Equal(t, "参数错误", body.ErrorMessage)
  74. assert.Equal(t, 2, body.ShowType)
  75. assert.Nil(t, body.Data)
  76. }
  77. // TC-0266: DB异常
  78. func TestSetup_ErrorHandler_InternalError(t *testing.T) {
  79. Setup()
  80. handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  81. httpx.ErrorCtx(r.Context(), w, errors.New("db connection failed"))
  82. })
  83. req := httptest.NewRequest(http.MethodPost, "/test", nil)
  84. rr := httptest.NewRecorder()
  85. handler.ServeHTTP(rr, req)
  86. assert.Equal(t, http.StatusOK, rr.Code)
  87. var body Body
  88. err := json.Unmarshal(rr.Body.Bytes(), &body)
  89. require.NoError(t, err)
  90. assert.False(t, body.Success)
  91. assert.Equal(t, 500, body.ErrorCode)
  92. assert.Equal(t, "服务器内部错误", body.ErrorMessage)
  93. assert.Equal(t, 2, body.ShowType)
  94. assert.Nil(t, body.Data)
  95. }
  96. // TC-0267: 正常请求
  97. func TestSetup_OkHandler_WithData(t *testing.T) {
  98. Setup()
  99. handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  100. httpx.OkJsonCtx(r.Context(), w, map[string]string{"key": "value"})
  101. })
  102. req := httptest.NewRequest(http.MethodPost, "/test", nil)
  103. rr := httptest.NewRecorder()
  104. handler.ServeHTTP(rr, req)
  105. assert.Equal(t, http.StatusOK, rr.Code)
  106. var body Body
  107. err := json.Unmarshal(rr.Body.Bytes(), &body)
  108. require.NoError(t, err)
  109. assert.True(t, body.Success)
  110. assert.Equal(t, 0, body.ErrorCode)
  111. require.NotNil(t, body.Data)
  112. dataMap, ok := body.Data.(map[string]interface{})
  113. require.True(t, ok)
  114. assert.Equal(t, "value", dataMap["key"])
  115. }
  116. // TC-0268: 返回nil
  117. func TestSetup_OkHandler_NilData(t *testing.T) {
  118. Setup()
  119. handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  120. httpx.OkJsonCtx(r.Context(), w, nil)
  121. })
  122. req := httptest.NewRequest(http.MethodPost, "/test", nil)
  123. rr := httptest.NewRecorder()
  124. handler.ServeHTTP(rr, req)
  125. assert.Equal(t, http.StatusOK, rr.Code)
  126. var body Body
  127. err := json.Unmarshal(rr.Body.Bytes(), &body)
  128. require.NoError(t, err)
  129. assert.True(t, body.Success)
  130. assert.Equal(t, 0, body.ErrorCode)
  131. assert.Nil(t, body.Data)
  132. }