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  }