@@ -145,3 +145,161 @@ func TestSupportedDialectorWithErrForeignKeyViolated(t *testing.T) {
145
145
t .Fatalf ("expected err: %v got err: %v" , gorm .ErrForeignKeyViolated , err )
146
146
}
147
147
}
148
+
149
+ func TestDialectorWithErrorTranslatorNegativeCases (t * testing.T ) {
150
+ translatedErr := errors .New ("translated error" )
151
+ untranslatedErr := errors .New ("some random error" )
152
+
153
+ db , _ := gorm .Open (tests.DummyDialector {TranslatedErr : translatedErr })
154
+ err := db .AddError (nil )
155
+ if err != nil {
156
+ t .Fatalf ("expected nil, got %v" , err )
157
+ }
158
+
159
+ db , _ = gorm .Open (tests.DummyDialector {TranslatedErr : nil }, & gorm.Config {TranslateError : true })
160
+ err = db .AddError (untranslatedErr )
161
+ if err != nil {
162
+ t .Fatalf ("expected nil when TranslatedErr is nil, got %v" , err )
163
+ }
164
+
165
+ db , _ = gorm .Open (tests.DummyDialector {TranslatedErr : translatedErr }, & gorm.Config {TranslateError : true })
166
+ err = db .AddError (translatedErr )
167
+ if ! errors .Is (err , translatedErr ) {
168
+ t .Fatalf ("expected translatedErr unchanged, got %v" , err )
169
+ }
170
+ }
171
+
172
+ func TestSupportedDialectorWithErrDuplicatedKeyNegative (t * testing.T ) {
173
+ type City struct {
174
+ gorm.Model
175
+ Name string `gorm:"unique"`
176
+ Code string `gorm:"unique"`
177
+ }
178
+
179
+ db , err := OpenTestConnection (& gorm.Config {TranslateError : false })
180
+ if err != nil {
181
+ t .Fatalf ("failed to connect database, got error %v" , err )
182
+ }
183
+
184
+ dialectors := map [string ]bool {"sqlite" : true , "postgres" : true , "mysql" : true , "sqlserver" : true }
185
+ if supported , found := dialectors [db .Dialector .Name ()]; ! (found && supported ) {
186
+ t .Logf ("skipping test for unsupported dialector: %s" , db .Dialector .Name ())
187
+ return
188
+ }
189
+
190
+ DB .Migrator ().DropTable (& City {})
191
+ if err = db .AutoMigrate (& City {}); err != nil {
192
+ t .Fatalf ("failed to migrate cities table, got error: %v" , err )
193
+ }
194
+
195
+ if err := db .Create (& City {Name : "Kabul" , Code : "KB" }).Error ; err != nil {
196
+ t .Fatalf ("failed to create record: %v" , err )
197
+ }
198
+
199
+ err = db .Create (& City {Name : "Kabul" , Code : "KB" }).Error
200
+ if errors .Is (err , gorm .ErrDuplicatedKey ) {
201
+ t .Fatalf ("expected raw db error (no translation), got: %v" , err )
202
+ }
203
+
204
+ db , err = OpenTestConnection (& gorm.Config {TranslateError : true })
205
+ if err != nil {
206
+ t .Fatalf ("failed to connect database, got error %v" , err )
207
+ }
208
+ DB .Migrator ().DropTable (& City {})
209
+ if err = db .AutoMigrate (& City {}); err != nil {
210
+ t .Fatalf ("failed to migrate cities table, got error: %v" , err )
211
+ }
212
+
213
+ if err := db .Create (& City {Name : "Paris" , Code : "P1" }).Error ; err != nil {
214
+ t .Fatalf ("failed to create record: %v" , err )
215
+ }
216
+
217
+ err = db .Create (& City {Name : "London" , Code : "P1" }).Error
218
+ if ! errors .Is (err , gorm .ErrDuplicatedKey ) {
219
+ t .Errorf ("expected ErrDuplicatedKey on unique Code, got: %v" , err )
220
+ }
221
+
222
+ var cities []City
223
+ if err := db .Find (& cities , "code = ?" , "P1" ).Error ; err != nil {
224
+ t .Fatalf ("failed to fetch cities: %v" , err )
225
+ }
226
+ if len (cities ) != 1 {
227
+ t .Fatalf ("expected 1 city with code 'P1', found %d" , len (cities ))
228
+ }
229
+ if cities [0 ].Name != "Paris" {
230
+ t .Errorf ("expected city name 'Paris', got '%s'" , cities [0 ].Name )
231
+ }
232
+
233
+ if err := db .Create (& City {Name : "NullCodeCity" , Code : "" }).Error ; err != nil {
234
+ t .Fatalf ("failed to create record with empty Code: %v" , err )
235
+ }
236
+ if err := db .Create (& City {Name : "NullCodeCity2" }).Error ; err != nil {
237
+ t .Fatalf ("failed to create second record with NULL Code: %v" , err )
238
+ }
239
+ }
240
+
241
+ func TestSupportedDialectorWithErrForeignKeyViolatedNegative (t * testing.T ) {
242
+ type City struct {
243
+ gorm.Model
244
+ Name string `gorm:"unique"`
245
+ }
246
+
247
+ type Museum struct {
248
+ gorm.Model
249
+ Name string `gorm:"unique"`
250
+ CityID uint
251
+ City City `gorm:"Constraint:OnUpdate:CASCADE,OnDelete:CASCADE;FOREIGNKEY:CityID;References:ID"`
252
+ }
253
+
254
+ db , err := OpenTestConnection (& gorm.Config {TranslateError : false })
255
+ if err != nil {
256
+ t .Fatalf ("failed to connect database, got error %v" , err )
257
+ }
258
+
259
+ dialectors := map [string ]bool {"sqlite" : true , "postgres" : true , "mysql" : true , "sqlserver" : true }
260
+ if supported , found := dialectors [db .Dialector .Name ()]; ! (found && supported ) {
261
+ t .Logf ("skipping test for unsupported dialector: %s" , db .Dialector .Name ())
262
+ return
263
+ }
264
+
265
+ DB .Migrator ().DropTable (& Museum {}, & City {})
266
+ if err = db .AutoMigrate (& City {}, & Museum {}); err != nil {
267
+ t .Fatalf ("failed to migrate tables, got error: %v" , err )
268
+ }
269
+
270
+ city := City {Name : "Berlin" }
271
+ if err := db .Create (& city ).Error ; err != nil {
272
+ t .Fatalf ("failed to create city: %v" , err )
273
+ }
274
+
275
+ err = db .Create (& Museum {Name : "Invalid FK Museum" , CityID : 99999 }).Error
276
+ if errors .Is (err , gorm .ErrForeignKeyViolated ) {
277
+ t .Fatalf ("expected raw DB error without translation, got: %v" , err )
278
+ }
279
+
280
+ db , err = OpenTestConnection (& gorm.Config {TranslateError : true })
281
+ if err != nil {
282
+ t .Fatalf ("failed to connect database, got error %v" , err )
283
+ }
284
+ DB .Migrator ().DropTable (& Museum {}, & City {})
285
+ if err = db .AutoMigrate (& City {}, & Museum {}); err != nil {
286
+ t .Fatalf ("failed to migrate tables, got error: %v" , err )
287
+ }
288
+
289
+ city2 := City {Name : "Vienna" }
290
+ if err := db .Create (& city2 ).Error ; err != nil {
291
+ t .Fatalf ("failed to create city: %v" , err )
292
+ }
293
+ museum := Museum {Name : "Vienna Museum" , CityID : city2 .ID }
294
+ if err := db .Create (& museum ).Error ; err != nil {
295
+ t .Fatalf ("failed to create museum: %v" , err )
296
+ }
297
+
298
+ if err := db .Delete (& city2 ).Error ; err != nil {
299
+ t .Fatalf ("expected cascade delete success, got error: %v" , err )
300
+ }
301
+
302
+ if err := db .Create (& Museum {Name : "Orphan Museum" }).Error ; err != nil {
303
+ t .Fatalf ("expected orphan museum insert to succeed, got: %v" , err )
304
+ }
305
+ }
0 commit comments