@@ -1728,52 +1728,100 @@ func TestMigrateOnUpdateConstraint(t *testing.T) {
17281728 Name string
17291729 }
17301730
1731- type Pen struct {
1731+ type Pen1 struct {
17321732 gorm.Model
17331733 OwnerID int
1734- Owner Owner `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL ;"`
1734+ Owner Owner `gorm:"constraint:OnUpdate:CASCADE;"`
17351735 }
17361736
1737- DB .Migrator ().DropTable (& Pen {}, & Owner {})
1737+ type Pen2 struct {
1738+ gorm.Model
1739+ OwnerID int `gorm:"default: 18"`
1740+ Owner Owner `gorm:"constraint:OnUpdate:SET DEFAULT;"`
1741+ }
17381742
1739- // Verify the trigger is created using CreateTable()
1740- if err := DB .Migrator ().CreateTable (& Owner {}, & Pen {}); err != nil {
1741- t .Fatalf ("Failed to create table, got error: %v" , err )
1743+ type Pen3 struct {
1744+ gorm.Model
1745+ OwnerID int
1746+ Owner Owner `gorm:"constraint:OnUpdate:SET NULL;"`
17421747 }
17431748
1744- triggerName := "fk_trigger_owners_id_pens_owner_id"
1749+ DB . Migrator (). DropTable ( & Owner {}, & Pen1 {}, & Pen2 {}, & Pen3 {})
17451750
1746- var count int
1747- DB .Raw ("SELECT count(*) FROM user_triggers where trigger_name = ?" , triggerName ).Scan (& count )
1748- if count != 1 {
1749- t .Errorf ("Should find the trigger %s" , triggerName )
1751+ // Test 1: Verify the trigger is created using CreateTable()
1752+ if err := DB .Migrator ().CreateTable (& Owner {}, & Pen1 {}, & Pen2 {}, & Pen3 {}); err != nil {
1753+ t .Fatalf ("Failed to create table, got error: %v" , err )
17501754 }
17511755
1752- // Verify the trigger is created using CreateConstraint()
1753- constraintName := "fk_pens_owner"
1754- if err := DB . Migrator (). DropConstraint ( & Pen {}, constraintName ); err != nil {
1755- t . Errorf ( "failed to drop constraint %v, got error %v" , constraintName , err )
1756+ triggerNames := [] string {
1757+ "fk_trigger_owners_id_pen1_owner_id" ,
1758+ "fk_trigger_owners_id_pen2_owner_id" ,
1759+ "fk_trigger_owners_id_pen3_owner_id" ,
17561760 }
17571761
1758- if err := DB .Migrator ().CreateConstraint (& Pen {}, constraintName ); err != nil {
1759- t .Errorf ("failed to create constraint %v, got error %v" , constraintName , err )
1762+ for _ , triggerName := range triggerNames {
1763+ var count int
1764+ DB .Raw ("SELECT count(*) FROM user_triggers where trigger_name = ?" , triggerName ).Scan (& count )
1765+ if count != 1 {
1766+ t .Errorf ("Should find the trigger %s" , triggerName )
1767+ }
17601768 }
17611769
1762- DB .Raw ("SELECT count(*) FROM user_triggers where trigger_name = ?" , triggerName ).Scan (& count )
1763- if count != 1 {
1764- t .Errorf ("Should find the trigger %s" , triggerName )
1770+ // Test 2: Verify the trigger is created using CreateConstraint()
1771+ penStructs := []interface {}{& Pen1 {}, & Pen2 {}, & Pen3 {}}
1772+ constraintNames := []string {"fk_pen1_owner" , "fk_pen2_owner" , "fk_pen3_owner" }
1773+ for i := range 3 {
1774+ if err := DB .Migrator ().DropConstraint (penStructs [i ], constraintNames [i ]); err != nil {
1775+ t .Errorf ("failed to drop constraint %v, got error %v" , constraintNames [i ], err )
1776+ }
1777+
1778+ if err := DB .Migrator ().CreateConstraint (penStructs [i ], constraintNames [i ]); err != nil {
1779+ t .Errorf ("failed to create constraint %v, got error %v" , constraintNames [i ], err )
1780+ }
1781+
1782+ var count int
1783+ DB .Raw ("SELECT count(*) FROM user_triggers where trigger_name = ?" , triggerNames [i ]).Scan (& count )
1784+ if count != 1 {
1785+ t .Errorf ("Should find the trigger %s" , triggerNames [i ])
1786+ }
17651787 }
17661788
1767- // Verify the trigger works
1768- user := Pen {Owner : Owner {ID : 1 , Name : "John" }}
1769- DB .Create (& user )
1789+ // Test 3: Verify each trigger work
1790+ pen1 := Pen1 {Owner : Owner {ID : 1 , Name : "John" }}
1791+ DB .Create (& pen1 )
1792+ DB .Model (pen1 .Owner ).Update ("id" , 100 )
1793+
1794+ var updatedPen1 Pen1
1795+ if err := DB .First (& updatedPen1 , "\" id\" = ?" , pen1 .ID ).Error ; err != nil {
1796+ panic (fmt .Errorf ("failed to find member, got error: %v" , err ))
1797+ } else if updatedPen1 .OwnerID != 100 {
1798+ panic (fmt .Errorf ("company id is not equal: expects: %v, got: %v" , 100 , updatedPen1 .OwnerID ))
1799+ }
1800+
1801+ pen2 := Pen2 {Owner : Owner {ID : 2 , Name : "Mary" }}
1802+ DB .Create (& pen2 )
1803+ // When the ID in the owners table is updated, the primary key in pen2 (owner_id column)
1804+ // is set to its default value (18). To avoid violating the foreign key constraint in pen2,
1805+ // we need to insert this record into the owners table in advance.
1806+ owner := Owner {ID : 18 , Name : "MaryBackup" }
1807+ DB .Create (& owner )
1808+ DB .Model (pen2 .Owner ).Update ("id" , 200 )
1809+
1810+ var updatedPen2 Pen2
1811+ if err := DB .First (& updatedPen2 , "\" id\" = ?" , pen2 .ID ).Error ; err != nil {
1812+ panic (fmt .Errorf ("failed to find member, got error: %v" , err ))
1813+ } else if updatedPen2 .OwnerID != 18 {
1814+ panic (fmt .Errorf ("company id is not equal: expects: %v, got: %v" , 18 , updatedPen2 .OwnerID ))
1815+ }
17701816
1771- DB .Model (user .Owner ).Update ("id" , 100 )
1817+ pen3 := Pen3 {Owner : Owner {ID : 3 , Name : "Jane" }}
1818+ DB .Create (& pen3 )
1819+ DB .Model (pen3 .Owner ).Update ("id" , 300 )
17721820
1773- var user2 Pen
1774- if err := DB .First (& user2 , "\" id\" = ?" , user .ID ).Error ; err != nil {
1821+ var updatedPen3 Pen3
1822+ if err := DB .First (& updatedPen3 , "\" id\" = ?" , pen3 .ID ).Error ; err != nil {
17751823 panic (fmt .Errorf ("failed to find member, got error: %v" , err ))
1776- } else if user2 .OwnerID != 100 {
1777- panic (fmt .Errorf ("company id is not equal: expects: %v, got: %v" , 100 , user2 .OwnerID ))
1824+ } else if updatedPen3 .OwnerID != 0 {
1825+ panic (fmt .Errorf ("company id is not equal: expects: %v, got: %v" , 0 , updatedPen3 .OwnerID ))
17781826 }
17791827}
0 commit comments