Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
158 changes: 158 additions & 0 deletions tests/error_translator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -145,3 +145,161 @@ 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)
}

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) {
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)
}
}
Loading