
Scan interface only accept int64, float64, bool, []byte, string, time.Time or nil. When do scan, it's better to check whether the type support valuer interface and do convert.
68 lines
1.6 KiB
Go
68 lines
1.6 KiB
Go
package gorm_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/gofrs/uuid"
|
|
"github.com/jinzhu/gorm"
|
|
)
|
|
|
|
type CalculateField struct {
|
|
gorm.Model
|
|
Name string
|
|
Children []CalculateFieldChild
|
|
Category CalculateFieldCategory
|
|
EmbeddedField
|
|
}
|
|
|
|
type EmbeddedField struct {
|
|
EmbeddedName string `sql:"NOT NULL;DEFAULT:'hello'"`
|
|
}
|
|
|
|
type CalculateFieldChild struct {
|
|
gorm.Model
|
|
CalculateFieldID uint
|
|
Name string
|
|
}
|
|
|
|
type CalculateFieldCategory struct {
|
|
gorm.Model
|
|
CalculateFieldID uint
|
|
Name string
|
|
}
|
|
|
|
func TestCalculateField(t *testing.T) {
|
|
var field CalculateField
|
|
var scope = DB.NewScope(&field)
|
|
if field, ok := scope.FieldByName("Children"); !ok || field.Relationship == nil {
|
|
t.Errorf("Should calculate fields correctly for the first time")
|
|
}
|
|
|
|
if field, ok := scope.FieldByName("Category"); !ok || field.Relationship == nil {
|
|
t.Errorf("Should calculate fields correctly for the first time")
|
|
}
|
|
|
|
if field, ok := scope.FieldByName("embedded_name"); !ok {
|
|
t.Errorf("should find embedded field")
|
|
} else if _, ok := field.TagSettingsGet("NOT NULL"); !ok {
|
|
t.Errorf("should find embedded field's tag settings")
|
|
}
|
|
}
|
|
|
|
func TestFieldSet(t *testing.T) {
|
|
type TestFieldSetNullUUID struct {
|
|
NullUUID uuid.NullUUID
|
|
}
|
|
scope := DB.NewScope(&TestFieldSetNullUUID{})
|
|
field := scope.Fields()[0]
|
|
err := field.Set(uuid.FromStringOrNil("3034d44a-da03-11e8-b366-4a00070b9f00"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if id, ok := field.Field.Addr().Interface().(*uuid.NullUUID); !ok {
|
|
t.Fatal()
|
|
} else if !id.Valid || id.UUID.String() != "3034d44a-da03-11e8-b366-4a00070b9f00" {
|
|
t.Fatal(id)
|
|
}
|
|
}
|