From c10f807d3c0b2b3204c80d62cf7650e21d7e3316 Mon Sep 17 00:00:00 2001 From: Saeid Date: Wed, 12 Jul 2023 16:21:22 +0300 Subject: [PATCH] test: coverage for foreign key violation err (#6403) * test: coverage for foreign key violation err * test: enabled foreign keys constraint for sqlite * test: enabled mysql& mssql for ErrForeignKeyViolate * test: disabled mysql & updated sqlserver driver version * test: skipped tidb --------- Co-authored-by: Saeid Saeidee --- tests/error_translator_test.go | 51 ++++++++++++++++++++++++++++++++++ tests/go.mod | 14 ++++------ tests/tests_test.go | 2 +- 3 files changed, 58 insertions(+), 9 deletions(-) diff --git a/tests/error_translator_test.go b/tests/error_translator_test.go index f6c706770..ee54300e1 100644 --- a/tests/error_translator_test.go +++ b/tests/error_translator_test.go @@ -44,6 +44,8 @@ func TestSupportedDialectorWithErrDuplicatedKey(t *testing.T) { return } + DB.Migrator().DropTable(&City{}) + if err = db.AutoMigrate(&City{}); err != nil { t.Fatalf("failed to migrate cities table, got error: %v", err) } @@ -58,3 +60,52 @@ func TestSupportedDialectorWithErrDuplicatedKey(t *testing.T) { t.Fatalf("expected err: %v got err: %v", gorm.ErrDuplicatedKey, err) } } + +func TestSupportedDialectorWithErrForeignKeyViolated(t *testing.T) { + tidbSkip(t, "not support the foreign key feature") + + 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: true}) + 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) { + return + } + + DB.Migrator().DropTable(&City{}, &Museum{}) + + if err = db.AutoMigrate(&City{}, &Museum{}); err != nil { + t.Fatalf("failed to migrate countries & cities tables, got error: %v", err) + } + + city := City{Name: "Amsterdam"} + + err = db.Create(&city).Error + if err != nil { + t.Fatalf("failed to create city: %v", err) + } + + err = db.Create(&Museum{Name: "Eye Filmmuseum", CityID: city.ID}).Error + if err != nil { + t.Fatalf("failed to create museum: %v", err) + } + + err = db.Create(&Museum{Name: "Dungeon", CityID: 123}).Error + if !errors.Is(err, gorm.ErrForeignKeyViolated) { + t.Fatalf("expected err: %v got err: %v", gorm.ErrForeignKeyViolated, err) + } +} diff --git a/tests/go.mod b/tests/go.mod index 0b38b9d01..aebe5a064 100644 --- a/tests/go.mod +++ b/tests/go.mod @@ -4,15 +4,13 @@ go 1.16 require ( github.com/google/uuid v1.3.0 - github.com/jackc/pgx/v5 v5.3.1 // indirect github.com/jinzhu/now v1.1.5 - github.com/lib/pq v1.10.8 - github.com/mattn/go-sqlite3 v1.14.16 // indirect - gorm.io/driver/mysql v1.5.0 - gorm.io/driver/postgres v1.5.0 - gorm.io/driver/sqlite v1.5.0 - gorm.io/driver/sqlserver v1.5.1 - gorm.io/gorm v1.25.1 + github.com/lib/pq v1.10.9 + gorm.io/driver/mysql v1.5.2-0.20230612053416-48b6526a21f0 + gorm.io/driver/postgres v1.5.3-0.20230607070428-18bc84b75196 + gorm.io/driver/sqlite v1.5.2 + gorm.io/driver/sqlserver v1.5.2-0.20230613072041-6e2cde390b0a + gorm.io/gorm v1.25.2-0.20230610234218-206613868439 ) replace gorm.io/gorm => ../ diff --git a/tests/tests_test.go b/tests/tests_test.go index 0167d4063..47c2a7c13 100644 --- a/tests/tests_test.go +++ b/tests/tests_test.go @@ -89,7 +89,7 @@ func OpenTestConnection(cfg *gorm.Config) (db *gorm.DB, err error) { db, err = gorm.Open(mysql.Open(dbDSN), cfg) default: log.Println("testing sqlite3...") - db, err = gorm.Open(sqlite.Open(filepath.Join(os.TempDir(), "gorm.db")), cfg) + db, err = gorm.Open(sqlite.Open(filepath.Join(os.TempDir(), "gorm.db?_foreign_keys=on")), cfg) } if err != nil {