fix type alias AutoMigrate bug(Add Test Case) (#4888)
* fix type alias AutoMigrate bug. eg
```go
package main
type IDer interface{ GetID() int64 }
// ID will add some method to implement some interface eg: GetID
type ID int64
func (z ID) GetID() int64 { return int64(z) }
type Test struct {
	ID
	Code string `gorm:"size:50"`
	Name string `gorm:"size:50"`
}
func main() {
	db, err := gorm.Open(postgres.New(postgres.Config{
		DSN: `dsn`,
		PreferSimpleProtocol: false,
	}), &gorm.Config{
		Logger:                 logger.Default.LogMode(logger.Info),
		SkipDefaultTransaction: true,
	})
	if err != nil {
		log.Fatal(err)
	}
	if err = db.AutoMigrate(&Test{}); err != nil {
		// invalid embedded struct for Test's field ID, should be struct, but got main.ID
		log.Fatal(err)
	}
}
```
* fix type alias AutoMigrate bug. eg
```go
package main
type IDer interface{ GetID() int64 }
// ID will add some method to implement some interface eg: GetID
type ID int64
func (z ID) GetID() int64 { return int64(z) }
type Test struct {
	ID
	Code string `gorm:"size:50"`
	Name string `gorm:"size:50"`
}
func main() {
	db, err := gorm.Open(postgres.New(postgres.Config{
		DSN:                  `dsn`,
		PreferSimpleProtocol: false,
	}), &gorm.Config{
		Logger:                 logger.Default.LogMode(logger.Info),
		SkipDefaultTransaction: true,
	})
	if err != nil {
		log.Fatal(err)
	}
	if err = db.AutoMigrate(&Test{}); err != nil {
		// invalid embedded struct for Test's field ID, should be struct, but got main.ID
		log.Fatal(err)
	}
}
```
* Add typealis test.
* try to fix golangci-lint
			
			
This commit is contained in:
		
							parent
							
								
									2a578d767f
								
							
						
					
					
						commit
						380cc64ff5
					
				| @ -347,7 +347,9 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field { | ||||
| 	} | ||||
| 
 | ||||
| 	if _, ok := field.TagSettings["EMBEDDED"]; ok || (fieldStruct.Anonymous && !isValuer && (field.Creatable || field.Updatable || field.Readable)) { | ||||
| 		if reflect.Indirect(fieldValue).Kind() == reflect.Struct { | ||||
| 		kind := reflect.Indirect(fieldValue).Kind() | ||||
| 		switch kind { | ||||
| 		case reflect.Struct: | ||||
| 			var err error | ||||
| 			field.Creatable = false | ||||
| 			field.Updatable = false | ||||
| @ -396,7 +398,8 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field { | ||||
| 					ef.TagSettings[k] = v | ||||
| 				} | ||||
| 			} | ||||
| 		} else { | ||||
| 		case reflect.Invalid, reflect.Uintptr, reflect.Array, reflect.Chan,          reflect.Func,      reflect.Interface, | ||||
| 		     reflect.Map,     reflect.Ptr,     reflect.Slice, reflect.UnsafePointer, reflect.Complex64, reflect.Complex128: | ||||
| 			schema.err = fmt.Errorf("invalid embedded struct for %s's field %s, should be struct, but got %v", field.Schema.Name, field.Name, field.FieldType) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| @ -244,7 +244,7 @@ func TestParseFieldWithPermission(t *testing.T) { | ||||
| 		t.Fatalf("Failed to parse user with permission, got error %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	fields := []schema.Field{ | ||||
| 	fields := []*schema.Field{ | ||||
| 		{Name: "ID", DBName: "id", BindNames: []string{"ID"}, DataType: schema.Uint, PrimaryKey: true, Size: 64, Creatable: true, Updatable: true, Readable: true, HasDefaultValue: true, AutoIncrement: true}, | ||||
| 		{Name: "Name", DBName: "", BindNames: []string{"Name"}, DataType: "", Tag: `gorm:"-"`, Creatable: false, Updatable: false, Readable: false}, | ||||
| 		{Name: "Name2", DBName: "name2", BindNames: []string{"Name2"}, DataType: schema.String, Tag: `gorm:"->"`, Creatable: false, Updatable: false, Readable: true}, | ||||
| @ -257,6 +257,68 @@ func TestParseFieldWithPermission(t *testing.T) { | ||||
| 	} | ||||
| 
 | ||||
| 	for _, f := range fields { | ||||
| 		checkSchemaField(t, user, &f, func(f *schema.Field) {}) | ||||
| 		checkSchemaField(t, user, f, func(f *schema.Field) {}) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| type ID int64 | ||||
| type INT int | ||||
| type INT8 int8 | ||||
| type INT16 int16 | ||||
| type INT32 int32 | ||||
| type INT64 int64 | ||||
| type UINT uint | ||||
| type UINT8 uint8 | ||||
| type UINT16 uint16 | ||||
| type UINT32 uint32 | ||||
| type UINT64 uint64 | ||||
| type FLOAT32 float32 | ||||
| type FLOAT64 float64 | ||||
| type BOOL bool | ||||
| type STRING string | ||||
| type TypeAlias struct { | ||||
| 	ID | ||||
| 	INT     `gorm:"column:fint"` | ||||
| 	INT8    `gorm:"column:fint8"` | ||||
| 	INT16   `gorm:"column:fint16"` | ||||
| 	INT32   `gorm:"column:fint32"` | ||||
| 	INT64   `gorm:"column:fint64"` | ||||
| 	UINT    `gorm:"column:fuint"` | ||||
| 	UINT8   `gorm:"column:fuint8"` | ||||
| 	UINT16  `gorm:"column:fuint16"` | ||||
| 	UINT32  `gorm:"column:fuint32"` | ||||
| 	UINT64  `gorm:"column:fuint64"` | ||||
| 	FLOAT32 `gorm:"column:ffloat32"` | ||||
| 	FLOAT64 `gorm:"column:ffloat64"` | ||||
| 	BOOL    `gorm:"column:fbool"` | ||||
| 	STRING  `gorm:"column:fstring"` | ||||
| } | ||||
| 
 | ||||
| func TestTypeAliasField(t *testing.T){ | ||||
| 	alias, err := schema.Parse(&TypeAlias{}, &sync.Map{}, schema.NamingStrategy{}) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("Failed to parse TypeAlias with permission, got error %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	fields := []*schema.Field{ | ||||
| 		{Name: "ID",      DBName: "id",       BindNames: []string{"ID"},      DataType: schema.Int   , Creatable: true, Updatable: true, Readable: true, Size: 64, PrimaryKey: true, HasDefaultValue: true, AutoIncrement: true }, | ||||
| 		{Name: "INT",     DBName: "fint",     BindNames: []string{"INT"},     DataType: schema.Int   , Creatable: true, Updatable: true, Readable: true, Size: 64, Tag: `gorm:"column:fint"`}, | ||||
| 		{Name: "INT8",    DBName: "fint8",    BindNames: []string{"INT8"},    DataType: schema.Int   , Creatable: true, Updatable: true, Readable: true, Size: 8,  Tag: `gorm:"column:fint8"`}, | ||||
| 		{Name: "INT16",   DBName: "fint16",   BindNames: []string{"INT16"},   DataType: schema.Int   , Creatable: true, Updatable: true, Readable: true, Size: 16, Tag: `gorm:"column:fint16"`}, | ||||
| 		{Name: "INT32",   DBName: "fint32",   BindNames: []string{"INT32"},   DataType: schema.Int   , Creatable: true, Updatable: true, Readable: true, Size: 32, Tag: `gorm:"column:fint32"`}, | ||||
| 		{Name: "INT64",   DBName: "fint64",   BindNames: []string{"INT64"},   DataType: schema.Int   , Creatable: true, Updatable: true, Readable: true, Size: 64, Tag: `gorm:"column:fint64"`}, | ||||
| 		{Name: "UINT",    DBName: "fuint",    BindNames: []string{"UINT"},    DataType: schema.Uint  , Creatable: true, Updatable: true, Readable: true, Size: 64, Tag: `gorm:"column:fuint"`}, | ||||
| 		{Name: "UINT8",   DBName: "fuint8",   BindNames: []string{"UINT8"},   DataType: schema.Uint  , Creatable: true, Updatable: true, Readable: true, Size: 8,  Tag: `gorm:"column:fuint8"`}, | ||||
| 		{Name: "UINT16",  DBName: "fuint16",  BindNames: []string{"UINT16"},  DataType: schema.Uint  , Creatable: true, Updatable: true, Readable: true, Size: 16, Tag: `gorm:"column:fuint16"`}, | ||||
| 		{Name: "UINT32",  DBName: "fuint32",  BindNames: []string{"UINT32"},  DataType: schema.Uint  , Creatable: true, Updatable: true, Readable: true, Size: 32, Tag: `gorm:"column:fuint32"`}, | ||||
| 		{Name: "UINT64",  DBName: "fuint64",  BindNames: []string{"UINT64"},  DataType: schema.Uint  , Creatable: true, Updatable: true, Readable: true, Size: 64, Tag: `gorm:"column:fuint64"`}, | ||||
| 		{Name: "FLOAT32", DBName: "ffloat32", BindNames: []string{"FLOAT32"}, DataType: schema.Float , Creatable: true, Updatable: true, Readable: true, Size: 32, Tag: `gorm:"column:ffloat32"`}, | ||||
| 		{Name: "FLOAT64", DBName: "ffloat64", BindNames: []string{"FLOAT64"}, DataType: schema.Float , Creatable: true, Updatable: true, Readable: true, Size: 64, Tag: `gorm:"column:ffloat64"`}, | ||||
| 		{Name: "BOOL",    DBName: "fbool",    BindNames: []string{"BOOL"},    DataType: schema.Bool  , Creatable: true, Updatable: true, Readable: true, Tag: `gorm:"column:fbool"`}, | ||||
| 		{Name: "STRING",  DBName: "fstring",  BindNames: []string{"STRING"},  DataType: schema.String, Creatable: true, Updatable: true, Readable: true, Tag: `gorm:"column:fstring"`}, | ||||
| 	} | ||||
| 
 | ||||
| 	for _, f := range fields { | ||||
| 		checkSchemaField(t, alias, f, func(f *schema.Field) {}) | ||||
| 	} | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 piyongcai
						piyongcai