package goose_test import ( "database/sql" "embed" "io/fs" "os" "path/filepath" "testing" "github.com/pressly/goose/v3" "github.com/stretchr/testify/require" _ "modernc.org/sqlite" ) //go:embed testdata/migrations/*.sql var embedMigrations embed.FS func TestEmbeddedMigrations(t *testing.T) { dir := t.TempDir() // not using t.Parallel here to avoid races db, err := sql.Open("sqlite", filepath.Join(dir, "sql_embed.db")) require.NoError(t, err) db.SetMaxOpenConns(1) migrationFiles, err := fs.ReadDir(embedMigrations, "testdata/migrations") require.NoError(t, err) total := len(migrationFiles) // decouple from existing structure fsys, err := fs.Sub(embedMigrations, "testdata/migrations") require.NoError(t, err) goose.SetBaseFS(fsys) t.Cleanup(func() { goose.SetBaseFS(nil) }) require.NoError(t, goose.SetDialect("sqlite3")) t.Run("migration_cycle", func(t *testing.T) { err := goose.Up(db, ".") require.NoError(t, err) ver, err := goose.GetDBVersion(db) require.NoError(t, err) require.EqualValues(t, ver, total) err = goose.Reset(db, ".") require.NoError(t, err) ver, err = goose.GetDBVersion(db) require.NoError(t, err) require.EqualValues(t, 0, ver) }) t.Run("create_uses_os_fs", func(t *testing.T) { dir := t.TempDir() err := goose.Create(db, dir, "test", "sql") require.NoError(t, err) paths, _ := filepath.Glob(filepath.Join(dir, "*test.sql")) require.NotEmpty(t, paths) err = goose.Fix(dir) require.NoError(t, err) _, err = os.Stat(filepath.Join(dir, "00001_test.sql")) require.NoError(t, err) }) }