package test import ( "fmt" "github.com/go-testfixtures/testfixtures/v3" "github.com/gobuffalo/pop/v6" "github.com/gobuffalo/pop/v6/logging" "github.com/gofrs/uuid" "github.com/stretchr/testify/suite" "github.com/teamhanko/hanko/backend/config" "github.com/teamhanko/hanko/backend/persistence" "testing" ) type Suite struct { suite.Suite Storage persistence.Storage DB *TestDB EmailServer *TestMailslurper Name string // used for database docker container name, so that tests can run in parallel WithEmailServer bool } func (s *Suite) SetupSuite() { if testing.Short() { return } pop.SetLogger(testLogger) //pop.Debug = true if s.Name == "" { var err error id, err := uuid.NewV4() if err != nil { s.Fail("failed to generate database container name") } s.Name = id.String() } dialect := "postgres" db, err := StartDB(s.Name, dialect) s.Require().NoError(err) storage, err := persistence.New(config.Database{ Url: db.DatabaseUrl, }) s.Require().NoError(err) if s.WithEmailServer { s.EmailServer, err = StartMailslurper() s.Require().NoError(err) } s.Storage = storage s.DB = db } func (s *Suite) SetupTest() { if s.DB != nil { err := s.Storage.MigrateUp() s.NoError(err) } } func (s *Suite) TearDownTest() { if s.DB != nil { err := s.Storage.MigrateDown(-1) s.NoError(err) } if s.EmailServer != nil { s.NoError(s.EmailServer.DeleteEmails()) } } func (s *Suite) TearDownSuite() { if s.DB != nil { s.NoError(PurgeDB(s.DB)) } if s.EmailServer != nil { s.NoError(PurgeMailslurper(s.EmailServer)) } } // LoadFixtures loads predefined data from the path in the database. func (s *Suite) LoadFixtures(path string) error { fixtures, err := testfixtures.New( testfixtures.Database(s.DB.DbCon), testfixtures.Dialect(s.DB.Dialect), testfixtures.Directory(path), testfixtures.SkipResetSequences(), ) if err != nil { return fmt.Errorf("could not create testfixtures: %w", err) } err = fixtures.Load() if err != nil { return fmt.Errorf("could not load fixtures: %w", err) } return nil } func testLogger(level logging.Level, s string, args ...interface{}) { }