@@ -145,3 +145,143 @@ 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+
223+ func TestSupportedDialectorWithErrForeignKeyViolatedNegative (t * testing.T ) {
224+ type City struct {
225+ gorm.Model
226+ Name string `gorm:"unique"`
227+ }
228+
229+ type Museum struct {
230+ gorm.Model
231+ Name string `gorm:"unique"`
232+ CityID uint
233+ City City `gorm:"Constraint:OnUpdate:CASCADE,OnDelete:CASCADE;FOREIGNKEY:CityID;References:ID"`
234+ }
235+
236+ db , err := OpenTestConnection (& gorm.Config {TranslateError : false })
237+ if err != nil {
238+ t .Fatalf ("failed to connect database, got error %v" , err )
239+ }
240+
241+ dialectors := map [string ]bool {"sqlite" : true , "postgres" : true , "mysql" : true , "sqlserver" : true }
242+ if supported , found := dialectors [db .Dialector .Name ()]; ! (found && supported ) {
243+ t .Logf ("skipping test for unsupported dialector: %s" , db .Dialector .Name ())
244+ return
245+ }
246+
247+ DB .Migrator ().DropTable (& Museum {}, & City {})
248+ if err = db .AutoMigrate (& City {}, & Museum {}); err != nil {
249+ t .Fatalf ("failed to migrate tables, got error: %v" , err )
250+ }
251+
252+ city := City {Name : "Berlin" }
253+ if err := db .Create (& city ).Error ; err != nil {
254+ t .Fatalf ("failed to create city: %v" , err )
255+ }
256+
257+ err = db .Create (& Museum {Name : "Invalid FK Museum" , CityID : 99999 }).Error
258+ if errors .Is (err , gorm .ErrForeignKeyViolated ) {
259+ t .Fatalf ("expected raw DB error without translation, got: %v" , err )
260+ }
261+
262+ db , err = OpenTestConnection (& gorm.Config {TranslateError : true })
263+ if err != nil {
264+ t .Fatalf ("failed to connect database, got error %v" , err )
265+ }
266+ DB .Migrator ().DropTable (& Museum {}, & City {})
267+ if err = db .AutoMigrate (& City {}, & Museum {}); err != nil {
268+ t .Fatalf ("failed to migrate tables, got error: %v" , err )
269+ }
270+
271+ city2 := City {Name : "Vienna" }
272+ if err := db .Create (& city2 ).Error ; err != nil {
273+ t .Fatalf ("failed to create city: %v" , err )
274+ }
275+ museum := Museum {Name : "Vienna Museum" , CityID : city2 .ID }
276+ if err := db .Create (& museum ).Error ; err != nil {
277+ t .Fatalf ("failed to create museum: %v" , err )
278+ }
279+
280+ if err := db .Delete (& city2 ).Error ; err != nil {
281+ t .Fatalf ("expected cascade delete success, got error: %v" , err )
282+ }
283+
284+ if err := db .Create (& Museum {Name : "Orphan Museum" }).Error ; err != nil {
285+ t .Fatalf ("expected orphan museum insert to succeed, got: %v" , err )
286+ }
287+ }
0 commit comments