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  }