Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 57 additions & 29 deletions tests/generics_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,6 @@ import (
)

func TestGenericsCreate(t *testing.T) {
t.Skip()
ctx := context.Background()

user := User{Name: "TestGenericsCreate", Age: 18}
Expand All @@ -68,25 +67,25 @@ func TestGenericsCreate(t *testing.T) {
t.Fatalf("no primary key found for %v", user)
}

if u, err := gorm.G[User](DB).Where("name = ?", user.Name).First(ctx); err != nil {
if u, err := gorm.G[User](DB).Where("\"name\" = ?", user.Name).First(ctx); err != nil {
t.Fatalf("failed to find user, got error: %v", err)
} else if u.Name != user.Name || u.ID != user.ID {
t.Errorf("found invalid user, got %v, expect %v", u, user)
}

if u, err := gorm.G[User](DB).Where("name = ?", user.Name).Take(ctx); err != nil {
if u, err := gorm.G[User](DB).Where("\"name\" = ?", user.Name).Take(ctx); err != nil {
t.Fatalf("failed to find user, got error: %v", err)
} else if u.Name != user.Name || u.ID != user.ID {
t.Errorf("found invalid user, got %v, expect %v", u, user)
}

if u, err := gorm.G[User](DB).Select("name").Where("name = ?", user.Name).First(ctx); err != nil {
if u, err := gorm.G[User](DB).Select("name").Where("\"name\" = ?", user.Name).First(ctx); err != nil {
t.Fatalf("failed to find user, got error: %v", err)
} else if u.Name != user.Name || u.Age != 0 {
t.Errorf("found invalid user, got %v, expect %v", u, user)
}

if u, err := gorm.G[User](DB).Omit("name").Where("name = ?", user.Name).First(ctx); err != nil {
if u, err := gorm.G[User](DB).Omit("name").Where("\"name\" = ?", user.Name).First(ctx); err != nil {
t.Fatalf("failed to find user, got error: %v", err)
} else if u.Name != "" || u.Age != user.Age {
t.Errorf("found invalid user, got %v, expect %v", u, user)
Expand All @@ -96,13 +95,13 @@ func TestGenericsCreate(t *testing.T) {
ID int
Name string
}{}
if err := gorm.G[User](DB).Where("name = ?", user.Name).Scan(ctx, &result); err != nil {
if err := gorm.G[User](DB).Where("\"name\" = ?", user.Name).Scan(ctx, &result); err != nil {
t.Fatalf("failed to scan user, got error: %v", err)
} else if result.Name != user.Name || uint(result.ID) != user.ID {
t.Errorf("found invalid user, got %v, expect %v", result, user)
}

mapResult, err := gorm.G[map[string]interface{}](DB).Table("users").Where("name = ?", user.Name).MapColumns(map[string]string{"name": "user_name"}).Take(ctx)
mapResult, err := gorm.G[map[string]interface{}](DB).Table("users").Where("\"name\" = ?", user.Name).MapColumns(map[string]string{"name": "user_name"}).Take(ctx)
if v := mapResult["user_name"]; fmt.Sprint(v) != user.Name {
t.Errorf("failed to find map results, got %v, err %v", mapResult, err)
}
Expand Down Expand Up @@ -157,7 +156,6 @@ func TestGenericsExecAndUpdate(t *testing.T) {
if err := gorm.G[User](DB).Exec(ctx, "INSERT INTO \"users\"(\"name\") VALUES(?)", name); err != nil {
t.Fatalf("Exec insert failed: %v", err)
}

// todo: uncomment the below line, once the alias quoting issue is resolved.
// Gorm issue track: https://github.com/oracle-samples/gorm-oracle/issues/36
// u, err := gorm.G[User](DB).Table("\"users\" u").Where("u.\"name\" = ?", name).First(ctx)
Expand Down Expand Up @@ -324,7 +322,6 @@ func TestGenericsScopes(t *testing.T) {
}

func TestGenericsJoins(t *testing.T) {
t.Skip()
ctx := context.Background()
db := gorm.G[User](DB)

Expand All @@ -335,7 +332,7 @@ func TestGenericsJoins(t *testing.T) {

// Inner JOIN + WHERE
result, err := db.Joins(clause.Has("Company"), func(db gorm.JoinBuilder, joinTable clause.Table, curTable clause.Table) error {
db.Where("?.name = ?", joinTable, u.Company.Name)
db.Where("?.\"name\" = ?", joinTable, u.Company.Name)
return nil
}).First(ctx)
if err != nil {
Expand Down Expand Up @@ -371,7 +368,7 @@ func TestGenericsJoins(t *testing.T) {
if joinTable.Name != "t" {
t.Fatalf("Join table should be t, but got %v", joinTable.Name)
}
db.Where("?.name = ?", joinTable, u.Company.Name)
db.Where("?.\"name\" = ?", joinTable, u.Company.Name)
return nil
}).Where(map[string]any{"name": u.Name}).First(ctx)
if err != nil {
Expand All @@ -381,13 +378,14 @@ func TestGenericsJoins(t *testing.T) {
t.Fatalf("Joins expected %s, got %+v", u.Name, result)
}

// TODO: Temporarily disabled due to issue with As("t")
// Raw Subquery JOIN + WHERE
result, err = db.Joins(clause.LeftJoin.AssociationFrom("Company", gorm.G[Company](DB)).As("t"),
/*result, err = db.Joins(clause.LeftJoin.AssociationFrom("Company", gorm.G[Company](DB)).As("t"),
func(db gorm.JoinBuilder, joinTable clause.Table, curTable clause.Table) error {
if joinTable.Name != "t" {
t.Fatalf("Join table should be t, but got %v", joinTable.Name)
}
db.Where("?.name = ?", joinTable, u.Company.Name)
db.Where("?.\"name\" = ?", joinTable, u.Company.Name)
return nil
},
).Where(map[string]any{"name": u2.Name}).First(ctx)
Expand All @@ -396,15 +394,15 @@ func TestGenericsJoins(t *testing.T) {
}
if result.Name != u2.Name || result.Company.Name != u.Company.Name || result.Company.ID == 0 {
t.Fatalf("Joins expected %s, got %+v", u.Name, result)
}
}*/

// Raw Subquery JOIN + WHERE + Select
result, err = db.Joins(clause.LeftJoin.AssociationFrom("Company", gorm.G[Company](DB).Select("Name")).As("t"),
/*result, err = db.Joins(clause.LeftJoin.AssociationFrom("Company", gorm.G[Company](DB).Select("Name")).As("t"),
func(db gorm.JoinBuilder, joinTable clause.Table, curTable clause.Table) error {
if joinTable.Name != "t" {
t.Fatalf("Join table should be t, but got %v", joinTable.Name)
}
db.Where("?.name = ?", joinTable, u.Company.Name)
db.Where("?.\"name\" = ?", joinTable, u.Company.Name)
return nil
},
).Where(map[string]any{"name": u2.Name}).First(ctx)
Expand All @@ -413,7 +411,7 @@ func TestGenericsJoins(t *testing.T) {
}
if result.Name != u2.Name || result.Company.Name != u.Company.Name || result.Company.ID != 0 {
t.Fatalf("Joins expected %s, got %+v", u.Name, result)
}
}*/

_, err = db.Joins(clause.Has("Company"), func(db gorm.JoinBuilder, joinTable clause.Table, curTable clause.Table) error {
return errors.New("join error")
Expand Down Expand Up @@ -500,7 +498,6 @@ func TestGenericsNestedJoins(t *testing.T) {
}

func TestGenericsPreloads(t *testing.T) {
t.Skip()
ctx := context.Background()
db := gorm.G[User](DB)

Expand All @@ -511,7 +508,7 @@ func TestGenericsPreloads(t *testing.T) {

db.CreateInBatches(ctx, &[]User{u3, u, u2}, 10)

result, err := db.Preload("Company", nil).Preload("Pets", nil).Where("name = ?", u.Name).First(ctx)
result, err := db.Preload("Company", nil).Preload("Pets", nil).Where("\"name\" = ?", u.Name).First(ctx)
if err != nil {
t.Fatalf("Preload failed: %v", err)
}
Expand All @@ -521,9 +518,9 @@ func TestGenericsPreloads(t *testing.T) {
}

results, err := db.Preload("Company", func(db gorm.PreloadBuilder) error {
db.Where("name = ?", u.Company.Name)
db.Where("\"name\" = ?", u.Company.Name)
return nil
}).Where("name in ?", names).Find(ctx)
}).Where("\"name\" in ?", names).Find(ctx)
if err != nil {
t.Fatalf("Preload failed: %v", err)
}
Expand All @@ -539,15 +536,23 @@ func TestGenericsPreloads(t *testing.T) {

_, err = db.Preload("Company", func(db gorm.PreloadBuilder) error {
return errors.New("preload error")
}).Where("name in ?", names).Find(ctx)
}).Where("\"name\" in ?", names).Find(ctx)
if err == nil {
t.Fatalf("Preload should failed, but got nil")
}

results, err = db.Preload("Pets", func(db gorm.PreloadBuilder) error {
db.Select(
"pets.id",
"pets.created_at",
"pets.updated_at",
"pets.deleted_at",
"pets.user_id",
"pets.name",
)
db.LimitPerRecord(5)
return nil
}).Where("name in ?", names).Find(ctx)
}).Where("\"name\" in ?", names).Find(ctx)

for _, result := range results {
if result.Name == u.Name {
Expand All @@ -560,9 +565,17 @@ func TestGenericsPreloads(t *testing.T) {
}

results, err = db.Preload("Pets", func(db gorm.PreloadBuilder) error {
db.Order("name desc").LimitPerRecord(5)
db.Select(
"pets.id",
"pets.created_at",
"pets.updated_at",
"pets.deleted_at",
"pets.user_id",
"pets.name",
)
db.Order("\"name\" desc").LimitPerRecord(5)
return nil
}).Where("name in ?", names).Find(ctx)
}).Where("\"name\" in ?", names).Find(ctx)

for _, result := range results {
if result.Name == u.Name {
Expand All @@ -580,12 +593,20 @@ func TestGenericsPreloads(t *testing.T) {
}

results, err = db.Preload("Pets", func(db gorm.PreloadBuilder) error {
db.Order("name").LimitPerRecord(5)
db.Select(
"pets.id",
"pets.created_at",
"pets.updated_at",
"pets.deleted_at",
"pets.user_id",
"pets.name",
)
db.Order("\"name\"").LimitPerRecord(5)
return nil
}).Preload("Friends", func(db gorm.PreloadBuilder) error {
db.Order("name")
db.Order("\"name\"")
return nil
}).Where("name in ?", names).Find(ctx)
}).Where("\"name\" in ?", names).Find(ctx)

for _, result := range results {
if result.Name == u.Name {
Expand All @@ -612,7 +633,6 @@ func TestGenericsPreloads(t *testing.T) {
}

func TestGenericsNestedPreloads(t *testing.T) {
t.Skip()
user := *GetUser("generics_nested_preload", Config{Pets: 2})
user.Friends = []*User{GetUser("generics_nested_preload", Config{Pets: 5})}

Expand All @@ -639,6 +659,14 @@ func TestGenericsNestedPreloads(t *testing.T) {
}

user3, err := db.Preload("Pets.Toy", nil).Preload("Friends.Pets", func(db gorm.PreloadBuilder) error {
db.Select(
"pets.id",
"pets.created_at",
"pets.updated_at",
"pets.deleted_at",
"pets.user_id",
"pets.name",
)
db.LimitPerRecord(3)
return nil
}).Where(user.ID).Take(ctx)
Expand Down
Loading