From b9c0c0f8b5b7fbf92478787ee06fb87dab111f24 Mon Sep 17 00:00:00 2001 From: Xinyan Lu Date: Wed, 12 Jul 2023 00:29:42 +0800 Subject: [PATCH] feat: add detail type mismatch info in number fields check (#3386) (#3387) --- core/mapping/unmarshaler.go | 6 +++++- core/mapping/unmarshaler_test.go | 27 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/core/mapping/unmarshaler.go b/core/mapping/unmarshaler.go index d753d246..24920338 100644 --- a/core/mapping/unmarshaler.go +++ b/core/mapping/unmarshaler.go @@ -618,7 +618,7 @@ func (u *Unmarshaler) processFieldPrimitiveWithJSONNumber(fieldType reflect.Type target.SetFloat(fValue) default: - return newTypeMismatchError(fullName) + return newTypeMismatchErrorWithHint(fullName, value.Type().String(), typeKind.String()) } SetValue(fieldType, value, target) @@ -1054,6 +1054,10 @@ func newTypeMismatchError(name string) error { return fmt.Errorf("type mismatch for field %q", name) } +func newTypeMismatchErrorWithHint(name, errorType, rightType string) error { + return fmt.Errorf("type mismatch for field %q, expected %q, got %q", name, rightType, errorType) +} + func readKeys(key string) []string { cacheKeysLock.Lock() keys, ok := cacheKeys[key] diff --git a/core/mapping/unmarshaler_test.go b/core/mapping/unmarshaler_test.go index 72038e4e..fae6f3ef 100644 --- a/core/mapping/unmarshaler_test.go +++ b/core/mapping/unmarshaler_test.go @@ -3,6 +3,7 @@ package mapping import ( "encoding/json" "fmt" + "reflect" "strconv" "strings" "testing" @@ -4981,6 +4982,32 @@ func TestUnmarshaler_Unmarshal(t *testing.T) { }) } +// TestUnmarshalerProcessFieldPrimitiveWithJSONNumber test the number type check. +func TestUnmarshalerProcessFieldPrimitiveWithJSONNumber(t *testing.T) { + t.Run("wrong type", func(t *testing.T) { + expectValue := "1" + realValue := 1 + fieldType := reflect.TypeOf(expectValue) + value := reflect.ValueOf(&realValue) // pass a pointer to the value + v := json.Number(expectValue) + m := NewUnmarshaler("field") + err := m.processFieldPrimitiveWithJSONNumber(fieldType, value.Elem(), v, &fieldOptionsWithContext{}, "field") + assert.Error(t, err) + assert.Equal(t, "type mismatch for field \"field\", expected \"string\", got \"int\"", err.Error()) + }) + t.Run("right type", func(t *testing.T) { + expectValue := int64(1) + realValue := int64(1) + fieldType := reflect.TypeOf(expectValue) + value := reflect.ValueOf(&realValue) // pass a pointer to the value + v := json.Number(strconv.FormatInt(expectValue, 10)) + m := NewUnmarshaler("field") + err := m.processFieldPrimitiveWithJSONNumber(fieldType, value.Elem(), v, &fieldOptionsWithContext{}, "field") + assert.NoError(t, err) + }) + +} + func TestGetValueWithChainedKeys(t *testing.T) { t.Run("no key", func(t *testing.T) { _, ok := getValueWithChainedKeys(nil, []string{})