Skip to content

Commit 8748963

Browse files
Add test for error-translator-test.go (#73)
* Add test for error-translator-test.go
1 parent 65a3e61 commit 8748963

File tree

1 file changed

+158
-0
lines changed

1 file changed

+158
-0
lines changed

tests/error_translator_test.go

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

Comments
 (0)