Skip to content

Commit 2aabe09

Browse files
Add tests for joins
1 parent da1a1f2 commit 2aabe09

File tree

2 files changed

+144
-0
lines changed

2 files changed

+144
-0
lines changed

tests/joins_table_test.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,3 +152,60 @@ func TestOverrideJoinTable(t *testing.T) {
152152
t.Errorf("person's addresses expects 2, got %v", count)
153153
}
154154
}
155+
156+
func TestOverrideJoinTableInvalidAssociation(t *testing.T) {
157+
DB.Migrator().DropTable(&Person{}, &Address{}, &PersonAddress{})
158+
if err := DB.SetupJoinTable(&Person{}, "Addresses", &PersonAddress{}); err != nil {
159+
t.Fatalf("Failed to setup join table for person, got error %v", err)
160+
}
161+
if err := DB.AutoMigrate(&Person{}, &Address{}); err != nil {
162+
t.Fatalf("Failed to migrate, got %v", err)
163+
}
164+
165+
person := Person{Name: "invalid-assoc"}
166+
DB.Create(&person)
167+
168+
err := DB.Model(&person).Association("NonExistent").Find(&[]Address{})
169+
if err == nil {
170+
t.Fatalf("Expected error when accessing non-existent association, got nil")
171+
}
172+
}
173+
174+
func TestOverrideJoinTableClearWithoutAssociations(t *testing.T) {
175+
DB.Migrator().DropTable(&Person{}, &Address{}, &PersonAddress{})
176+
if err := DB.SetupJoinTable(&Person{}, "Addresses", &PersonAddress{}); err != nil {
177+
t.Fatalf("Failed to setup join table for person, got error %v", err)
178+
}
179+
if err := DB.AutoMigrate(&Person{}, &Address{}); err != nil {
180+
t.Fatalf("Failed to migrate, got %v", err)
181+
}
182+
183+
person := Person{Name: "no-assoc"}
184+
DB.Create(&person)
185+
186+
if err := DB.Model(&person).Association("Addresses").Clear(); err != nil {
187+
t.Fatalf("Expected no error clearing empty associations, got %v", err)
188+
}
189+
190+
if count := DB.Model(&person).Association("Addresses").Count(); count != 0 {
191+
t.Fatalf("Expected 0 associations, got %v", count)
192+
}
193+
}
194+
195+
func TestOverrideJoinTableDeleteNonExistentAssociation(t *testing.T) {
196+
DB.Migrator().DropTable(&Person{}, &Address{}, &PersonAddress{})
197+
if err := DB.SetupJoinTable(&Person{}, "Addresses", &PersonAddress{}); err != nil {
198+
t.Fatalf("Failed to setup join table for person, got error %v", err)
199+
}
200+
if err := DB.AutoMigrate(&Person{}, &Address{}); err != nil {
201+
t.Fatalf("Failed to migrate, got %v", err)
202+
}
203+
204+
address := Address{Name: "non-existent"}
205+
person := Person{Name: "test-delete"}
206+
DB.Create(&person)
207+
208+
if err := DB.Model(&person).Association("Addresses").Delete(&address); err != nil {
209+
t.Fatalf("Expected no error when deleting non-existent association, got %v", err)
210+
}
211+
}

tests/joins_test.go

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,3 +516,90 @@ func TestJoinsPreload_Issue7013_NoEntries(t *testing.T) {
516516

517517
tests.AssertEqual(t, len(entries), 0)
518518
}
519+
520+
type JoinCompany struct {
521+
ID int64 `gorm:"column:id;primaryKey"`
522+
Name string `gorm:"column:name"`
523+
}
524+
525+
type JoinUser struct {
526+
ID int64 `gorm:"column:id;primaryKey"`
527+
Name string `gorm:"column:name"`
528+
CompanyID int64 `gorm:"column:company_id"`
529+
Company JoinCompany `gorm:"foreignKey:CompanyID"`
530+
}
531+
532+
func TestJoinWithOrderLimit(t *testing.T) {
533+
_ = DB.Migrator().DropTable(&JoinUser{}, &JoinCompany{})
534+
if err := DB.Migrator().CreateTable(&JoinCompany{}, &JoinUser{}); err != nil {
535+
t.Fatalf("failed to create tables: %v", err)
536+
}
537+
538+
company := JoinCompany{Name: "TestCompany"}
539+
if err := DB.Create(&company).Error; err != nil {
540+
t.Fatalf("failed to insert company: %v", err)
541+
}
542+
543+
users := []JoinUser{
544+
{Name: "order-limit-1", CompanyID: company.ID},
545+
{Name: "order-limit-2", CompanyID: company.ID},
546+
}
547+
if err := DB.Create(&users).Error; err != nil {
548+
t.Fatalf("failed to insert users: %v", err)
549+
}
550+
551+
var result []JoinUser
552+
err := DB.
553+
Joins("Company").
554+
Order("\"join_users\".\"id\" DESC").
555+
Limit(1).
556+
Find(&result).Error
557+
558+
if err != nil {
559+
t.Fatalf("unexpected error: %v", err)
560+
}
561+
if len(result) != 1 {
562+
t.Errorf("expected 1 result with limit, got %d", len(result))
563+
}
564+
}
565+
566+
func TestJoinOnNilDB(t *testing.T) {
567+
var users []JoinUser
568+
var nilDB *gorm.DB
569+
570+
defer func() {
571+
if r := recover(); r == nil {
572+
t.Errorf("expected panic when calling Joins on nil DB, got none")
573+
}
574+
}()
575+
576+
nilDB.Joins("Company").Find(&users)
577+
}
578+
579+
func TestJoinNonExistentRelation(t *testing.T) {
580+
var user JoinUser
581+
err := DB.Joins("NonExistentRelation").First(&user).Error
582+
if err == nil {
583+
t.Errorf("expected error when joining on non-existent relation, got nil")
584+
}
585+
}
586+
587+
func TestJoinAmbiguousColumnError(t *testing.T) {
588+
var result []JoinUser
589+
err := DB.Table("join_users").
590+
Select("id"). // ambiguous since multiple tables have id
591+
Joins("join companies on companies.id = join_users.company_id").
592+
Scan(&result).Error
593+
594+
if err == nil {
595+
t.Errorf("expected error for ambiguous column selection, got nil")
596+
}
597+
}
598+
599+
func TestJoinInvalidSQL(t *testing.T) {
600+
var users []JoinUser
601+
err := DB.Joins("LEFT JOIN invalid_table ON").Find(&users).Error
602+
if err == nil {
603+
t.Errorf("expected SQL error for invalid join, got nil")
604+
}
605+
}

0 commit comments

Comments
 (0)