Put wrapped errors into the detailed field on serialization (#20846)

Этот коммит содержится в:
Tim Scheuermann
2022-08-18 14:22:12 +02:00
коммит произвёл GitHub
родитель 53985ef162
Коммит e665542c91
3 изменённых файлов: 68 добавлений и 1 удалений

Просмотреть файл

@@ -928,7 +928,7 @@ func TestPatchPost(t *testing.T) {
t.Run("invalid requests", func(t *testing.T) {
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")
patch := &model.PostPatch{}

Просмотреть файл

@@ -265,10 +265,30 @@ func (er *AppError) SystemMessage(T i18n.TranslateFunc) 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)
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 {
return er.wrapped
}

Просмотреть файл

@@ -5,6 +5,7 @@ package model
import (
"bytes"
"errors"
"fmt"
"net/http"
"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) {
itemKey := "item1"
originalMap := make(map[string]string)