Skip to content

Commit 95240a1

Browse files
Add tests for joins (#54)
* Add tests for joins
1 parent ce6cf5b commit 95240a1

File tree

2 files changed

+141
-0
lines changed

2 files changed

+141
-0
lines changed

tests/joins_table_test.go

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

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)