Skip to content

Commit 3d6e999

Browse files
Add test for error-translator-test.go
1 parent 55dbdc3 commit 3d6e999

File tree

1 file changed

+140
-0
lines changed

1 file changed

+140
-0
lines changed

tests/error_translator_test.go

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)