| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- package response
- import (
- "encoding/json"
- "errors"
- "net/http"
- "net/http/httptest"
- "testing"
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
- "github.com/zeromicro/go-zero/rest/httpx"
- )
- // TC-0265: 触发404等
- func TestNewCodeError(t *testing.T) {
- err := NewCodeError(400, "bad request")
- assert.Equal(t, 400, err.Code())
- assert.Equal(t, "bad request", err.Error())
- }
- // TC-0265: 触发404等
- func TestCodeErrorHelpers(t *testing.T) {
- tests := []struct {
- name string
- fn func(string) *CodeError
- code int
- msg string
- }{
- {"ErrBadRequest", ErrBadRequest, 400, "test bad"},
- {"ErrUnauthorized", ErrUnauthorized, 401, "test unauth"},
- {"ErrForbidden", ErrForbidden, 403, "test forbidden"},
- {"ErrNotFound", ErrNotFound, 404, "test not found"},
- {"ErrConflict", ErrConflict, 409, "test conflict"},
- }
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- err := tt.fn(tt.msg)
- assert.Equal(t, tt.code, err.Code())
- assert.Equal(t, tt.msg, err.Error())
- })
- }
- }
- // TC-0265: 触发404等
- func TestCodeError_AsInterface(t *testing.T) {
- var err error = NewCodeError(404, "not found")
- var ce *CodeError
- ok := errors.As(err, &ce)
- assert.True(t, ok)
- assert.Equal(t, 404, ce.Code())
- assert.Equal(t, "not found", ce.Error())
- }
- // TC-0265: 触发404等
- func TestCodeError_NonCodeError(t *testing.T) {
- err := errors.New("internal error")
- var ce *CodeError
- ok := errors.As(err, &ce)
- assert.False(t, ok)
- }
- // TC-0265: 触发404等
- func TestSetup_ErrorHandler_CodeError(t *testing.T) {
- Setup()
- handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- httpx.ErrorCtx(r.Context(), w, ErrBadRequest("参数错误"))
- })
- req := httptest.NewRequest(http.MethodPost, "/test", nil)
- rr := httptest.NewRecorder()
- handler.ServeHTTP(rr, req)
- assert.Equal(t, http.StatusOK, rr.Code)
- var body Body
- err := json.Unmarshal(rr.Body.Bytes(), &body)
- require.NoError(t, err)
- assert.Equal(t, 400, body.Code)
- assert.Equal(t, "参数错误", body.Msg)
- assert.Nil(t, body.Data)
- }
- // TC-0266: DB异常
- func TestSetup_ErrorHandler_InternalError(t *testing.T) {
- Setup()
- handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- httpx.ErrorCtx(r.Context(), w, errors.New("db connection failed"))
- })
- req := httptest.NewRequest(http.MethodPost, "/test", nil)
- rr := httptest.NewRecorder()
- handler.ServeHTTP(rr, req)
- assert.Equal(t, http.StatusOK, rr.Code)
- var body Body
- err := json.Unmarshal(rr.Body.Bytes(), &body)
- require.NoError(t, err)
- assert.Equal(t, 500, body.Code)
- assert.Equal(t, "服务器内部错误", body.Msg)
- assert.Nil(t, body.Data)
- }
- // TC-0267: 正常请求
- func TestSetup_OkHandler_WithData(t *testing.T) {
- Setup()
- handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- httpx.OkJsonCtx(r.Context(), w, map[string]string{"key": "value"})
- })
- req := httptest.NewRequest(http.MethodPost, "/test", nil)
- rr := httptest.NewRecorder()
- handler.ServeHTTP(rr, req)
- assert.Equal(t, http.StatusOK, rr.Code)
- var body Body
- err := json.Unmarshal(rr.Body.Bytes(), &body)
- require.NoError(t, err)
- assert.Equal(t, 0, body.Code)
- assert.Equal(t, "ok", body.Msg)
- require.NotNil(t, body.Data)
- dataMap, ok := body.Data.(map[string]interface{})
- require.True(t, ok)
- assert.Equal(t, "value", dataMap["key"])
- }
- // TC-0268: 返回nil
- func TestSetup_OkHandler_NilData(t *testing.T) {
- Setup()
- handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- httpx.OkJsonCtx(r.Context(), w, nil)
- })
- req := httptest.NewRequest(http.MethodPost, "/test", nil)
- rr := httptest.NewRecorder()
- handler.ServeHTTP(rr, req)
- assert.Equal(t, http.StatusOK, rr.Code)
- var body Body
- err := json.Unmarshal(rr.Body.Bytes(), &body)
- require.NoError(t, err)
- assert.Equal(t, 0, body.Code)
- assert.Equal(t, "ok", body.Msg)
- assert.Nil(t, body.Data)
- }
|