github.com/goravel/framework@v1.13.9/database/gorm/event_test.go (about) 1 package gorm 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/stretchr/testify/assert" 8 "github.com/stretchr/testify/suite" 9 "gorm.io/gorm" 10 ) 11 12 type TestEventModel struct { 13 Name string 14 Avatar string 15 IsAdmin bool 16 IsManage int `gorm:"column:manage"` 17 AdminAt time.Time 18 ManageAt time.Time 19 high int 20 } 21 22 var testNow = time.Now().Add(-1 * time.Second) 23 var testEventModel = TestEventModel{Name: "name", Avatar: "avatar", IsAdmin: true, IsManage: 0, AdminAt: testNow, ManageAt: testNow, high: 1} 24 var testQuery = &QueryImpl{ 25 instance: &gorm.DB{ 26 Statement: &gorm.Statement{ 27 Selects: []string{}, 28 Omits: []string{}, 29 }, 30 }, 31 } 32 33 type EventTestSuite struct { 34 suite.Suite 35 events []*Event 36 } 37 38 func TestEventTestSuite(t *testing.T) { 39 suite.Run(t, new(EventTestSuite)) 40 } 41 42 func (s *EventTestSuite) SetupTest() { 43 s.events = []*Event{ 44 NewEvent(testQuery, &testEventModel, map[string]any{"avatar": "avatar1", "is_admin": false, "is_manage": 1, "admin_at": time.Now(), "manage": testNow}), 45 NewEvent(testQuery, &testEventModel, map[string]any{"Avatar": "avatar1", "IsAdmin": false, "IsManage": 1, "AdminAt": time.Now(), "ManageAt": testNow}), 46 NewEvent(testQuery, &testEventModel, TestEventModel{Avatar: "avatar1", IsAdmin: false, IsManage: 1, AdminAt: time.Now(), ManageAt: testNow}), 47 NewEvent(testQuery, &testEventModel, &TestEventModel{Avatar: "avatar1", IsAdmin: false, IsManage: 1, AdminAt: time.Now(), ManageAt: testNow}), 48 } 49 } 50 51 func (s *EventTestSuite) TestSetAttribute() { 52 dest := map[string]any{"avatar": "avatar1"} 53 query := &QueryImpl{ 54 instance: &gorm.DB{ 55 Statement: &gorm.Statement{ 56 Selects: []string{}, 57 Omits: []string{}, 58 Dest: dest, 59 }, 60 }, 61 } 62 63 event := NewEvent(query, &testEventModel, dest) 64 65 event.SetAttribute("Name", "name1") 66 name := event.GetAttribute("Name") 67 s.Equal(name, "name1") 68 name = event.GetAttribute("name") 69 s.Equal(name, "name1") 70 71 event.SetAttribute("Avatar", "avatar2") 72 avatar := event.GetAttribute("Avatar") 73 s.Equal("avatar2", avatar) 74 avatar = event.GetAttribute("avatar") 75 s.Equal("avatar2", avatar) 76 } 77 78 func (s *EventTestSuite) TestGetAttribute() { 79 events := []*Event{ 80 NewEvent(testQuery, &testEventModel, map[string]any{"avatar": "avatar1"}), 81 NewEvent(testQuery, &testEventModel, TestEventModel{Avatar: "avatar1"}), 82 } 83 84 for _, event := range events { 85 s.Equal("name", event.GetAttribute("Name")) 86 s.Equal("name", event.GetAttribute("name")) 87 s.Equal("avatar1", event.GetAttribute("Avatar")) 88 s.Equal("avatar1", event.GetAttribute("avatar")) 89 } 90 } 91 92 func (s *EventTestSuite) TestGetOriginal() { 93 event := NewEvent(testQuery, &testEventModel, map[string]any{"avatar": "avatar1"}) 94 95 s.Equal("name", event.GetOriginal("name")) 96 s.Equal("avatar", event.GetOriginal("avatar")) 97 s.Equal(true, event.GetOriginal("is_admin")) 98 s.Equal(0, event.GetOriginal("manage")) 99 s.Equal(testNow, event.GetOriginal("admin_at")) 100 s.Equal(testNow, event.GetOriginal("manage_at")) 101 s.Nil(event.GetOriginal("no")) 102 } 103 104 func (s *EventTestSuite) TestIsDirty() { 105 for _, event := range s.events { 106 s.True(event.IsDirty()) 107 s.False(event.IsDirty("Name")) 108 s.False(event.IsDirty("name")) 109 s.True(event.IsDirty("Avatar")) 110 s.True(event.IsDirty("avatar")) 111 s.False(event.IsDirty("IsAdmin")) 112 s.False(event.IsDirty("is_admin")) 113 s.True(event.IsDirty("IsManage")) 114 s.True(event.IsDirty("manage")) 115 s.False(event.IsDirty("is_manage")) 116 s.True(event.IsDirty("AdminAt")) 117 s.True(event.IsDirty("admin_at")) 118 s.False(event.IsDirty("ManageAt")) 119 s.False(event.IsDirty("manage_at")) 120 s.True(event.IsDirty("name", "avatar")) 121 s.True(event.IsDirty("is_manage", "avatar")) 122 } 123 124 // Set zero value when use model update 125 event := NewEvent(testQuery, &testEventModel, &TestEventModel{Avatar: "avatar1", IsAdmin: true, IsManage: 0, AdminAt: time.Now(), ManageAt: testNow}) 126 s.True(event.IsDirty()) 127 s.False(event.IsDirty("Name")) 128 s.False(event.IsDirty("name")) 129 s.True(event.IsDirty("Avatar")) 130 s.True(event.IsDirty("avatar")) 131 s.False(event.IsDirty("IsAdmin")) 132 s.False(event.IsDirty("is_admin")) 133 s.False(event.IsDirty("IsManage")) 134 s.False(event.IsDirty("manage")) 135 s.False(event.IsDirty("is_manage")) 136 s.True(event.IsDirty("AdminAt")) 137 s.True(event.IsDirty("admin_at")) 138 s.False(event.IsDirty("ManageAt")) 139 s.False(event.IsDirty("manage_at")) 140 s.True(event.IsDirty("name", "avatar")) 141 s.True(event.IsDirty("is_manage", "avatar")) 142 } 143 144 func (s *EventTestSuite) TestValidColumn() { 145 for _, event := range s.events { 146 s.True(event.validColumn("name")) 147 s.True(event.validColumn("Name")) 148 s.True(event.validColumn("IsAdmin")) 149 s.True(event.validColumn("is_admin")) 150 s.True(event.validColumn("IsManage")) 151 s.False(event.validColumn("is_manage")) 152 s.True(event.validColumn("manage")) 153 s.False(event.validColumn("age")) 154 155 event.query = &QueryImpl{ 156 instance: &gorm.DB{ 157 Statement: &gorm.Statement{ 158 Selects: []string{"name"}, 159 Omits: []string{}, 160 }, 161 }, 162 } 163 s.True(event.validColumn("Name")) 164 s.True(event.validColumn("name")) 165 s.False(event.validColumn("avatar")) 166 s.False(event.validColumn("Avatar")) 167 168 event.query = &QueryImpl{ 169 instance: &gorm.DB{ 170 Statement: &gorm.Statement{ 171 Selects: []string{}, 172 Omits: []string{"name"}, 173 }, 174 }, 175 } 176 s.False(event.validColumn("Name")) 177 s.False(event.validColumn("name")) 178 s.True(event.validColumn("avatar")) 179 s.True(event.validColumn("Avatar")) 180 } 181 } 182 183 func (s *EventTestSuite) TestDirty() { 184 for _, event := range s.events { 185 s.False(event.dirty("Name", "name")) 186 s.True(event.dirty("Name", "name1")) 187 s.False(event.dirty("name", "name")) 188 s.True(event.dirty("name", "name1")) 189 s.False(event.dirty("IsAdmin", true)) 190 s.True(event.dirty("IsAdmin", false)) 191 s.False(event.dirty("is_admin", true)) 192 s.True(event.dirty("is_admin", false)) 193 s.False(event.dirty("IsManage", 0)) 194 s.True(event.dirty("IsManage", 1)) 195 s.False(event.dirty("manage", 0)) 196 s.True(event.dirty("is_manage", 0)) 197 s.True(event.dirty("is_manage", 1)) 198 s.True(event.dirty("manage", 1)) 199 s.False(event.dirty("AdminAt", testNow)) 200 s.True(event.dirty("AdminAt", time.Now())) 201 s.False(event.dirty("admin_at", testNow)) 202 s.True(event.dirty("admin_at", time.Now())) 203 } 204 } 205 206 func (s *EventTestSuite) TestCompareColumnName() { 207 for _, event := range s.events { 208 s.False(event.equalColumnName("address", "name")) 209 s.False(event.equalColumnName("address", "address")) 210 s.True(event.equalColumnName("Name", "name")) 211 s.True(event.equalColumnName("is_admin", "IsAdmin")) 212 } 213 } 214 215 func (s *EventTestSuite) TestToDBColumnName() { 216 for _, event := range s.events { 217 s.Equal("", event.toDBColumnName("address")) 218 s.Equal("name", event.toDBColumnName("Name")) 219 s.Equal("name", event.toDBColumnName("name")) 220 s.Equal("is_admin", event.toDBColumnName("IsAdmin")) 221 s.Equal("is_admin", event.toDBColumnName("is_admin")) 222 } 223 } 224 225 func (s *EventTestSuite) TestColumnNamesWithDbColumnNames() { 226 for _, event := range s.events { 227 s.Equal(map[string]string{ 228 "Name": "name", 229 "name": "name", 230 "Avatar": "avatar", 231 "avatar": "avatar", 232 "IsAdmin": "is_admin", 233 "is_admin": "is_admin", 234 "IsManage": "manage", 235 "manage": "manage", 236 "AdminAt": "admin_at", 237 "admin_at": "admin_at", 238 "ManageAt": "manage_at", 239 "manage_at": "manage_at", 240 }, event.ColumnNamesWithDbColumnNames()) 241 } 242 } 243 244 func TestStructToMap(t *testing.T) { 245 assert.Equal(t, map[string]any{ 246 "name": testEventModel.Name, 247 "avatar": testEventModel.Avatar, 248 "is_admin": testEventModel.IsAdmin, 249 "manage": testEventModel.IsManage, 250 "admin_at": testEventModel.AdminAt, 251 "manage_at": testEventModel.ManageAt, 252 }, structToMap(testEventModel)) 253 } 254 255 func TestStructNameToDbColumnName(t *testing.T) { 256 assert.Equal(t, "is_admin", structNameToDbColumnName("IsAdmin", "")) 257 assert.Equal(t, "admin", structNameToDbColumnName("IsAdmin", "column:admin")) 258 assert.Equal(t, "admin", structNameToDbColumnName("IsAdmin", "column: admin")) 259 }