Put wrapped errors into the detailed field on serialization (#20846)
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
53985ef162
Коммит
e665542c91
@@ -928,7 +928,7 @@ func TestPatchPost(t *testing.T) {
|
|||||||
|
|
||||||
t.Run("invalid requests", func(t *testing.T) {
|
t.Run("invalid requests", func(t *testing.T) {
|
||||||
r, err := client.DoAPIPut("/posts/"+post.Id+"/patch", "garbage")
|
r, err := client.DoAPIPut("/posts/"+post.Id+"/patch", "garbage")
|
||||||
require.EqualError(t, err, ": Invalid or missing post in request body.")
|
require.EqualError(t, err, ": Invalid or missing post in request body., invalid character 'g' looking for beginning of value")
|
||||||
require.Equal(t, http.StatusBadRequest, r.StatusCode, "wrong status code")
|
require.Equal(t, http.StatusBadRequest, r.StatusCode, "wrong status code")
|
||||||
|
|
||||||
patch := &model.PostPatch{}
|
patch := &model.PostPatch{}
|
||||||
|
|||||||
@@ -265,10 +265,30 @@ func (er *AppError) SystemMessage(T i18n.TranslateFunc) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (er *AppError) ToJSON() string {
|
func (er *AppError) ToJSON() string {
|
||||||
|
// turn the wrapped error into a detailed message
|
||||||
|
detailed := er.DetailedError
|
||||||
|
defer func() {
|
||||||
|
er.DetailedError = detailed
|
||||||
|
}()
|
||||||
|
|
||||||
|
er.wrappedToDetailed()
|
||||||
|
|
||||||
b, _ := json.Marshal(er)
|
b, _ := json.Marshal(er)
|
||||||
return string(b)
|
return string(b)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (er *AppError) wrappedToDetailed() {
|
||||||
|
if er.wrapped == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if er.DetailedError != "" {
|
||||||
|
er.DetailedError += ", "
|
||||||
|
}
|
||||||
|
|
||||||
|
er.DetailedError += er.wrapped.Error()
|
||||||
|
}
|
||||||
|
|
||||||
func (er *AppError) Unwrap() error {
|
func (er *AppError) Unwrap() error {
|
||||||
return er.wrapped
|
return er.wrapped
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ package model
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"reflect"
|
"reflect"
|
||||||
@@ -112,6 +113,52 @@ func TestAppErrorRender(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestAppErrorSerialize(t *testing.T) {
|
||||||
|
t.Run("Normal", func(t *testing.T) {
|
||||||
|
aerr := NewAppError("", "message", nil, "", http.StatusTeapot)
|
||||||
|
js := aerr.ToJSON()
|
||||||
|
berr := AppErrorFromJSON(strings.NewReader(js))
|
||||||
|
require.Equal(t, "message", berr.Id)
|
||||||
|
require.Empty(t, berr.DetailedError)
|
||||||
|
require.Equal(t, http.StatusTeapot, berr.StatusCode)
|
||||||
|
|
||||||
|
require.EqualError(t, berr, aerr.Error())
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("Detailed", func(t *testing.T) {
|
||||||
|
aerr := NewAppError("", "message", nil, "detail", http.StatusTeapot)
|
||||||
|
js := aerr.ToJSON()
|
||||||
|
berr := AppErrorFromJSON(strings.NewReader(js))
|
||||||
|
require.Equal(t, "message", berr.Id)
|
||||||
|
require.Equal(t, "detail", berr.DetailedError)
|
||||||
|
require.Equal(t, http.StatusTeapot, berr.StatusCode)
|
||||||
|
|
||||||
|
require.EqualError(t, berr, aerr.Error())
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("Wrapped", func(t *testing.T) {
|
||||||
|
aerr := NewAppError("", "message", nil, "", http.StatusTeapot).Wrap(errors.New("wrapped"))
|
||||||
|
js := aerr.ToJSON()
|
||||||
|
berr := AppErrorFromJSON(strings.NewReader(js))
|
||||||
|
require.Equal(t, "message", berr.Id)
|
||||||
|
require.Equal(t, "wrapped", berr.DetailedError)
|
||||||
|
require.Equal(t, http.StatusTeapot, berr.StatusCode)
|
||||||
|
|
||||||
|
require.EqualError(t, berr, aerr.Error())
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("Detailed + Wrapped", func(t *testing.T) {
|
||||||
|
aerr := NewAppError("", "message", nil, "detail", http.StatusTeapot).Wrap(errors.New("wrapped"))
|
||||||
|
js := aerr.ToJSON()
|
||||||
|
berr := AppErrorFromJSON(strings.NewReader(js))
|
||||||
|
require.Equal(t, "message", berr.Id)
|
||||||
|
require.Equal(t, "detail, wrapped", berr.DetailedError)
|
||||||
|
require.Equal(t, http.StatusTeapot, berr.StatusCode)
|
||||||
|
|
||||||
|
require.EqualError(t, berr, aerr.Error())
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestCopyStringMap(t *testing.T) {
|
func TestCopyStringMap(t *testing.T) {
|
||||||
itemKey := "item1"
|
itemKey := "item1"
|
||||||
originalMap := make(map[string]string)
|
originalMap := make(map[string]string)
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user