Skip to content

Commit e9cfdbc

Browse files
Add tests for named arguments (#9)
1 parent 0a842ba commit e9cfdbc

File tree

2 files changed

+146
-0
lines changed

2 files changed

+146
-0
lines changed

tests/named_argument_test.go

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,3 +118,142 @@ func TestNamedArg(t *testing.T) {
118118
t.Errorf("should return record not found error, but got %v", err)
119119
}
120120
}
121+
122+
func TestNamedArgMultipleSameParamRefs(t *testing.T) {
123+
type NamedUser struct {
124+
gorm.Model
125+
Name1 string
126+
}
127+
DB.Migrator().DropTable(&NamedUser{})
128+
DB.AutoMigrate(&NamedUser{})
129+
130+
user := NamedUser{Name1: "multi-ref"}
131+
DB.Create(&user)
132+
133+
var result NamedUser
134+
if err := DB.Raw(`SELECT * FROM "named_users" WHERE @name = @name AND "name1" = @name`,
135+
sql.Named("name", "multi-ref")).Scan(&result).Error; err != nil {
136+
t.Errorf("failed with multiple same param refs: %v", err)
137+
}
138+
tests.AssertEqual(t, result, user)
139+
}
140+
141+
func TestNamedArgNullValues(t *testing.T) {
142+
type NamedUser struct {
143+
gorm.Model
144+
Name1 *string
145+
}
146+
DB.Migrator().DropTable(&NamedUser{})
147+
DB.AutoMigrate(&NamedUser{})
148+
149+
DB.Create(&NamedUser{Name1: nil})
150+
151+
var count int64
152+
if err := DB.Raw(`SELECT count(*) FROM "named_users" WHERE (:name IS NULL AND "name1" IS NULL)`,
153+
sql.Named("name", nil)).Scan(&count).Error; err != nil {
154+
t.Errorf("failed null param test: %v", err)
155+
}
156+
if count != 1 {
157+
t.Errorf("expected 1 null record, got %d", count)
158+
}
159+
}
160+
161+
func TestNamedArgMixedNamedAndMapParams(t *testing.T) {
162+
type NamedUser struct {
163+
gorm.Model
164+
Name1 string
165+
Name2 string
166+
}
167+
DB.Migrator().DropTable(&NamedUser{})
168+
DB.AutoMigrate(&NamedUser{})
169+
170+
user := NamedUser{Name1: "n1", Name2: "n2"}
171+
DB.Create(&user)
172+
173+
var result NamedUser
174+
if err := DB.Raw(`SELECT * FROM "named_users" WHERE "name1" = @name1 AND "name2" = @name2`,
175+
sql.Named("name1", "n1"), map[string]interface{}{"name2": "n2"}).Scan(&result).Error; err != nil {
176+
t.Errorf("failed mixed param test: %v", err)
177+
}
178+
tests.AssertEqual(t, result, user)
179+
}
180+
181+
func TestNamedArgUnusedParameter(t *testing.T) {
182+
type NamedUser struct {
183+
gorm.Model
184+
Name1 string
185+
}
186+
DB.Migrator().DropTable(&NamedUser{})
187+
DB.AutoMigrate(&NamedUser{})
188+
189+
user := NamedUser{Name1: "unused"}
190+
DB.Create(&user)
191+
192+
var result NamedUser
193+
if err := DB.Raw(`SELECT * FROM "named_users" WHERE "name1" = @name1`,
194+
sql.Named("name1", "unused"), sql.Named("extra", "notused")).Scan(&result).Error; err != nil {
195+
t.Errorf("failed unused param test: %v", err)
196+
}
197+
tests.AssertEqual(t, result, user)
198+
}
199+
200+
func TestNamedArgCaseSensitivity(t *testing.T) {
201+
type NamedUser struct {
202+
gorm.Model
203+
Name1 string
204+
}
205+
DB.Migrator().DropTable(&NamedUser{})
206+
DB.AutoMigrate(&NamedUser{})
207+
208+
user := NamedUser{Name1: "CaseTest"}
209+
DB.Create(&user)
210+
211+
var result NamedUser
212+
if err := DB.Raw(`SELECT * FROM "named_users" WHERE "name1" = @Name`,
213+
sql.Named("Name", "CaseTest")).Scan(&result).Error; err != nil {
214+
t.Errorf("failed case sensitivity test: %v", err)
215+
}
216+
tests.AssertEqual(t, result, user)
217+
}
218+
219+
func TestNamedArgInClause(t *testing.T) {
220+
type NamedUser struct {
221+
gorm.Model
222+
Name1 string
223+
}
224+
DB.Migrator().DropTable(&NamedUser{})
225+
DB.AutoMigrate(&NamedUser{})
226+
227+
user1 := NamedUser{Name1: "in1"}
228+
user2 := NamedUser{Name1: "in2"}
229+
DB.Create(&user1)
230+
DB.Create(&user2)
231+
232+
var results []NamedUser
233+
if err := DB.Raw(`SELECT * FROM "named_users" WHERE "name1" IN (@n1, @n2)`,
234+
sql.Named("n1", "in1"), sql.Named("n2", "in2")).Scan(&results).Error; err != nil {
235+
t.Errorf("failed IN clause test: %v", err)
236+
}
237+
if len(results) != 2 {
238+
t.Errorf("expected 2 results, got %d", len(results))
239+
}
240+
}
241+
242+
func TestNamedArgReservedWordParam(t *testing.T) {
243+
type NamedUser struct {
244+
gorm.Model
245+
Name1 string
246+
}
247+
DB.Migrator().DropTable(&NamedUser{})
248+
DB.AutoMigrate(&NamedUser{})
249+
250+
user := NamedUser{Name1: "reserved"}
251+
DB.Create(&user)
252+
253+
var result NamedUser
254+
if err := DB.Raw(`SELECT * FROM "named_users" WHERE "name1" = @order`,
255+
sql.Named("order", "reserved")).Scan(&result).Error; err != nil {
256+
t.Errorf("failed reserved word param test: %v", err)
257+
}
258+
tests.AssertEqual(t, result, user)
259+
}

tests/passed-tests.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,13 @@ TestMigrateExistingBoolColumnPG
186186
#TestManyToManyWithCustomizedForeignKeys2
187187
#TestCompositePrimaryKeysAssociations
188188
TestNamedArg
189+
TestNamedArgMultipleSameParamRefs
190+
TestNamedArgNullValues
191+
TestNamedArgMixedNamedAndMapParams
192+
TestNamedArgUnusedParameter
193+
TestNamedArgCaseSensitivity
194+
TestNamedArgInClause
195+
TestNamedArgReservedWordParam
189196
TestNamedPolymorphic
190197
TestNonStdPrimaryKeyAndDefaultValues
191198
TestNestedPreload1

0 commit comments

Comments
 (0)