Skip to content

Commit e7d94b8

Browse files
committed
add basic association tests for BelongsTo, HasMany, and ManyToMany
1 parent 5c2eed8 commit e7d94b8

File tree

1 file changed

+153
-2
lines changed

1 file changed

+153
-2
lines changed

tests/associations_test.go

Lines changed: 153 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -367,8 +367,8 @@ func TestAssociationEmptyQueryClause(t *testing.T) {
367367
Organizations []Organization `gorm:"many2many:region_orgs;"`
368368
}
369369
type RegionOrg struct {
370-
RegionId uint
371-
OrganizationId uint
370+
RegionID uint
371+
OrganizationID uint
372372
Empty myType
373373
}
374374
if err := DB.SetupJoinTable(&Region{}, "Organizations", &RegionOrg{}); err != nil {
@@ -394,3 +394,154 @@ func TestAssociationEmptyQueryClause(t *testing.T) {
394394
tests.AssertEqual(t, len(orgs), 0)
395395
}
396396
}
397+
398+
func TestBasicBelongsToAssociation(t *testing.T) {
399+
// Test basic BelongsTo association operations
400+
user := GetUser("TestBelongsTo", Config{Company: true})
401+
402+
if err := DB.Create(&user).Error; err != nil {
403+
t.Fatalf("Failed to create user with company: %v", err)
404+
}
405+
406+
// finding the association
407+
var foundUser User
408+
if err := DB.Preload("Company").First(&foundUser, "\"id\" = ?", user.ID).Error; err != nil {
409+
t.Fatalf("Failed to find user with company: %v", err)
410+
}
411+
412+
if foundUser.Company.ID != user.Company.ID {
413+
t.Fatalf("Company ID mismatch: expected %d, got %d", user.Company.ID, foundUser.Company.ID)
414+
}
415+
416+
// association count
417+
AssertAssociationCount(t, user, "Company", 1, "after creation")
418+
419+
// replacing association
420+
newCompany := Company{Name: "New Test Company"}
421+
if err := DB.Create(&newCompany).Error; err != nil {
422+
t.Fatalf("Failed to create new company: %v", err)
423+
}
424+
425+
if err := DB.Model(&user).Association("Company").Replace(&newCompany); err != nil {
426+
t.Fatalf("Failed to replace company association: %v", err)
427+
}
428+
429+
var updatedUser User
430+
if err := DB.Preload("Company").First(&updatedUser, "\"id\" = ?", user.ID).Error; err != nil {
431+
t.Fatalf("Failed to find updated user: %v", err)
432+
}
433+
434+
if updatedUser.Company.ID != newCompany.ID {
435+
t.Fatalf("Company was not replaced: expected %d, got %d", newCompany.ID, updatedUser.Company.ID)
436+
}
437+
}
438+
439+
func TestBasicHasManyAssociation(t *testing.T) {
440+
// Test basic HasMany association operations
441+
user := GetUser("TestHasMany", Config{Pets: 3})
442+
443+
if err := DB.Create(&user).Error; err != nil {
444+
t.Fatalf("Failed to create user with pets: %v", err)
445+
}
446+
447+
// association count
448+
AssertAssociationCount(t, user, "Pets", 3, "after creation")
449+
450+
// finding pets
451+
var pets []Pet
452+
if err := DB.Model(&user).Association("Pets").Find(&pets); err != nil {
453+
t.Fatalf("Failed to find pets: %v", err)
454+
}
455+
456+
if len(pets) != 3 {
457+
t.Fatalf("Expected 3 pets, got %d", len(pets))
458+
}
459+
460+
// appending new pet
461+
newPet := Pet{Name: "Additional Pet", UserID: &user.ID}
462+
if err := DB.Model(&user).Association("Pets").Append(&newPet); err != nil {
463+
t.Fatalf("Failed to append pet: %v", err)
464+
}
465+
466+
AssertAssociationCount(t, user, "Pets", 4, "after append")
467+
468+
// deleting one pet from association
469+
if err := DB.Model(&user).Association("Pets").Delete(&pets[0]); err != nil {
470+
t.Fatalf("Failed to delete pet from association: %v", err)
471+
}
472+
473+
AssertAssociationCount(t, user, "Pets", 3, "after delete")
474+
}
475+
476+
func TestBasicManyToManyAssociation(t *testing.T) {
477+
// Test basic ManyToMany association operations
478+
user := GetUser("TestManyToMany", Config{Languages: 2})
479+
480+
if err := DB.Create(&user).Error; err != nil {
481+
t.Fatalf("Failed to create user with languages: %v", err)
482+
}
483+
484+
// association count
485+
AssertAssociationCount(t, user, "Languages", 2, "after creation")
486+
487+
// finding languages
488+
var languages []Language
489+
if err := DB.Model(&user).Association("Languages").Find(&languages); err != nil {
490+
t.Fatalf("Failed to find languages: %v", err)
491+
}
492+
493+
if len(languages) != 2 {
494+
t.Fatalf("Expected 2 languages, got %d", len(languages))
495+
}
496+
497+
// appending new language
498+
newLanguage := Language{Code: "FR", Name: "French"}
499+
if err := DB.Create(&newLanguage).Error; err != nil {
500+
t.Fatalf("Failed to create new language: %v", err)
501+
}
502+
503+
if err := DB.Model(&user).Association("Languages").Append(&newLanguage); err != nil {
504+
t.Fatalf("Failed to append language: %v", err)
505+
}
506+
507+
AssertAssociationCount(t, user, "Languages", 3, "after append")
508+
509+
// replacing all languages
510+
replaceLanguages := []Language{
511+
{Code: "DE", Name: "German"},
512+
{Code: "IT", Name: "Italian"},
513+
}
514+
515+
for i := range replaceLanguages {
516+
if err := DB.Create(&replaceLanguages[i]).Error; err != nil {
517+
t.Fatalf("Failed to create replacement language: %v", err)
518+
}
519+
}
520+
521+
if err := DB.Model(&user).Association("Languages").Replace(replaceLanguages); err != nil {
522+
t.Fatalf("Failed to replace languages: %v", err)
523+
}
524+
525+
AssertAssociationCount(t, user, "Languages", 2, "after replace")
526+
527+
var finalLanguages []Language
528+
if err := DB.Model(&user).Association("Languages").Find(&finalLanguages); err != nil {
529+
t.Fatalf("Failed to find final languages: %v", err)
530+
}
531+
532+
languageCodes := make(map[string]bool)
533+
for _, lang := range finalLanguages {
534+
languageCodes[lang.Code] = true
535+
}
536+
537+
if !languageCodes["DE"] || !languageCodes["IT"] {
538+
t.Fatal("Languages were not replaced correctly")
539+
}
540+
541+
// clearing all associations
542+
if err := DB.Model(&user).Association("Languages").Clear(); err != nil {
543+
t.Fatalf("Failed to clear languages: %v", err)
544+
}
545+
546+
AssertAssociationCount(t, user, "Languages", 0, "after clear")
547+
}

0 commit comments

Comments
 (0)