@@ -134,16 +134,25 @@ func TestGenericsCreateInBatches(t *testing.T) {
134
134
}
135
135
136
136
found , err := gorm.G [User ](DB ).Raw ("SELECT * FROM \" users\" WHERE \" name\" LIKE ?" , "GenericsCreateInBatches%" ).Find (ctx )
137
+ if err != nil {
138
+ t .Fatalf ("Raw Find failed: %v" , err )
139
+ }
137
140
if len (found ) != len (batch ) {
138
141
t .Errorf ("expected %d from Raw Find, got %d" , len (batch ), len (found ))
139
142
}
140
143
141
144
found , err = gorm.G [User ](DB ).Where ("\" name\" like ?" , "GenericsCreateInBatches%" ).Limit (2 ).Find (ctx )
145
+ if err != nil {
146
+ t .Fatalf ("Raw Find failed: %v" , err )
147
+ }
142
148
if len (found ) != 2 {
143
149
t .Errorf ("expected %d from Raw Find, got %d" , 2 , len (found ))
144
150
}
145
151
146
152
found , err = gorm.G [User ](DB ).Where ("\" name\" like ?" , "GenericsCreateInBatches%" ).Offset (2 ).Limit (2 ).Find (ctx )
153
+ if err != nil {
154
+ t .Fatalf ("Raw Find failed: %v" , err )
155
+ }
147
156
if len (found ) != 1 {
148
157
t .Errorf ("expected %d from Raw Find, got %d" , 1 , len (found ))
149
158
}
@@ -168,7 +177,9 @@ func TestGenericsExecAndUpdate(t *testing.T) {
168
177
169
178
name += "Update"
170
179
rows , err := gorm.G [User ](DB ).Where ("\" id\" = ?" , u .ID ).Update (ctx , "name" , name )
171
- if rows != 1 {
180
+ if err != nil {
181
+ t .Fatalf ("Update failed: %v" , err )
182
+ } else if rows != 1 {
172
183
t .Fatalf ("failed to get affected rows, got %d, should be %d" , rows , 1 )
173
184
}
174
185
@@ -180,7 +191,9 @@ func TestGenericsExecAndUpdate(t *testing.T) {
180
191
}
181
192
182
193
rows , err = gorm.G [User ](DB ).Where ("\" id\" = ?" , u .ID ).Updates (ctx , User {Name : "GenericsExecUpdates" , Age : 18 })
183
- if rows != 1 {
194
+ if err != nil {
195
+ t .Fatalf ("Updates failed: %v" , err )
196
+ } else if rows != 1 {
184
197
t .Fatalf ("failed to get affected rows, got %d, should be %d" , rows , 1 )
185
198
}
186
199
@@ -251,6 +264,37 @@ func TestGenericsDelete(t *testing.T) {
251
264
if err != gorm .ErrRecordNotFound {
252
265
t .Fatalf ("User after delete failed: %v" , err )
253
266
}
267
+
268
+ u2 := User {Name : "GenericsDeleteCond" }
269
+ if err := gorm.G [User ](DB ).Create (ctx , & u2 ); err != nil {
270
+ t .Fatalf ("Create failed: %v" , err )
271
+ }
272
+ rows , err = gorm.G [User ](DB ).Where ("\" name\" = ?" , "GenericsDeleteCond" ).Delete (ctx )
273
+ if err != nil {
274
+ t .Fatalf ("Conditional delete failed: %v" , err )
275
+ }
276
+ if rows != 1 {
277
+ t .Fatalf ("Conditional delete failed, err=%v, rows=%d" , err , rows )
278
+ }
279
+ _ , err = gorm.G [User ](DB ).Where ("\" id\" = ?" , u2 .ID ).First (ctx )
280
+ if err != gorm .ErrRecordNotFound {
281
+ t .Errorf ("Expected deleted record to be gone, got: %v" , err )
282
+ }
283
+
284
+ users := []User {
285
+ {Name : "GenericsBatchDel1" },
286
+ {Name : "GenericsBatchDel2" },
287
+ }
288
+ if err := gorm.G [User ](DB ).CreateInBatches (ctx , & users , 2 ); err != nil {
289
+ t .Fatalf ("Batch create for delete failed: %v" , err )
290
+ }
291
+ rows , err = gorm.G [User ](DB ).Where ("\" name\" LIKE ?" , "GenericsBatchDel%" ).Delete (ctx )
292
+ if err != nil {
293
+ t .Fatalf ("Batch delete failed: %v" , err )
294
+ }
295
+ if rows != 2 {
296
+ t .Errorf ("batch delete expected 2 rows, got %d" , rows )
297
+ }
254
298
}
255
299
256
300
func TestGenericsFindInBatches (t * testing.T ) {
@@ -301,20 +345,23 @@ func TestGenericsScopes(t *testing.T) {
301
345
results , err := gorm.G [User ](DB ).Scopes (filterName1 ).Find (ctx )
302
346
if err != nil {
303
347
t .Fatalf ("Scopes failed: %v" , err )
304
- }
305
- if len (results ) != 1 || results [0 ].Name != "GenericsScopes1" {
348
+ } else if len (results ) != 1 || results [0 ].Name != "GenericsScopes1" {
306
349
t .Fatalf ("Scopes expected 1, got %d" , len (results ))
307
350
}
308
351
309
352
notResult , err := gorm.G [User ](DB ).Where ("\" name\" like ?" , "GenericsScopes%" ).Not ("\" name\" = ?" , "GenericsScopes1" ).Order ("\" name\" " ).Find (ctx )
310
- if len (notResult ) != 2 {
353
+ if err != nil {
354
+ t .Fatalf ("Not failed: %v" , err )
355
+ } else if len (notResult ) != 2 {
311
356
t .Fatalf ("expected 2 results, got %d" , len (notResult ))
312
357
} else if notResult [0 ].Name != "GenericsScopes2" || notResult [1 ].Name != "GenericsScopes3" {
313
358
t .Fatalf ("expected names 'GenericsScopes2' and 'GenericsScopes3', got %s and %s" , notResult [0 ].Name , notResult [1 ].Name )
314
359
}
315
360
316
361
orResult , err := gorm.G [User ](DB ).Or ("\" name\" = ?" , "GenericsScopes1" ).Or ("\" name\" = ?" , "GenericsScopes2" ).Order ("\" name\" " ).Find (ctx )
317
- if len (orResult ) != 2 {
362
+ if err != nil {
363
+ t .Fatalf ("Or failed: %v" , err )
364
+ } else if len (orResult ) != 2 {
318
365
t .Fatalf ("expected 2 results, got %d" , len (notResult ))
319
366
} else if orResult [0 ].Name != "GenericsScopes1" || orResult [1 ].Name != "GenericsScopes2" {
320
367
t .Fatalf ("expected names 'GenericsScopes2' and 'GenericsScopes3', got %s and %s" , orResult [0 ].Name , orResult [1 ].Name )
@@ -554,6 +601,9 @@ func TestGenericsPreloads(t *testing.T) {
554
601
return nil
555
602
}).Where ("\" name\" in ?" , names ).Find (ctx )
556
603
604
+ if err != nil {
605
+ t .Fatalf ("Preload failed: %v" , err )
606
+ }
557
607
for _ , result := range results {
558
608
if result .Name == u .Name {
559
609
if len (result .Pets ) != len (u .Pets ) {
@@ -577,6 +627,9 @@ func TestGenericsPreloads(t *testing.T) {
577
627
return nil
578
628
}).Where ("\" name\" in ?" , names ).Find (ctx )
579
629
630
+ if err != nil {
631
+ t .Fatalf ("Preload failed: %v" , err )
632
+ }
580
633
for _ , result := range results {
581
634
if result .Name == u .Name {
582
635
if len (result .Pets ) != len (u .Pets ) {
@@ -608,6 +661,9 @@ func TestGenericsPreloads(t *testing.T) {
608
661
return nil
609
662
}).Where ("\" name\" in ?" , names ).Find (ctx )
610
663
664
+ if err != nil {
665
+ t .Fatalf ("Preload failed: %v" , err )
666
+ }
611
667
for _ , result := range results {
612
668
if result .Name == u .Name {
613
669
if len (result .Pets ) != len (u .Pets ) {
@@ -868,6 +924,9 @@ func TestGenericsWithTransaction(t *testing.T) {
868
924
869
925
users := []User {{Name : "TestGenericsTransaction" , Age : 18 }, {Name : "TestGenericsTransaction2" , Age : 18 }}
870
926
err := gorm.G [User ](tx ).CreateInBatches (ctx , & users , 2 )
927
+ if err != nil {
928
+ t .Fatalf ("CreateInBatches failed: %v" , err )
929
+ }
871
930
872
931
count , err := gorm.G [User ](tx ).Where ("\" name\" like ?" , "TestGenericsTransaction%" ).Count (ctx , "*" )
873
932
if err != nil {
@@ -897,7 +956,95 @@ func TestGenericsToSQL(t *testing.T) {
897
956
return tx
898
957
})
899
958
900
- if ! regexp .MustCompile (" SELECT \\ * FROM .users..* 10" ).MatchString (sql ) {
959
+ if ! regexp .MustCompile (` SELECT \* FROM .users..* 10` ).MatchString (sql ) {
901
960
t .Errorf ("ToSQL: got wrong sql with Generics API %v" , sql )
902
961
}
903
962
}
963
+
964
+ func TestGenericsCountOmitSelect (t * testing.T ) {
965
+ ctx := context .Background ()
966
+ users := []User {{Name : "GenericsCount1" , Age : 5 }, {Name : "GenericsCount2" , Age : 7 }}
967
+ err := gorm.G [User ](DB ).CreateInBatches (ctx , & users , 2 )
968
+ if err != nil {
969
+ t .Fatalf ("CreateInBatches failed: %v" , err )
970
+ }
971
+ count , err := gorm.G [User ](DB ).Omit ("age" ).Where ("\" name\" LIKE ?" , "GenericsCount%" ).Count (ctx , "*" )
972
+ if err != nil {
973
+ t .Fatalf ("Count failed: %v" , err )
974
+ }
975
+ if count != 2 {
976
+ t .Errorf ("Count with Omit: expected 2, got %d" , count )
977
+ }
978
+ }
979
+
980
+ func TestGenericsSelectAndOmitFind (t * testing.T ) {
981
+ ctx := context .Background ()
982
+ u := User {Name : "GenericsSelectOmit" , Age : 30 }
983
+ err := gorm.G [User ](DB ).Create (ctx , & u )
984
+ if err != nil {
985
+ t .Fatalf ("Create failed: %v" , err )
986
+ }
987
+ result , err := gorm.G [User ](DB ).Select ("id" ).Omit ("age" ).Where ("\" name\" = ?" , u .Name ).First (ctx )
988
+ if err != nil {
989
+ t .Fatalf ("Select and Omit Find failed: %v" , err )
990
+ }
991
+ if result .ID != u .ID || result .Name != "" || result .Age != 0 {
992
+ t .Errorf ("SelectAndOmitFind expects partial zero values, got: %+v" , result )
993
+ }
994
+ }
995
+
996
+ func TestGenericsSelectWithPreloadAssociations (t * testing.T ) {
997
+ ctx := context .Background ()
998
+ user := User {Name : "SelectPreloadCombo" , Age : 40 , Company : Company {Name : "ComboCompany" }}
999
+ for i := 1 ; i <= 2 ; i ++ {
1000
+ user .Pets = append (user .Pets , & Pet {Name : fmt .Sprintf ("Pet-%d" , i )})
1001
+ }
1002
+ if err := gorm.G [User ](DB ).Create (ctx , & user ); err != nil {
1003
+ t .Fatalf ("Create failed: %v" , err )
1004
+ }
1005
+ result , err := gorm.G [User ](DB ).Select ("id" , "name" , "company_id" ).Preload ("Company" , nil ).Preload ("Pets" , nil ).Where ("\" name\" = ?" , user .Name ).First (ctx )
1006
+ if err != nil {
1007
+ t .Fatalf ("Select+Preload First failed: %v" , err )
1008
+ }
1009
+ if result .ID == 0 || result .Name == "" {
1010
+ t .Errorf ("Expected user id/name; got: %+v" , result )
1011
+ }
1012
+ if result .Age != 0 {
1013
+ t .Errorf ("Expected omitted Age=0, got %d" , result .Age )
1014
+ }
1015
+ if result .Company .Name != user .Company .Name {
1016
+ t .Errorf ("Expected company %+v, got %+v" , user .Company , result .Company )
1017
+ }
1018
+ if len (result .Pets ) != len (user .Pets ) {
1019
+ t .Errorf ("Expected %d pets, got %d" , len (user .Pets ), len (result .Pets ))
1020
+ }
1021
+ }
1022
+
1023
+ func TestGenericsTransactionRollbackOnPreloadError (t * testing.T ) {
1024
+ ctx := context .Background ()
1025
+ tx := DB .Begin ()
1026
+ if tx .Error != nil {
1027
+ t .Fatalf ("Failed to begin transaction: %v" , tx .Error )
1028
+ }
1029
+ user := User {Name : "TxRollbackPreload" , Age : 25 , Company : Company {Name : "TxCompany" }}
1030
+ if err := gorm.G [User ](tx ).Create (ctx , & user ); err != nil {
1031
+ _ = tx .Rollback ()
1032
+ t .Fatalf ("Failed to create user in tx: %v" , err )
1033
+ }
1034
+ var gotErr error
1035
+ _ , gotErr = gorm.G [User ](tx ).
1036
+ Preload ("Company" , func (db gorm.PreloadBuilder ) error { return fmt .Errorf ("bad preload" ) }).
1037
+ Where ("\" name\" = ?" , user .Name ).
1038
+ First (ctx )
1039
+ errRollback := tx .Rollback ().Error
1040
+ if gotErr == nil {
1041
+ t .Errorf ("Expected preload error, got nil" )
1042
+ }
1043
+ if errRollback != nil {
1044
+ t .Fatalf ("Failed to rollback on Preload error: %v" , errRollback )
1045
+ }
1046
+ _ , err := gorm.G [User ](DB ).Where ("\" name\" = ?" , user .Name ).First (ctx )
1047
+ if err == nil {
1048
+ t .Errorf ("Expected no user after rollback, but found one" )
1049
+ }
1050
+ }
0 commit comments