105 lines
2.1 KiB
Go
105 lines
2.1 KiB
Go
package test
|
|
|
|
import (
|
|
"os"
|
|
"path"
|
|
"path/filepath"
|
|
"runtime"
|
|
|
|
"github.com/ArtalkJS/Artalk/internal/config"
|
|
"github.com/ArtalkJS/Artalk/internal/core"
|
|
"github.com/ArtalkJS/Artalk/internal/dao"
|
|
db_logger "github.com/ArtalkJS/Artalk/internal/db/logger"
|
|
"github.com/ArtalkJS/Artalk/internal/pkged"
|
|
"github.com/ArtalkJS/Artalk/internal/utils"
|
|
"github.com/go-testfixtures/testfixtures/v3"
|
|
"gorm.io/driver/sqlite"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type TestApp struct {
|
|
*core.App
|
|
}
|
|
|
|
func (t *TestApp) Cleanup() error {
|
|
if err := t.ResetBootstrapState(); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func NewTestApp() (*TestApp, error) {
|
|
// change WorkDir run on project root
|
|
{
|
|
_, filename, _, _ := runtime.Caller(0)
|
|
rootDir := path.Join(path.Dir(filename), "..")
|
|
if err := os.Chdir(rootDir); err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
// load assets fs
|
|
dirFS := os.DirFS("./")
|
|
pkged.SetFS(dirFS)
|
|
|
|
// prepare db folder
|
|
const dbFile = "./data/test.db"
|
|
utils.EnsureDir(filepath.Dir(dbFile))
|
|
|
|
// open a sqlite db
|
|
dbInstance, err := gorm.Open(sqlite.Open(dbFile), &gorm.Config{
|
|
Logger: db_logger.NewGormLogger(),
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// cerate dao instance (will migrate database table)
|
|
dao := dao.NewDao(dbInstance)
|
|
|
|
// get pure sql.DB instance
|
|
sqlDB, err := dbInstance.DB()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// fixtures config
|
|
fixtures, err := testfixtures.New(
|
|
testfixtures.Database(sqlDB), // Database connection
|
|
testfixtures.Dialect("sqlite"), // Available: "postgresql", "timescaledb", "mysql", "mariadb", "sqlite" and "sqlserver"
|
|
testfixtures.Directory("./test/fixtures"), // The directory containing the YAML files
|
|
)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// load fixtures data
|
|
if err := fixtures.Load(); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// create config instance
|
|
conf, err := config.NewFromFile("./test/testdata/model_test_conf.yml")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// create app instance
|
|
app := core.NewApp(conf)
|
|
|
|
// set dao
|
|
app.SetDao(dao)
|
|
|
|
// bootstrap
|
|
if err := app.Bootstrap(); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// create test app instance
|
|
t := &TestApp{
|
|
App: app,
|
|
}
|
|
|
|
return t, nil
|
|
}
|