goose/tests/gomigrations/success/gomigrations_success_test.go

98 lines
2.1 KiB
Go

package gomigrations_test
import (
"database/sql"
"path/filepath"
"testing"
"github.com/pressly/goose/v3"
"github.com/stretchr/testify/require"
_ "github.com/pressly/goose/v3/tests/gomigrations/success/testdata"
_ "modernc.org/sqlite"
)
func TestGoMigrationByOne(t *testing.T) {
t.Parallel()
require.NoError(t, goose.SetDialect("sqlite3"))
db, err := sql.Open("sqlite", ":memory:")
require.NoError(t, err)
dir := "testdata"
files, err := filepath.Glob(dir + "/*.go")
require.NoError(t, err)
upByOne := func(t *testing.T) int64 {
err = goose.UpByOne(db, dir)
t.Logf("err: %v %s", err, dir)
require.NoError(t, err)
version, err := goose.GetDBVersion(db)
require.NoError(t, err)
return version
}
downByOne := func(t *testing.T) int64 {
err = goose.Down(db, dir)
require.NoError(t, err)
version, err := goose.GetDBVersion(db)
require.NoError(t, err)
return version
}
// Migrate all files up-by-one.
for i := 1; i <= len(files); i++ {
require.Equal(t, upByOne(t), i)
}
version, err := goose.GetDBVersion(db)
require.NoError(t, err)
require.Equal(t, version, len(files))
tables, err := ListTables(db)
require.NoError(t, err)
require.Equal(t, tables, []string{
"alpha",
"bravo",
"charlie",
"delta",
"echo",
"foxtrot",
"golf",
"goose_db_version",
"hotel",
"sqlite_sequence",
})
// Migrate all files down-by-one.
for i := len(files) - 1; i >= 0; i-- {
require.Equal(t, downByOne(t), i)
}
version, err = goose.GetDBVersion(db)
require.NoError(t, err)
require.Equal(t, version, 0)
tables, err = ListTables(db)
require.NoError(t, err)
require.Equal(t, tables, []string{
"goose_db_version",
"sqlite_sequence",
})
}
func ListTables(db *sql.DB) ([]string, error) {
rows, err := db.Query(`SELECT name FROM sqlite_master WHERE type='table' ORDER BY name`)
if err != nil {
return nil, err
}
defer rows.Close()
var tables []string
for rows.Next() {
var name string
if err := rows.Scan(&name); err != nil {
return nil, err
}
tables = append(tables, name)
}
if err := rows.Err(); err != nil {
return nil, err
}
return tables, nil
}