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()) assert.Equal(t, 2, err.ShowType()) } // 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()) assert.Equal(t, 2, err.ShowType()) }) } } // 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.False(t, body.Success) assert.Equal(t, 400, body.ErrorCode) assert.Equal(t, "参数错误", body.ErrorMessage) assert.Equal(t, 2, body.ShowType) 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.False(t, body.Success) assert.Equal(t, 500, body.ErrorCode) assert.Equal(t, "服务器内部错误", body.ErrorMessage) assert.Equal(t, 2, body.ShowType) 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.True(t, body.Success) assert.Equal(t, 0, body.ErrorCode) 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.True(t, body.Success) assert.Equal(t, 0, body.ErrorCode) assert.Nil(t, body.Data) }