gorm/tests/joins.go

82 lines
2.3 KiB
Go

package tests
import (
"testing"
"github.com/jinzhu/gorm"
)
func TestJoins(t *testing.T, db *gorm.DB) {
db.Migrator().DropTable(&User{}, &Account{}, &Company{})
db.AutoMigrate(&User{}, &Account{}, &Company{})
check := func(t *testing.T, oldUser, newUser User) {
if newUser.Company.ID != oldUser.Company.ID {
t.Errorf("Company is not equal when load with joins, loaded company id: %v", newUser.Company.ID)
}
if newUser.Manager == nil || newUser.Manager.ID != oldUser.Manager.ID {
t.Errorf("Manager is not equal when load with joins: loaded manager: %+v", newUser.Manager)
}
if newUser.Account.ID != oldUser.Account.ID {
t.Errorf("Account is not equal when load with joins, loaded account id: %v, expect: %v", newUser.Account.ID, oldUser.Account.ID)
}
}
t.Run("Joins", func(t *testing.T) {
user := User{
Name: "joins-1",
Company: Company{Name: "company"},
Manager: &User{Name: "manager"},
Account: Account{Number: "account-has-one-association"},
}
db.Create(&user)
var user2 User
if err := db.Joins("Company").Joins("Manager").Joins("Account").First(&user2, "users.name = ?", user.Name).Error; err != nil {
t.Fatalf("Failed to load with joins, got error: %v", err)
}
check(t, user, user2)
})
t.Run("JoinsForSlice", func(t *testing.T) {
users := []User{{
Name: "slice-joins-1",
Company: Company{Name: "company"},
Manager: &User{Name: "manager"},
Account: Account{Number: "account-has-one-association"},
}, {
Name: "slice-joins-2",
Company: Company{Name: "company2"},
Manager: &User{Name: "manager2"},
Account: Account{Number: "account-has-one-association2"},
}, {
Name: "slice-joins-3",
Company: Company{Name: "company3"},
Manager: &User{Name: "manager3"},
Account: Account{Number: "account-has-one-association3"},
}}
db.Create(&users)
var users2 []User
if err := db.Joins("Company").Joins("Manager").Joins("Account").Find(&users2, "users.name LIKE ?", "slice-joins%").Error; err != nil {
t.Fatalf("Failed to load with joins, got error: %v", err)
} else if len(users2) != len(users) {
t.Fatalf("Failed to load join users, got: %v, expect: %v", len(users2), len(users))
}
for _, u2 := range users2 {
for _, u := range users {
if u.Name == u2.Name {
check(t, u, u2)
continue
}
}
}
})
}