Skip to content

Commit cb41758

Browse files
committed
Merge branch 'main' into query_tests_fix
2 parents 91e2a3c + 6c0137a commit cb41758

File tree

8 files changed

+447
-30
lines changed

8 files changed

+447
-30
lines changed

tests/joins_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ func TestJoinWithSoftDeleted(t *testing.T) {
259259

260260
var user1 User
261261
DB.Model(&User{}).Joins("NamedPet").Joins("Account").First(&user1, user.ID)
262-
if user1.NamedPet == nil || user1.Account.ID == 0 {
262+
if user1.NamedPet.ID == 0 || user1.Account.ID == 0 {
263263
t.Fatalf("joins NamedPet and Account should not empty:%v", user1)
264264
}
265265

@@ -268,17 +268,17 @@ func TestJoinWithSoftDeleted(t *testing.T) {
268268

269269
var user2 User
270270
DB.Model(&User{}).Joins("NamedPet").Joins("Account").First(&user2, user.ID)
271-
if user2.NamedPet == nil || user2.Account.ID != 0 {
272-
t.Fatalf("joins Account should not empty:%v", user2)
271+
if user2.NamedPet.ID == 0 || user2.Account.ID != 0 {
272+
t.Fatalf("joins Account should be empty:%v", user2)
273273
}
274274

275275
// NamedPet should empty
276276
DB.Delete(&user1.NamedPet)
277277

278278
var user3 User
279279
DB.Model(&User{}).Joins("NamedPet").Joins("Account").First(&user3, user.ID)
280-
if user3.NamedPet != nil || user2.Account.ID != 0 {
281-
t.Fatalf("joins NamedPet and Account should not empty:%v", user2)
280+
if user3.NamedPet.ID != 0 || user3.Account.ID != 0 {
281+
t.Fatalf("joins NamedPet and Account should be empty:%v", user3)
282282
}
283283
}
284284

tests/main_test.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ package tests
4141
import (
4242
"fmt"
4343
"testing"
44+
"time"
45+
"strings"
4446

4547
. "github.com/oracle-samples/gorm-oracle/tests/utils"
4648
)
@@ -90,3 +92,65 @@ func TestSetAndGet(t *testing.T) {
9092
t.Errorf("Get non existing key should return error")
9193
}
9294
}
95+
96+
func TestUserInsertScenarios(t *testing.T) {
97+
type UserWithAge struct {
98+
ID uint `gorm:"column:ID;primaryKey"`
99+
Name string `gorm:"column:NAME;not null;size:100"`
100+
Age int `gorm:"column:AGE"`
101+
}
102+
103+
if err := DB.AutoMigrate(&UserWithAge{}); err != nil {
104+
t.Fatalf("Failed to migrate table: %v", err)
105+
}
106+
107+
user1 := UserWithAge{Name: "Alice", Age: 30}
108+
if err := DB.Create(&user1).Error; err != nil {
109+
t.Errorf("Basic insert failed: %v", err)
110+
}
111+
112+
user2 := UserWithAge{Name: "Bob"}
113+
if err := DB.Create(&user2).Error; err != nil {
114+
t.Errorf("Insert with NULL failed: %v", err)
115+
}
116+
117+
user3 := UserWithAge{Name: "O'Reilly", Age: 45}
118+
if err := DB.Create(&user3).Error; err != nil {
119+
t.Errorf("Insert with special characters failed: %v", err)
120+
}
121+
122+
type UserWithTime struct {
123+
ID uint `gorm:"column:ID;primaryKey"`
124+
Name string `gorm:"column:NAME;not null;size:100"`
125+
CreatedAt time.Time `gorm:"column:CREATED_AT"`
126+
}
127+
128+
if err := DB.AutoMigrate(&UserWithTime{}); err != nil {
129+
t.Fatalf("Failed to migrate UserWithTime table: %v", err)
130+
}
131+
132+
user4 := UserWithTime{Name: "Charlie"}
133+
if err := DB.Create(&user4).Error; err != nil {
134+
t.Errorf("Insert with default timestamp failed: %v", err)
135+
}
136+
137+
invalidUser1 := UserWithAge{Age: 50}
138+
if err := DB.Create(&invalidUser1).Error; err == nil {
139+
t.Errorf("Expected NOT NULL constraint failure, got no error")
140+
}
141+
142+
invalidUser2 := UserWithAge{ID: user1.ID, Name: "Duplicate", Age: 40}
143+
if err := DB.Create(&invalidUser2).Error; err == nil {
144+
t.Errorf("Expected duplicate primary key error, got no error")
145+
}
146+
147+
invalidUser3 := UserWithAge{Name: "InvalidAge", Age: -10}
148+
if err := DB.Create(&invalidUser3).Error; err != nil {
149+
t.Logf("Insert with negative age failed as expected: %v", err)
150+
}
151+
152+
invalidUser4 := UserWithAge{Name: strings.Repeat("A", 300), Age: 20}
153+
if err := DB.Create(&invalidUser4).Error; err == nil {
154+
t.Errorf("Expected value too large error for oversized string, got no error")
155+
}
156+
}

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: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ TestCreateWithAutoIncrementCompositeKey
6868
TestCreateOnConflictWithDefaultNull
6969
TestCreateFromMapWithoutPK
7070
TestCreateFromMapWithTable
71-
#TestCustomizeColumn
71+
TestCustomizeColumn
7272
TestCustomColumnAndIgnoredFieldClash
7373
TestCustomizeField
7474
TestDefaultValue
@@ -142,7 +142,7 @@ TestJoinOn
142142
TestJoinsWithSelect
143143
TestJoinWithOmit
144144
TestJoinCount
145-
#TestJoinWithSoftDeleted
145+
TestJoinWithSoftDeleted
146146
TestInnerJoins
147147
TestJoinWithSameColumnName
148148
TestJoinArgsWithDB
@@ -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
@@ -212,15 +219,15 @@ TestNilPointerSlice
212219
TestNilPointerSlice2
213220
TestPrefixedPreloadDuplication
214221
TestPreloadManyToManyCallbacks
215-
#TestPreloadWithAssociations
216-
#TestNestedPreload
222+
TestPreloadWithAssociations
223+
TestNestedPreload
217224
TestNestedPreloadForSlice
218225
#TestPreloadWithConds
219-
#TestNestedPreloadWithConds
226+
TestNestedPreloadWithConds
220227
TestPreloadEmptyData
221228
TestPreloadGoroutine
222-
#TestPreloadWithDiffModel
223-
#TestNestedPreloadWithUnscoped
229+
TestPreloadWithDiffModel
230+
TestNestedPreloadWithUnscoped
224231
TestNestedPreloadWithNestedJoin
225232
#TestMergeNestedPreloadWithNestedJoin
226233
TestNestedPreloadWithPointerJoin
@@ -370,7 +377,7 @@ TestDistinctWithVaryingCase
370377
#TestDistinctWithAggregation
371378
TestUpsertWithSave
372379
TestFindOrInitialize
373-
#TestFindOrCreate
380+
TestFindOrCreate
374381
TestUpdateWithMissWhere
375382
BenchmarkCreate
376383
BenchmarkFind
@@ -379,3 +386,8 @@ BenchmarkScanSlice
379386
BenchmarkScanSlicePointer
380387
BenchmarkUpdate
381388
BenchmarkDelete
389+
TestRawQueryInjection
390+
TestWhereClauseInjection
391+
TestUpdateInjection
392+
TestFirstOrCreateInjection
393+
TestUserInsertScenarios

0 commit comments

Comments
 (0)