Test has many associations
This commit is contained in:
		
							parent
							
								
									43a814ae70
								
							
						
					
					
						commit
						85f3174467
					
				| @ -218,7 +218,7 @@ func SaveAfterAssociations(db *gorm.DB) { | |||||||
| 				fieldType = reflect.PtrTo(fieldType) | 				fieldType = reflect.PtrTo(fieldType) | ||||||
| 			} | 			} | ||||||
| 			elems := reflect.MakeSlice(reflect.SliceOf(fieldType), 0, 0) | 			elems := reflect.MakeSlice(reflect.SliceOf(fieldType), 0, 0) | ||||||
| 			joins := reflect.MakeSlice(reflect.SliceOf(rel.JoinTable.ModelType), 0, 0) | 			joins := reflect.MakeSlice(reflect.SliceOf(reflect.PtrTo(rel.JoinTable.ModelType)), 0, 0) | ||||||
| 			objs := []reflect.Value{} | 			objs := []reflect.Value{} | ||||||
| 
 | 
 | ||||||
| 			appendToJoins := func(obj reflect.Value, elem reflect.Value) { | 			appendToJoins := func(obj reflect.Value, elem reflect.Value) { | ||||||
|  | |||||||
							
								
								
									
										252
									
								
								tests/create.go
									
									
									
									
									
								
							
							
						
						
									
										252
									
								
								tests/create.go
									
									
									
									
									
								
							| @ -46,6 +46,9 @@ func TestCreate(t *testing.T, db *gorm.DB) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func TestCreateAssociations(t *testing.T, db *gorm.DB) { | func TestCreateAssociations(t *testing.T, db *gorm.DB) { | ||||||
|  | 	db.Migrator().DropTable(&Account{}, &Company{}, &Pet{}, &Toy{}, &Language{}) | ||||||
|  | 	db.Migrator().AutoMigrate(&Account{}, &Company{}, &Pet{}, &Toy{}, &Language{}) | ||||||
|  | 
 | ||||||
| 	TestCreateBelongsToAssociations(t, db) | 	TestCreateBelongsToAssociations(t, db) | ||||||
| 	TestCreateHasOneAssociations(t, db) | 	TestCreateHasOneAssociations(t, db) | ||||||
| 	TestCreateHasManyAssociations(t, db) | 	TestCreateHasManyAssociations(t, db) | ||||||
| @ -53,9 +56,6 @@ func TestCreateAssociations(t *testing.T, db *gorm.DB) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func TestCreateBelongsToAssociations(t *testing.T, db *gorm.DB) { | func TestCreateBelongsToAssociations(t *testing.T, db *gorm.DB) { | ||||||
| 	db.Migrator().DropTable(&Company{}) |  | ||||||
| 	db.Migrator().AutoMigrate(&Company{}) |  | ||||||
| 
 |  | ||||||
| 	check := func(t *testing.T, user User) { | 	check := func(t *testing.T, user User) { | ||||||
| 		if user.Company.Name != "" { | 		if user.Company.Name != "" { | ||||||
| 			if user.CompanyID == nil { | 			if user.CompanyID == nil { | ||||||
| @ -391,6 +391,22 @@ func TestCreateHasOneAssociations(t *testing.T, db *gorm.DB) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func TestCreateHasManyAssociations(t *testing.T, db *gorm.DB) { | func TestCreateHasManyAssociations(t *testing.T, db *gorm.DB) { | ||||||
|  | 	check := func(t *testing.T, user User) { | ||||||
|  | 		for _, pet := range user.Pets { | ||||||
|  | 			if pet.ID == 0 { | ||||||
|  | 				t.Errorf("Pet's foreign key should be saved") | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			var result Pet | ||||||
|  | 			db.First(&result, "id = ?", pet.ID) | ||||||
|  | 			if result.Name != pet.Name { | ||||||
|  | 				t.Errorf("Pet's name should be same") | ||||||
|  | 			} else if result.UserID != user.ID { | ||||||
|  | 				t.Errorf("Pet's foreign key should be saved") | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	t.Run("HasMany", func(t *testing.T) { | 	t.Run("HasMany", func(t *testing.T) { | ||||||
| 		var user = User{ | 		var user = User{ | ||||||
| 			Name:     "create", | 			Name:     "create", | ||||||
| @ -403,33 +419,91 @@ func TestCreateHasManyAssociations(t *testing.T, db *gorm.DB) { | |||||||
| 			t.Fatalf("errors happened when create: %v", err) | 			t.Fatalf("errors happened when create: %v", err) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		for idx, pet := range user.Pets { | 		check(t, user) | ||||||
| 			if pet.ID == 0 { |  | ||||||
| 				t.Fatalf("Failed to create pet #%v", idx) |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			var result Pet |  | ||||||
| 			db.First(&result, "id = ?", pet.ID) |  | ||||||
| 			if result.Name != pet.Name { |  | ||||||
| 				t.Errorf("Failed to query pet") |  | ||||||
| 			} else if result.UserID != user.ID { |  | ||||||
| 				t.Errorf("Failed to save relation") |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	}) | 	}) | ||||||
| 
 | 
 | ||||||
| 	t.Run("PolymorphicHasMany", func(t *testing.T) { | 	t.Run("HasManyForBulkInsert", func(t *testing.T) { | ||||||
| 		var user = User{ | 		var users = []User{{ | ||||||
| 			Name:     "create", | 			Name:     "create-1", | ||||||
| 			Age:      18, | 			Age:      18, | ||||||
| 			Birthday: Now(), | 			Birthday: Now(), | ||||||
| 			Toys:     []Toy{{Name: "toy1"}, {Name: "toy2"}}, | 			Pets:     []*Pet{{Name: "pet-1-1"}, {Name: "pet-1-2"}}, | ||||||
| 		} | 		}, { | ||||||
|  | 			Name:     "create-2", | ||||||
|  | 			Age:      28, | ||||||
|  | 			Birthday: Now(), | ||||||
|  | 			Pets:     []*Pet{{Name: "pet-2-1"}}, | ||||||
|  | 		}, { | ||||||
|  | 			Name:     "create-3", | ||||||
|  | 			Age:      38, | ||||||
|  | 			Birthday: Now(), | ||||||
|  | 			Pets:     []*Pet{{Name: "pet-3-1"}, {Name: "pet-3-2"}}, | ||||||
|  | 		}} | ||||||
| 
 | 
 | ||||||
| 		if err := db.Create(&user).Error; err != nil { | 		if err := db.Create(&users).Error; err != nil { | ||||||
| 			t.Fatalf("errors happened when create: %v", err) | 			t.Fatalf("errors happened when create: %v", err) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		for _, user := range users { | ||||||
|  | 			check(t, user) | ||||||
|  | 		} | ||||||
|  | 	}) | ||||||
|  | 
 | ||||||
|  | 	t.Run("HasManyForBulkInsertPtrData", func(t *testing.T) { | ||||||
|  | 		var users = []*User{{ | ||||||
|  | 			Name:     "create-1", | ||||||
|  | 			Age:      18, | ||||||
|  | 			Birthday: Now(), | ||||||
|  | 			Pets:     []*Pet{{Name: "pet-1-1"}, {Name: "pet-1-2"}}, | ||||||
|  | 		}, { | ||||||
|  | 			Name:     "create-2", | ||||||
|  | 			Age:      28, | ||||||
|  | 			Birthday: Now(), | ||||||
|  | 			Pets:     []*Pet{{Name: "pet-2-1"}}, | ||||||
|  | 		}, { | ||||||
|  | 			Name:     "create-3", | ||||||
|  | 			Age:      38, | ||||||
|  | 			Birthday: Now(), | ||||||
|  | 			Pets:     []*Pet{{Name: "pet-3-1"}, {Name: "pet-3-2"}}, | ||||||
|  | 		}} | ||||||
|  | 
 | ||||||
|  | 		if err := db.Create(&users).Error; err != nil { | ||||||
|  | 			t.Fatalf("errors happened when create: %v", err) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		for _, user := range users { | ||||||
|  | 			check(t, *user) | ||||||
|  | 		} | ||||||
|  | 	}) | ||||||
|  | 
 | ||||||
|  | 	t.Run("HasManyForBulkInsertWithoutPtr", func(t *testing.T) { | ||||||
|  | 		var users = []*User{{ | ||||||
|  | 			Name:     "create-1", | ||||||
|  | 			Age:      18, | ||||||
|  | 			Birthday: Now(), | ||||||
|  | 			Pets:     []*Pet{{Name: "pet-1-1"}, {Name: "pet-1-2"}}, | ||||||
|  | 		}, { | ||||||
|  | 			Name:     "create-2", | ||||||
|  | 			Age:      28, | ||||||
|  | 			Birthday: Now(), | ||||||
|  | 			Pets:     []*Pet{{Name: "pet-2-1"}}, | ||||||
|  | 		}, { | ||||||
|  | 			Name:     "create-3", | ||||||
|  | 			Age:      38, | ||||||
|  | 			Birthday: Now(), | ||||||
|  | 			Pets:     []*Pet{{Name: "pet-3-1"}, {Name: "pet-3-2"}}, | ||||||
|  | 		}} | ||||||
|  | 
 | ||||||
|  | 		if err := db.Create(users).Error; err != nil { | ||||||
|  | 			t.Fatalf("errors happened when create: %v", err) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		for _, user := range users { | ||||||
|  | 			check(t, *user) | ||||||
|  | 		} | ||||||
|  | 	}) | ||||||
|  | 
 | ||||||
|  | 	checkToy := func(t *testing.T, user User) { | ||||||
| 		for idx, toy := range user.Toys { | 		for idx, toy := range user.Toys { | ||||||
| 			if toy.ID == 0 { | 			if toy.ID == 0 { | ||||||
| 				t.Fatalf("Failed to create toy #%v", idx) | 				t.Fatalf("Failed to create toy #%v", idx) | ||||||
| @ -443,8 +517,142 @@ func TestCreateHasManyAssociations(t *testing.T, db *gorm.DB) { | |||||||
| 				t.Errorf("Failed to save relation") | 				t.Errorf("Failed to save relation") | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	t.Run("PolymorphicHasMany", func(t *testing.T) { | ||||||
|  | 		var user = User{ | ||||||
|  | 			Name:     "create", | ||||||
|  | 			Age:      18, | ||||||
|  | 			Birthday: Now(), | ||||||
|  | 			Toys:     []Toy{{Name: "toy1"}, {Name: "toy2"}}, | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if err := db.Create(&user).Error; err != nil { | ||||||
|  | 			t.Fatalf("errors happened when create: %v", err) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		checkToy(t, user) | ||||||
|  | 	}) | ||||||
|  | 
 | ||||||
|  | 	t.Run("PolymorphicHasManyForBulkInsert", func(t *testing.T) { | ||||||
|  | 		var users = []User{{ | ||||||
|  | 			Name:     "create-1", | ||||||
|  | 			Age:      18, | ||||||
|  | 			Birthday: Now(), | ||||||
|  | 			Toys:     []Toy{{Name: "toy-1-1"}, {Name: "toy-1-2"}}, | ||||||
|  | 		}, { | ||||||
|  | 			Name:     "create-2", | ||||||
|  | 			Age:      28, | ||||||
|  | 			Birthday: Now(), | ||||||
|  | 			Toys:     []Toy{{Name: "toy-2-1"}, {Name: "toy-2-2"}}, | ||||||
|  | 		}, { | ||||||
|  | 			Name:     "create-3", | ||||||
|  | 			Age:      38, | ||||||
|  | 			Birthday: Now(), | ||||||
|  | 			Toys:     []Toy{{Name: "toy-3-1"}, {Name: "toy-3-2"}}, | ||||||
|  | 		}} | ||||||
|  | 
 | ||||||
|  | 		if err := db.Create(&users).Error; err != nil { | ||||||
|  | 			t.Fatalf("errors happened when create: %v", err) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		for _, user := range users { | ||||||
|  | 			checkToy(t, user) | ||||||
|  | 		} | ||||||
|  | 	}) | ||||||
|  | 
 | ||||||
|  | 	t.Run("PolymorphicHasManyForBulkInsertPtrData", func(t *testing.T) { | ||||||
|  | 		var users = []*User{{ | ||||||
|  | 			Name:     "create-1", | ||||||
|  | 			Age:      18, | ||||||
|  | 			Birthday: Now(), | ||||||
|  | 			Toys:     []Toy{{Name: "toy-1-1"}, {Name: "toy-1-2"}}, | ||||||
|  | 		}, { | ||||||
|  | 			Name:     "create-2", | ||||||
|  | 			Age:      28, | ||||||
|  | 			Birthday: Now(), | ||||||
|  | 			Toys:     []Toy{{Name: "toy-2-1"}, {Name: "toy-2-2"}}, | ||||||
|  | 		}, { | ||||||
|  | 			Name:     "create-3", | ||||||
|  | 			Age:      38, | ||||||
|  | 			Birthday: Now(), | ||||||
|  | 			Toys:     []Toy{{Name: "toy-3-1"}, {Name: "toy-3-2"}}, | ||||||
|  | 		}} | ||||||
|  | 
 | ||||||
|  | 		if err := db.Create(&users).Error; err != nil { | ||||||
|  | 			t.Fatalf("errors happened when create: %v", err) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		for _, user := range users { | ||||||
|  | 			checkToy(t, *user) | ||||||
|  | 		} | ||||||
|  | 	}) | ||||||
|  | 
 | ||||||
|  | 	t.Run("PolymorphicHasManyForBulkInsertWithoutPtr", func(t *testing.T) { | ||||||
|  | 		var users = []User{{ | ||||||
|  | 			Name:     "create-1", | ||||||
|  | 			Age:      18, | ||||||
|  | 			Birthday: Now(), | ||||||
|  | 			Toys:     []Toy{{Name: "toy-1-1"}, {Name: "toy-1-2"}}, | ||||||
|  | 		}, { | ||||||
|  | 			Name:     "create-2", | ||||||
|  | 			Age:      28, | ||||||
|  | 			Birthday: Now(), | ||||||
|  | 			Toys:     []Toy{{Name: "toy-2-1"}, {Name: "toy-2-2"}}, | ||||||
|  | 		}, { | ||||||
|  | 			Name:     "create-3", | ||||||
|  | 			Age:      38, | ||||||
|  | 			Birthday: Now(), | ||||||
|  | 			Toys:     []Toy{{Name: "toy-3-1"}, {Name: "toy-3-2"}}, | ||||||
|  | 		}} | ||||||
|  | 
 | ||||||
|  | 		if err := db.Create(users).Error; err != nil { | ||||||
|  | 			t.Fatalf("errors happened when create: %v", err) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		for _, user := range users { | ||||||
|  | 			checkToy(t, user) | ||||||
|  | 		} | ||||||
| 	}) | 	}) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func TestCreateMany2ManyAssociations(t *testing.T, db *gorm.DB) { | func TestCreateMany2ManyAssociations(t *testing.T, db *gorm.DB) { | ||||||
|  | 	check := func(t *testing.T, user User) { | ||||||
|  | 		for _, language := range user.Languages { | ||||||
|  | 			var result Language | ||||||
|  | 			db.First(&result, "code = ?", language.Code) | ||||||
|  | 			// TODO
 | ||||||
|  | 			// if result.Name != language.Name {
 | ||||||
|  | 			// 	t.Errorf("Language's name should be same")
 | ||||||
|  | 			// }
 | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		for _, f := range user.Friends { | ||||||
|  | 			if f.ID == 0 { | ||||||
|  | 				t.Errorf("Friend's foreign key should be saved") | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			var result User | ||||||
|  | 			db.First(&result, "id = ?", f.ID) | ||||||
|  | 			if result.Name != f.Name { | ||||||
|  | 				t.Errorf("Friend's name should be same") | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	t.Run("Many2Many", func(t *testing.T) { | ||||||
|  | 		var user = User{ | ||||||
|  | 			Name:      "create", | ||||||
|  | 			Age:       18, | ||||||
|  | 			Birthday:  Now(), | ||||||
|  | 			Languages: []Language{{Code: "zh-CN", Name: "Chinese"}, {Code: "en", Name: "English"}}, | ||||||
|  | 			Friends:   []*User{{Name: "friend-1"}, {Name: "friend-2"}}, | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if err := db.Create(&user).Error; err != nil { | ||||||
|  | 			t.Fatalf("errors happened when create: %v", err) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		check(t, user) | ||||||
|  | 	}) | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Jinzhu
						Jinzhu