Skip to content
Snippets Groups Projects
Commit 050cf597 authored by Pavel Antonov's avatar Pavel Antonov :asterisk:
Browse files

Merge branch 'fix/PRXS-3273-IntrospectEncodeErrorCatch' into 'master'

Добавлен возврат исходных данных при ошибке кодирования/декодирования в методе `Introspect` в `ClientEncodeMiddleware`

See merge request perxis/perxis-go!466
parents d5d63c0a c47b0a34
No related branches found
No related tags found
No related merge requests found
...@@ -31,18 +31,21 @@ func (m *encodeDecodeMiddleware) Introspect(ctx context.Context, item *items.Ite ...@@ -31,18 +31,21 @@ func (m *encodeDecodeMiddleware) Introspect(ctx context.Context, item *items.Ite
return nil, nil, err return nil, nil, err
} }
if item, err = item.Encode(ctx, coll.Schema); err != nil { encoded, err := item.Encode(ctx, coll.Schema)
return if err != nil {
// Возвращаем исходные данные для возможности обработки полей с ошибками.
return item, coll.Schema, err
} }
itm, sch, err = m.next.Introspect(ctx, item, opts...) introspected, sch, err := m.next.Introspect(ctx, encoded, opts...)
if itm != nil && sch != nil { if introspected != nil && sch != nil {
var err error var err error
if itm, err = itm.Decode(ctx, sch); err != nil { if introspected, err = introspected.Decode(ctx, sch); err != nil {
return nil, nil, err // Возвращаем исходные данные для возможности обработки полей с ошибками.
return item, coll.Schema, err
} }
} }
return itm, sch, err return introspected, sch, err
} }
......
package middleware
import (
"context"
"testing"
"time"
"git.perx.ru/perxis/perxis-go/pkg/collections"
collectionsmocks "git.perx.ru/perxis/perxis-go/pkg/collections/mocks"
"git.perx.ru/perxis/perxis-go/pkg/items"
itemsmocks "git.perx.ru/perxis/perxis-go/pkg/items/mocks"
"git.perx.ru/perxis/perxis-go/pkg/schema"
"git.perx.ru/perxis/perxis-go/pkg/schema/field"
"git.perx.ru/perxis/perxis-go/pkg/schema/modify"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
)
func TestEncodeDecodeMiddleware_Introspect(t *testing.T) {
t.Run("Successful", func(t *testing.T) {
sch := schema.New(
"date", field.Time(),
)
itemsMock := itemsmocks.NewItems(t)
itemsMock.On("Introspect", mock.Anything, mock.Anything).Return(&items.Item{
ID: "",
SpaceID: "space",
EnvID: "env",
CollectionID: "coll",
Data: map[string]any{
"date": time.Date(2025, 12, 1, 0, 0, 0, 0, time.UTC),
},
}, sch, nil).Once()
collectionsMock := collectionsmocks.NewCollections(t)
collectionsMock.On("Get", mock.Anything, "space", "env", "coll").Return(&collections.Collection{
ID: "coll",
SpaceID: "space",
EnvID: "env",
Schema: sch,
}, nil).Once()
middleware := ClientEncodeMiddleware(collectionsMock)(itemsMock)
item, sch, err := middleware.Introspect(context.Background(), &items.Item{
ID: "id",
SpaceID: "space",
EnvID: "env",
CollectionID: "coll",
})
require.NoError(t, err)
assert.Equal(t, map[string]any{"date": time.Date(2025, 12, 1, 0, 0, 0, 0, time.UTC)}, item.Data)
assert.NotNil(t, sch)
})
t.Run("Error during encoding", func(t *testing.T) {
sch := schema.New(
"date", field.Time(),
)
itemsMock := itemsmocks.NewItems(t)
collectionsMock := collectionsmocks.NewCollections(t)
collectionsMock.On("Get", mock.Anything, "space", "env", "coll").Return(&collections.Collection{
ID: "coll",
SpaceID: "space",
EnvID: "env",
Schema: sch,
}, nil).Once()
middleware := ClientEncodeMiddleware(collectionsMock)(itemsMock)
item, sch, err := middleware.Introspect(context.Background(), &items.Item{
ID: "",
SpaceID: "space",
EnvID: "env",
CollectionID: "coll",
Data: map[string]any{
"date": "invalid date",
},
})
require.EqualError(
t,
err,
"encode error: 1 error occurred:\n\t* field 'date': TimeType: encode: unsupported value type : \"string\"\n\n",
)
assert.Equal(t,
map[string]any{
"date": "invalid date",
},
item.Data,
"При возникновении ошибки декодирования в ответе должны быть возвращены исходные данные",
)
assert.NotNil(t, sch)
})
t.Run("Error during decoding", func(t *testing.T) {
sch := schema.New(
"num", field.Number(field.NumberFormatInt),
"str", field.String().AddOptions(modify.Value("num")),
)
itemsMock := itemsmocks.NewItems(t)
itemsMock.On("Introspect", mock.Anything, mock.Anything).Return(&items.Item{
ID: "id",
SpaceID: "space",
EnvID: "env",
CollectionID: "coll",
Data: map[string]any{
"num": 100,
"str": 100,
},
}, sch, nil).Once()
collectionsMock := collectionsmocks.NewCollections(t)
collectionsMock.On("Get", mock.Anything, "space", "env", "coll").Return(&collections.Collection{
ID: "coll",
SpaceID: "space",
EnvID: "env",
Schema: sch,
}, nil).Once()
middleware := ClientEncodeMiddleware(collectionsMock)(itemsMock)
item, sch, err := middleware.Introspect(context.Background(), &items.Item{
ID: "id",
SpaceID: "space",
EnvID: "env",
CollectionID: "coll",
Data: map[string]any{
"num": 100,
},
})
require.EqualError(
t,
err,
"decode error: 1 error occurred:\n\t* field 'str': StringField decode error: unsupported value type : \"int\"\n\n",
)
assert.Equal(t,
map[string]any{
"num": 100,
},
item.Data,
"При возникновении ошибки кодирования в ответе должны быть возвращены исходные данные",
)
assert.NotNil(t, sch)
})
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment