From 5f6d85c00a0c68efca5b6a124e1fb47d5512e90c Mon Sep 17 00:00:00 2001 From: Jinzhu Date: Tue, 15 Feb 2022 20:47:22 +0800 Subject: [PATCH] Add serializer test --- schema/field.go | 5 ++++- schema/interfaces.go | 2 +- tests/serializer_test.go | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 tests/serializer_test.go diff --git a/schema/field.go b/schema/field.go index 2865e5c9..d11c555e 100644 --- a/schema/field.go +++ b/schema/field.go @@ -175,10 +175,13 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field { } else if name, ok := field.TagSettings["SERIALIZER"]; ok { field.DataType = String if strings.ToLower(name) == "json" { - field.Serializer = &JSONSerializer{} + field.Serializer = JSONSerializer{} } else { schema.err = fmt.Errorf("invalid serializer type %v", name) } + } else if _, ok := field.TagSettings["JSON"]; ok { + field.DataType = String + field.Serializer = JSONSerializer{} } if num, ok := field.TagSettings["AUTOINCREMENTINCREMENT"]; ok { diff --git a/schema/interfaces.go b/schema/interfaces.go index f83ba9c1..b0ad19b4 100644 --- a/schema/interfaces.go +++ b/schema/interfaces.go @@ -77,7 +77,7 @@ func (JSONSerializer) Scan(ctx context.Context, field *Field, dst reflect.Value, // Value implements serializer interface func (JSONSerializer) Value(ctx context.Context, field *Field, dst reflect.Value, fieldValue interface{}) (interface{}, error) { - return fieldValue, nil + return json.Marshal(fieldValue) } // CreateClausesInterface create clauses interface diff --git a/tests/serializer_test.go b/tests/serializer_test.go new file mode 100644 index 00000000..29ac5c8f --- /dev/null +++ b/tests/serializer_test.go @@ -0,0 +1,37 @@ +package tests_test + +import ( + "testing" + + "gorm.io/gorm" + . "gorm.io/gorm/utils/tests" +) + +type SerializerStruct struct { + gorm.Model + Name []byte `gorm:"json"` + Roles Roles `gorm:"json"` +} + +type Roles []string + +func TestSerializerJSON(t *testing.T) { + DB.Migrator().DropTable(&SerializerStruct{}) + if err := DB.Migrator().AutoMigrate(&SerializerStruct{}); err != nil { + t.Fatalf("no error should happen when migrate scanner, valuer struct, got error %v", err) + } + + data := SerializerStruct{ + Name: []byte("jinzhu"), + Roles: []string{"r1", "r2"}, + } + + if err := DB.Create(&data).Error; err != nil { + t.Fatalf("failed to create data, got error %v", err) + } + + var result SerializerStruct + DB.First(&result, data.ID) + + AssertEqual(t, result, data) +}