Skip to content
Merged
Changes from 2 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
140 changes: 140 additions & 0 deletions tests/error_translator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}
Loading