From 3d6e999b2a60ee7da98d3f470fc7391d59e50a93 Mon Sep 17 00:00:00 2001 From: Harshit Date: Thu, 4 Sep 2025 21:03:50 +0000 Subject: [PATCH 1/2] Add test for error-translator-test.go --- tests/error_translator_test.go | 140 +++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) diff --git a/tests/error_translator_test.go b/tests/error_translator_test.go index ae2f650..11cfb29 100644 --- a/tests/error_translator_test.go +++ b/tests/error_translator_test.go @@ -145,3 +145,143 @@ func TestSupportedDialectorWithErrForeignKeyViolated(t *testing.T) { t.Fatalf("expected err: %v got err: %v", gorm.ErrForeignKeyViolated, err) } } + +func TestDialectorWithErrorTranslatorNegativeCases(t *testing.T) { + translatedErr := errors.New("translated error") + untranslatedErr := errors.New("some random error") + + db, _ := gorm.Open(tests.DummyDialector{TranslatedErr: translatedErr}) + err := db.AddError(nil) + if err != nil { + t.Fatalf("expected nil, got %v", err) + } + + db, _ = gorm.Open(tests.DummyDialector{TranslatedErr: nil}, &gorm.Config{TranslateError: true}) + err = db.AddError(untranslatedErr) + if err != nil { + t.Fatalf("expected nil when TranslatedErr is nil, got %v", err) + } + + db, _ = gorm.Open(tests.DummyDialector{TranslatedErr: translatedErr}, &gorm.Config{TranslateError: true}) + err = db.AddError(translatedErr) + if !errors.Is(err, translatedErr) { + t.Fatalf("expected translatedErr unchanged, got %v", err) + } +} + +func TestSupportedDialectorWithErrDuplicatedKeyNegative(t *testing.T) { + type City struct { + gorm.Model + Name string `gorm:"unique"` + Code string `gorm:"unique"` + } + + db, err := OpenTestConnection(&gorm.Config{TranslateError: false}) + if err != nil { + t.Fatalf("failed to connect database, got error %v", err) + } + + dialectors := map[string]bool{"sqlite": true, "postgres": true, "mysql": true, "sqlserver": true} + if supported, found := dialectors[db.Dialector.Name()]; !(found && supported) { + t.Logf("skipping test for unsupported dialector: %s", db.Dialector.Name()) + return + } + + DB.Migrator().DropTable(&City{}) + if err = db.AutoMigrate(&City{}); err != nil { + t.Fatalf("failed to migrate cities table, got error: %v", err) + } + + if err := db.Create(&City{Name: "Kabul", Code: "KB"}).Error; err != nil { + t.Fatalf("failed to create record: %v", err) + } + + err = db.Create(&City{Name: "Kabul", Code: "KB"}).Error + if errors.Is(err, gorm.ErrDuplicatedKey) { + t.Fatalf("expected raw db error (no translation), got: %v", err) + } + + db, err = OpenTestConnection(&gorm.Config{TranslateError: true}) + if err != nil { + t.Fatalf("failed to connect database, got error %v", err) + } + DB.Migrator().DropTable(&City{}) + if err = db.AutoMigrate(&City{}); err != nil { + t.Fatalf("failed to migrate cities table, got error: %v", err) + } + + if err := db.Create(&City{Name: "Paris", Code: "P1"}).Error; err != nil { + t.Fatalf("failed to create record: %v", err) + } + + err = db.Create(&City{Name: "London", Code: "P1"}).Error + if !errors.Is(err, gorm.ErrDuplicatedKey) { + t.Errorf("expected ErrDuplicatedKey on unique Code, got: %v", err) + } +} + +func TestSupportedDialectorWithErrForeignKeyViolatedNegative(t *testing.T) { + type City struct { + gorm.Model + Name string `gorm:"unique"` + } + + type Museum struct { + gorm.Model + Name string `gorm:"unique"` + CityID uint + City City `gorm:"Constraint:OnUpdate:CASCADE,OnDelete:CASCADE;FOREIGNKEY:CityID;References:ID"` + } + + db, err := OpenTestConnection(&gorm.Config{TranslateError: false}) + if err != nil { + t.Fatalf("failed to connect database, got error %v", err) + } + + dialectors := map[string]bool{"sqlite": true, "postgres": true, "mysql": true, "sqlserver": true} + if supported, found := dialectors[db.Dialector.Name()]; !(found && supported) { + t.Logf("skipping test for unsupported dialector: %s", db.Dialector.Name()) + return + } + + DB.Migrator().DropTable(&Museum{}, &City{}) + if err = db.AutoMigrate(&City{}, &Museum{}); err != nil { + t.Fatalf("failed to migrate tables, got error: %v", err) + } + + city := City{Name: "Berlin"} + if err := db.Create(&city).Error; err != nil { + t.Fatalf("failed to create city: %v", err) + } + + err = db.Create(&Museum{Name: "Invalid FK Museum", CityID: 99999}).Error + if errors.Is(err, gorm.ErrForeignKeyViolated) { + t.Fatalf("expected raw DB error without translation, got: %v", err) + } + + db, err = OpenTestConnection(&gorm.Config{TranslateError: true}) + if err != nil { + t.Fatalf("failed to connect database, got error %v", err) + } + DB.Migrator().DropTable(&Museum{}, &City{}) + if err = db.AutoMigrate(&City{}, &Museum{}); err != nil { + t.Fatalf("failed to migrate tables, got error: %v", err) + } + + city2 := City{Name: "Vienna"} + if err := db.Create(&city2).Error; err != nil { + t.Fatalf("failed to create city: %v", err) + } + museum := Museum{Name: "Vienna Museum", CityID: city2.ID} + if err := db.Create(&museum).Error; err != nil { + t.Fatalf("failed to create museum: %v", err) + } + + if err := db.Delete(&city2).Error; err != nil { + t.Fatalf("expected cascade delete success, got error: %v", err) + } + + if err := db.Create(&Museum{Name: "Orphan Museum"}).Error; err != nil { + t.Fatalf("expected orphan museum insert to succeed, got: %v", err) + } +} From 321d5bb4efd0ecf59c5d2fa631bdedbeb3b9b8f5 Mon Sep 17 00:00:00 2001 From: Harshit Date: Tue, 23 Sep 2025 11:00:15 +0000 Subject: [PATCH 2/2] Add tests for NULL and empty string --- tests/error_translator_test.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/error_translator_test.go b/tests/error_translator_test.go index 11cfb29..52434c5 100644 --- a/tests/error_translator_test.go +++ b/tests/error_translator_test.go @@ -218,6 +218,24 @@ func TestSupportedDialectorWithErrDuplicatedKeyNegative(t *testing.T) { if !errors.Is(err, gorm.ErrDuplicatedKey) { t.Errorf("expected ErrDuplicatedKey on unique Code, got: %v", err) } + + var cities []City + if err := db.Find(&cities, "code = ?", "P1").Error; err != nil { + t.Fatalf("failed to fetch cities: %v", err) + } + if len(cities) != 1 { + t.Fatalf("expected 1 city with code 'P1', found %d", len(cities)) + } + if cities[0].Name != "Paris" { + t.Errorf("expected city name 'Paris', got '%s'", cities[0].Name) + } + + if err := db.Create(&City{Name: "NullCodeCity", Code: ""}).Error; err != nil { + t.Fatalf("failed to create record with empty Code: %v", err) + } + if err := db.Create(&City{Name: "NullCodeCity2"}).Error; err != nil { + t.Fatalf("failed to create second record with NULL Code: %v", err) + } } func TestSupportedDialectorWithErrForeignKeyViolatedNegative(t *testing.T) {