@@ -145,3 +145,161 @@ func TestSupportedDialectorWithErrForeignKeyViolated(t *testing.T) {
145145 t .Fatalf ("expected err: %v got err: %v" , gorm .ErrForeignKeyViolated , err )
146146 }
147147}
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