github.com/goravel/framework@v1.13.9/database/factory_test.go (about) 1 package database 2 3 import ( 4 "log" 5 "testing" 6 "time" 7 8 "github.com/brianvoe/gofakeit/v6" 9 "github.com/stretchr/testify/assert" 10 "github.com/stretchr/testify/suite" 11 gormio "gorm.io/gorm" 12 13 "github.com/goravel/framework/contracts/database/factory" 14 ormcontract "github.com/goravel/framework/contracts/database/orm" 15 "github.com/goravel/framework/database/gorm" 16 "github.com/goravel/framework/database/orm" 17 "github.com/goravel/framework/support/carbon" 18 ) 19 20 func (u *User) Factory() factory.Factory { 21 return &UserFactory{} 22 } 23 24 type UserFactory struct { 25 } 26 27 func (u *UserFactory) Definition() map[string]any { 28 faker := gofakeit.New(0) 29 return map[string]any{ 30 "Name": faker.Name(), 31 "Avatar": faker.Email(), 32 "CreatedAt": carbon.NewDateTime(carbon.Now()), 33 "UpdatedAt": carbon.NewDateTime(carbon.Now()), 34 } 35 } 36 37 type Author struct { 38 orm.Model 39 BookID uint 40 Name string 41 orm.SoftDeletes 42 } 43 44 func (a *Author) Factory() factory.Factory { 45 return &AuthorFactory{} 46 } 47 48 type AuthorFactory struct { 49 } 50 51 func (a *AuthorFactory) Definition() map[string]any { 52 faker := gofakeit.New(0) 53 return map[string]any{ 54 "ID": 1, 55 "BookID": 2, 56 "Name": faker.Name(), 57 "CreatedAt": carbon.NewDateTime(carbon.Now()), 58 "UpdatedAt": carbon.NewDateTime(carbon.Now()), 59 "DeletedAt": gormio.DeletedAt{Time: time.Now(), Valid: true}, 60 } 61 } 62 63 type House struct { 64 orm.Model 65 Name string 66 HouseableID uint 67 HouseableType string 68 } 69 70 type FactoryTestSuite struct { 71 suite.Suite 72 factory *FactoryImpl 73 query ormcontract.Query 74 } 75 76 func TestFactoryTestSuite(t *testing.T) { 77 if testing.Short() { 78 t.Skip("Skipping tests of using docker") 79 } 80 81 mysqlDocker := gorm.NewMysqlDocker() 82 mysqlPool, mysqlResource, mysqlQuery, err := mysqlDocker.New() 83 if err != nil { 84 log.Fatalf("Init mysql error: %s", err) 85 } 86 suite.Run(t, &FactoryTestSuite{ 87 query: mysqlQuery, 88 }) 89 assert.Nil(t, mysqlPool.Purge(mysqlResource)) 90 } 91 92 func (s *FactoryTestSuite) SetupTest() { 93 s.factory = NewFactoryImpl(s.query) 94 } 95 96 func (s *FactoryTestSuite) TestTimes() { 97 var user []User 98 s.Nil(s.factory.Count(2).Make(&user)) 99 s.True(len(user) == 2) 100 s.True(len(user[0].Name) > 0) 101 s.True(len(user[1].Name) > 0) 102 } 103 104 func (s *FactoryTestSuite) TestCreate() { 105 var user []User 106 s.Nil(s.factory.Create(&user)) 107 s.True(len(user) == 1) 108 s.True(user[0].ID > 0) 109 s.True(len(user[0].Name) > 0) 110 s.True(len(user[0].Avatar) > 0) 111 s.NotEmpty(user[0].CreatedAt.String()) 112 s.NotEmpty(user[0].UpdatedAt.String()) 113 114 var user1 User 115 s.Nil(s.factory.Create(&user1)) 116 s.NotNil(user1) 117 s.True(user1.ID > 0) 118 s.True(len(user1.Avatar) > 0) 119 s.NotEmpty(user1.CreatedAt.String()) 120 s.NotEmpty(user1.UpdatedAt.String()) 121 122 var user2 User 123 s.Nil(s.factory.Create(&user2, map[string]any{ 124 "Avatar": "avatar", 125 })) 126 s.NotNil(user2) 127 s.True(user2.ID > 0) 128 s.Equal("avatar", user2.Avatar) 129 s.NotEmpty(user2.CreatedAt.String()) 130 s.NotEmpty(user2.UpdatedAt.String()) 131 132 var user3 []User 133 s.Nil(s.factory.Count(2).Create(&user3)) 134 s.True(len(user3) == 2) 135 s.True(user3[0].ID > 0) 136 s.True(user3[1].ID > 0) 137 s.True(len(user3[0].Name) > 0) 138 s.True(len(user3[1].Name) > 0) 139 } 140 141 func (s *FactoryTestSuite) TestCreateQuietly() { 142 var user []User 143 s.Nil(s.factory.CreateQuietly(&user)) 144 s.True(len(user) == 1) 145 s.True(user[0].ID > 0) 146 s.True(len(user[0].Name) > 0) 147 s.True(len(user[0].Avatar) > 0) 148 s.NotEmpty(user[0].CreatedAt.String()) 149 s.NotEmpty(user[0].UpdatedAt.String()) 150 151 var user1 User 152 s.Nil(s.factory.CreateQuietly(&user1)) 153 s.NotNil(user1) 154 s.True(user1.ID > 0) 155 s.True(len(user1.Avatar) > 0) 156 s.NotEmpty(user1.CreatedAt.String()) 157 s.NotEmpty(user1.UpdatedAt.String()) 158 159 var user2 User 160 s.Nil(s.factory.CreateQuietly(&user2, map[string]any{ 161 "Avatar": "avatar", 162 })) 163 s.NotNil(user2) 164 s.True(user2.ID > 0) 165 s.Equal("avatar", user2.Avatar) 166 s.NotEmpty(user2.CreatedAt.String()) 167 s.NotEmpty(user2.UpdatedAt.String()) 168 169 var user3 []User 170 s.Nil(s.factory.Count(2).CreateQuietly(&user3)) 171 s.True(len(user3) == 2) 172 s.True(user3[0].ID > 0) 173 s.True(user3[1].ID > 0) 174 s.True(len(user3[0].Name) > 0) 175 s.True(len(user3[1].Name) > 0) 176 } 177 178 func (s *FactoryTestSuite) TestMake() { 179 var user User 180 s.Nil(s.factory.Make(&user)) 181 s.True(user.ID == 0) 182 s.True(len(user.Name) > 0) 183 s.True(len(user.Avatar) > 0) 184 s.NotEmpty(user.CreatedAt.String()) 185 s.NotEmpty(user.UpdatedAt.String()) 186 187 var user1 User 188 s.Nil(s.factory.Make(&user1, map[string]any{ 189 "Avatar": "avatar", 190 })) 191 s.True(user1.ID == 0) 192 s.True(len(user1.Name) > 0) 193 s.Equal("avatar", user1.Avatar) 194 s.NotEmpty(user1.CreatedAt.String()) 195 s.NotEmpty(user1.UpdatedAt.String()) 196 197 var users []User 198 s.Nil(s.factory.Make(&users)) 199 s.True(len(users) == 1) 200 s.True(users[0].ID == 0) 201 s.True(len(users[0].Name) > 0) 202 s.True(len(users[0].Avatar) > 0) 203 s.NotEmpty(users[0].CreatedAt.String()) 204 s.NotEmpty(users[0].UpdatedAt.String()) 205 206 var author Author 207 s.Nil(s.factory.Make(&author)) 208 s.True(author.ID == 1) 209 s.True(len(author.Name) > 0) 210 s.True(author.BookID == 2) 211 s.NotEmpty(author.CreatedAt.String()) 212 s.NotEmpty(author.UpdatedAt.String()) 213 s.True(author.DeletedAt.Valid) 214 } 215 216 func (s *FactoryTestSuite) TestGetRawAttributes() { 217 var house House 218 attributes, err := s.factory.getRawAttributes(&house) 219 s.NotNil(err) 220 s.Nil(attributes) 221 222 var user User 223 attributes, err = s.factory.getRawAttributes(&user) 224 s.Nil(err) 225 s.NotNil(attributes) 226 227 var user1 User 228 attributes, err = s.factory.getRawAttributes(&user1, map[string]any{ 229 "Avatar": "avatar", 230 }) 231 s.Nil(err) 232 s.NotNil(attributes) 233 s.True(len(attributes["Name"].(string)) > 0) 234 s.Equal("avatar", attributes["Avatar"].(string)) 235 s.NotNil(attributes["CreatedAt"]) 236 s.NotNil(attributes["UpdatedAt"]) 237 }