From 04987758acfb72840585cc21a5b93f020ed75963 Mon Sep 17 00:00:00 2001 From: ko_oler <kooler89@gmail.com> Date: Tue, 10 Oct 2023 11:50:22 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BF?= =?UTF-8?q?=D0=BE=20=D0=9F=D0=A0:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20JSON,=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B0=20=D0=B4=D0=BB=D1=8F?= =?UTF-8?q?=20uint64?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/schema/field/number.go | 3 ++ pkg/schema/field/number_test.go | 5 +-- pkg/schema/test/object_test.go | 60 +++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 2 deletions(-) diff --git a/pkg/schema/field/number.go b/pkg/schema/field/number.go index 1075ef2b..d8dc218f 100644 --- a/pkg/schema/field/number.go +++ b/pkg/schema/field/number.go @@ -90,6 +90,9 @@ func (NumberType) decode(_ context.Context, field *Field, v interface{}) (interf case int64: return i, nil case uint64: + if i > maxInt { + return nil, errors.New("integer out of range") + } return i, nil case float64: if i > maxInt || i < minInt { diff --git a/pkg/schema/field/number_test.go b/pkg/schema/field/number_test.go index 79709166..da154cd0 100644 --- a/pkg/schema/field/number_test.go +++ b/pkg/schema/field/number_test.go @@ -1,6 +1,7 @@ package field import ( + "context" "math" "reflect" "testing" @@ -42,7 +43,7 @@ func TestNumberField_Decode(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := Decode(nil, tt.field, tt.data) + got, err := Decode(context.Background(), tt.field, tt.data) if (err != nil) != tt.wantErr { t.Errorf("Decode() error = %v, wantErr %v", err, tt.wantErr) return @@ -82,7 +83,7 @@ func TestNumberField_Encode(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := Encode(nil, tt.field, tt.data) + got, err := Encode(context.Background(), tt.field, tt.data) if (err != nil) != tt.wantErr { t.Errorf("Decode() error = %v, wantErr %v", err, tt.wantErr) return diff --git a/pkg/schema/test/object_test.go b/pkg/schema/test/object_test.go index e5af975c..4d9d13a5 100644 --- a/pkg/schema/test/object_test.go +++ b/pkg/schema/test/object_test.go @@ -74,6 +74,66 @@ func TestNumberField_JSON(t *testing.T) { assert.Equal(t, fld, res) } +func TestNumberField_JSON_With_MaxInt(t *testing.T) { + t.Run("Without overflow from int64", func(t *testing.T) { + fld := field.Object("num", field.Number(field.NumberFormatInt)) + + itemData := map[string]interface{}{"num": 1<<53 - 1} + + b, err := json.Marshal(itemData) + require.NoError(t, err) + + itemDataToDecode := make(map[string]interface{}) + require.NoError(t, json.Unmarshal(b, &itemDataToDecode)) + + _, err = field.Decode(context.Background(), fld, itemDataToDecode) + require.NoError(t, err) + }) + t.Run("With overflow from int64", func(t *testing.T) { + fld := field.Object("num", field.Number(field.NumberFormatInt)) + + itemData := map[string]interface{}{"num": 1 << 53} + + b, err := json.Marshal(itemData) + require.NoError(t, err) + + itemDataToDecode := make(map[string]interface{}) + require.NoError(t, json.Unmarshal(b, &itemDataToDecode)) + + _, err = field.Decode(context.Background(), fld, itemDataToDecode) + require.Error(t, err, "integer out of range") + }) + t.Run("With overflow from uint64", func(t *testing.T) { + fld := field.Object("num", field.Number(field.NumberFormatInt)) + + itemData := map[string]interface{}{"num": uint64(1 << 53)} + + b, err := json.Marshal(itemData) + require.NoError(t, err) + + itemDataToDecode := make(map[string]interface{}) + require.NoError(t, json.Unmarshal(b, &itemDataToDecode)) + + _, err = field.Decode(context.Background(), fld, itemDataToDecode) + require.Error(t, err, "integer out of range") + }) + t.Run("With overflow from float64", func(t *testing.T) { + fld := field.Object("num", field.Number(field.NumberFormatInt)) + + itemData := map[string]interface{}{"num": float64(1 << 53)} + + b, err := json.Marshal(itemData) + require.NoError(t, err) + + itemDataToDecode := make(map[string]interface{}) + require.NoError(t, json.Unmarshal(b, &itemDataToDecode)) + + _, err = field.Decode(context.Background(), fld, itemDataToDecode) + require.Error(t, err, "integer out of range") + }) + +} + func TestSchema_JSON(t *testing.T) { enumStr := field.String().AddOptions( validate.Enum( -- GitLab