goose/tests/gomigrations/error/gomigrations_error_test.go

74 lines
2.3 KiB
Go

package gomigrations
import (
"database/sql"
"path/filepath"
"testing"
"github.com/pressly/goose/v3"
_ "github.com/pressly/goose/v3/tests/gomigrations/error/testdata"
"github.com/stretchr/testify/require"
_ "modernc.org/sqlite"
)
func TestGoMigrationByOne(t *testing.T) {
tempDir := t.TempDir()
db, err := sql.Open("sqlite", filepath.Join(tempDir, "test.db"))
require.NoError(t, err)
err = goose.SetDialect(string(goose.DialectSQLite3))
require.NoError(t, err)
// Create goose table.
current, err := goose.EnsureDBVersion(db)
require.NoError(t, err)
require.Equal(t, current, 0)
// Collect migrations.
dir := "testdata"
migrations, err := goose.CollectMigrations(dir, 0, goose.MaxVersion)
require.NoError(t, err)
require.Equal(t, len(migrations), 4)
// Setup table.
err = migrations[0].Up(db)
require.NoError(t, err)
version, err := goose.GetDBVersion(db)
require.NoError(t, err)
require.Equal(t, version, 1)
// Registered Go migration run outside a goose tx using *sql.DB.
err = migrations[1].Up(db)
require.Error(t, err)
require.Contains(t, err.Error(), "failed to run go migration")
version, err = goose.GetDBVersion(db)
require.NoError(t, err)
require.Equal(t, version, 1)
// This migration was inserting 100 rows, but fails at 50, and
// because it's run outside a goose tx then we expect 50 rows.
var count int
err = db.QueryRow("SELECT COUNT(*) FROM foo").Scan(&count)
require.NoError(t, err)
require.Equal(t, count, 50)
// Truncate table so we have 0 rows.
err = migrations[2].Up(db)
require.NoError(t, err)
version, err = goose.GetDBVersion(db)
require.NoError(t, err)
// We're at version 3, but keep in mind 2 was never applied because it failed.
require.Equal(t, version, 3)
// Registered Go migration run within a tx.
err = migrations[3].Up(db)
require.Error(t, err)
require.Contains(t, err.Error(), "failed to run go migration")
version, err = goose.GetDBVersion(db)
require.NoError(t, err)
require.Equal(t, version, 3) // This migration failed, so we're still at 3.
// This migration was inserting 100 rows, but fails at 50. However, since it's
// running within a tx we expect none of the inserts to persist.
err = db.QueryRow("SELECT COUNT(*) FROM foo").Scan(&count)
require.NoError(t, err)
require.Equal(t, count, 0)
}