mirror of https://github.com/pressly/goose.git
83 lines
2.4 KiB
Go
83 lines
2.4 KiB
Go
package integration
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"errors"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/pressly/goose/v3"
|
|
"github.com/pressly/goose/v3/database"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
type collected struct {
|
|
fullpath string
|
|
version int64
|
|
}
|
|
|
|
func collectMigrations(t *testing.T, dir string) []collected {
|
|
t.Helper()
|
|
|
|
files, err := os.ReadDir(dir)
|
|
require.NoError(t, err)
|
|
all := make([]collected, 0, len(files))
|
|
for _, f := range files {
|
|
require.False(t, f.IsDir())
|
|
v, err := goose.NumericComponent(f.Name())
|
|
require.NoError(t, err)
|
|
all = append(all, collected{
|
|
fullpath: filepath.Base(f.Name()),
|
|
version: v,
|
|
})
|
|
}
|
|
return all
|
|
}
|
|
|
|
func testDatabase(t *testing.T, dialect database.Dialect, db *sql.DB, migrationsDir string) {
|
|
t.Helper()
|
|
|
|
ctx := context.Background()
|
|
// collect all migration files from the testdata directory
|
|
wantFiles := collectMigrations(t, migrationsDir)
|
|
// initialize a new goose provider
|
|
p, err := goose.NewProvider(dialect, db, os.DirFS(migrationsDir))
|
|
require.NoError(t, err)
|
|
require.Equal(t, len(wantFiles), len(p.ListSources()), "number of migrations")
|
|
// run all up migrations
|
|
results, err := p.Up(ctx)
|
|
require.NoError(t, err)
|
|
require.Equal(t, len(wantFiles), len(results), "number of migrations applied")
|
|
for i, r := range results {
|
|
require.Equal(t, wantFiles[i].fullpath, r.Source.Path, "migration file")
|
|
require.Equal(t, wantFiles[i].version, r.Source.Version, "migration version")
|
|
}
|
|
// check the current version
|
|
currentVersion, err := p.GetDBVersion(ctx)
|
|
require.NoError(t, err)
|
|
require.Equal(t, len(wantFiles), int(currentVersion), "current version")
|
|
// run all down migrations
|
|
results, err = p.DownTo(ctx, 0)
|
|
require.NoError(t, err)
|
|
require.Equal(t, len(wantFiles), len(results), "number of migrations rolled back")
|
|
// check the current version
|
|
currentVersion, err = p.GetDBVersion(ctx)
|
|
require.NoError(t, err)
|
|
require.Equal(t, 0, int(currentVersion), "current version")
|
|
// run all up migrations one by one
|
|
for i := range len(wantFiles) {
|
|
result, err := p.UpByOne(ctx)
|
|
require.NoError(t, err)
|
|
if errors.Is(err, goose.ErrNoNextVersion) {
|
|
break
|
|
}
|
|
require.Equal(t, wantFiles[i].fullpath, result.Source.Path, "migration file")
|
|
}
|
|
// check the current version
|
|
currentVersion, err = p.GetDBVersion(ctx)
|
|
require.NoError(t, err)
|
|
require.Equal(t, len(wantFiles), int(currentVersion), "current version")
|
|
}
|