blob: 594f4f594f06dd37d3e6f00db354e00493ce52a1 [file] [log] [blame]
package migrate
import (
"io/ioutil"
"os"
"regexp"
"testing"
// Ensure imports for each driver we wish to test
_ "gopkg.in/mattes/migrate.v1/driver/postgres"
_ "gopkg.in/mattes/migrate.v1/driver/ql"
_ "gopkg.in/mattes/migrate.v1/driver/sqlite3"
)
// Add Driver URLs here to test basic Up, Down, .. functions.
var driverURLs = []string{
"postgres://postgres@" + os.Getenv("POSTGRES_PORT_5432_TCP_ADDR") + ":" + os.Getenv("POSTGRES_PORT_5432_TCP_PORT") + "/template1?sslmode=disable",
"ql+file://./test.db",
}
func tearDown(driverURL, tmpdir string) {
DownSync(driverURL, tmpdir)
os.RemoveAll(tmpdir)
}
func TestCreate(t *testing.T) {
if testing.Short() {
t.Skip("skipping test in short mode.")
}
for _, driverURL := range driverURLs {
t.Logf("Test driver: %s", driverURL)
tmpdir, err := ioutil.TempDir("/tmp", "migrate-test")
if err != nil {
t.Fatal(err)
}
defer tearDown(driverURL, tmpdir)
if _, err = Create(driverURL, tmpdir, "test_migration"); err != nil {
t.Fatal(err)
}
if _, err = Create(driverURL, tmpdir, "another migration"); err != nil {
t.Fatal(err)
}
files, err := ioutil.ReadDir(tmpdir)
if err != nil {
t.Fatal(err)
}
if len(files) != 4 {
t.Fatal("Expected 4 new files, got", len(files))
}
fileNameRegexp := regexp.MustCompile(`^\d{10}_(.*.[up|down].sql)`)
expectFiles := []string{
"test_migration.up.sql", "test_migration.down.sql",
"another_migration.up.sql", "another_migration.down.sql",
}
var foundCounter int
for _, file := range files {
if x := fileNameRegexp.FindStringSubmatch(file.Name()); len(x) != 2 {
t.Errorf("expected %v to match %v", file.Name(), fileNameRegexp)
} else {
for _, expect := range expectFiles {
if expect == x[1] {
foundCounter++
break
}
}
}
}
if foundCounter != len(expectFiles) {
t.Errorf("expected %v files, got %v", len(expectFiles), foundCounter)
}
}
}
func TestReset(t *testing.T) {
if testing.Short() {
t.Skip("skipping test in short mode.")
}
for _, driverURL := range driverURLs {
t.Logf("Test driver: %s", driverURL)
tmpdir, err := ioutil.TempDir("/tmp", "migrate-test")
if err != nil {
t.Fatal(err)
}
defer tearDown(driverURL, tmpdir)
Create(driverURL, tmpdir, "migration1")
f, err := Create(driverURL, tmpdir, "migration2")
if err != nil {
t.Fatal(err)
}
if err, ok := ResetSync(driverURL, tmpdir); !ok {
t.Fatal(err)
}
if version, err := Version(driverURL, tmpdir); err != nil {
t.Fatal(err)
} else if version != f.Version {
t.Fatalf("Expected version %v, got %v", version, f.Version)
}
}
}
func TestDown(t *testing.T) {
if testing.Short() {
t.Skip("skipping test in short mode.")
}
for _, driverURL := range driverURLs {
t.Logf("Test driver: %s", driverURL)
tmpdir, err := ioutil.TempDir("/tmp", "migrate-test")
if err != nil {
t.Fatal(err)
}
defer tearDown(driverURL, tmpdir)
initVersion, _ := Version(driverURL, tmpdir)
firstMigration, _ := Create(driverURL, tmpdir, "migration1")
secondMigration, _ := Create(driverURL, tmpdir, "migration2")
t.Logf("init %v first %v second %v", initVersion, firstMigration.Version, secondMigration.Version)
if err, ok := ResetSync(driverURL, tmpdir); !ok {
t.Fatal(err)
}
if version, err := Version(driverURL, tmpdir); err != nil {
t.Fatal(err)
} else if version != secondMigration.Version {
t.Fatalf("Expected version %v, got %v", version, secondMigration.Version)
}
if err, ok := DownSync(driverURL, tmpdir); !ok {
t.Fatal(err)
}
if version, err := Version(driverURL, tmpdir); err != nil {
t.Fatal(err)
} else if version != 0 {
t.Fatalf("Expected 0, got %v", version)
}
}
}
func TestUp(t *testing.T) {
if testing.Short() {
t.Skip("skipping test in short mode.")
}
for _, driverURL := range driverURLs {
t.Logf("Test driver: %s", driverURL)
tmpdir, err := ioutil.TempDir("/tmp", "migrate-test")
if err != nil {
t.Fatal(err)
}
defer tearDown(driverURL, tmpdir)
initVersion, _ := Version(driverURL, tmpdir)
firstMigration, _ := Create(driverURL, tmpdir, "migration1")
secondMigration, _ := Create(driverURL, tmpdir, "migration2")
t.Logf("init %v first %v second %v", initVersion, firstMigration.Version, secondMigration.Version)
if err, ok := DownSync(driverURL, tmpdir); !ok {
t.Fatal(err)
}
if version, err := Version(driverURL, tmpdir); err != nil {
t.Fatal(err)
} else if version != initVersion {
t.Fatalf("Expected initial version %v, got %v", initVersion, version)
}
if err, ok := UpSync(driverURL, tmpdir); !ok {
t.Fatal(err)
}
if version, err := Version(driverURL, tmpdir); err != nil {
t.Fatal(err)
} else if version != secondMigration.Version {
t.Fatalf("Expected migrated version %v, got %v", secondMigration.Version, version)
}
}
}
func TestRedo(t *testing.T) {
if testing.Short() {
t.Skip("skipping test in short mode.")
}
for _, driverURL := range driverURLs {
t.Logf("Test driver: %s", driverURL)
tmpdir, err := ioutil.TempDir("/tmp", "migrate-test")
if err != nil {
t.Fatal(err)
}
defer tearDown(driverURL, tmpdir)
initVersion, _ := Version(driverURL, tmpdir)
firstMigration, _ := Create(driverURL, tmpdir, "migration1")
secondMigration, _ := Create(driverURL, tmpdir, "migration2")
t.Logf("init %v first %v second %v", initVersion, firstMigration.Version, secondMigration.Version)
if err, ok := ResetSync(driverURL, tmpdir); !ok {
t.Fatal(err)
}
if version, err := Version(driverURL, tmpdir); err != nil {
t.Fatal(err)
} else if version != secondMigration.Version {
t.Fatalf("Expected migrated version %v, got %v", secondMigration.Version, version)
}
if err, ok := RedoSync(driverURL, tmpdir); !ok {
t.Fatal(err)
}
if version, err := Version(driverURL, tmpdir); err != nil {
t.Fatal(err)
} else if version != secondMigration.Version {
t.Fatalf("Expected migrated version %v, got %v", secondMigration.Version, version)
}
}
}
func TestMigrate(t *testing.T) {
if testing.Short() {
t.Skip("skipping test in short mode.")
}
for _, driverURL := range driverURLs {
t.Logf("Test driver: %s", driverURL)
tmpdir, err := ioutil.TempDir("/tmp", "migrate-test")
if err != nil {
t.Fatal(err)
}
defer tearDown(driverURL, tmpdir)
initVersion, _ := Version(driverURL, tmpdir)
firstMigration, _ := Create(driverURL, tmpdir, "migration1")
secondMigration, _ := Create(driverURL, tmpdir, "migration2")
t.Logf("init %v first %v second %v", initVersion, firstMigration.Version, secondMigration.Version)
if err, ok := ResetSync(driverURL, tmpdir); !ok {
t.Fatal(err)
}
if version, err := Version(driverURL, tmpdir); err != nil {
t.Fatal(err)
} else if version != secondMigration.Version {
t.Fatalf("Expected migrated version %v, got %v", secondMigration.Version, version)
}
if err, ok := MigrateSync(driverURL, tmpdir, -2); !ok {
t.Fatal(err)
}
if version, err := Version(driverURL, tmpdir); err != nil {
t.Fatal(err)
} else if version != 0 {
t.Fatalf("Expected 0, got %v", version)
}
if err, ok := MigrateSync(driverURL, tmpdir, +1); !ok {
t.Fatal(err)
}
if version, err := Version(driverURL, tmpdir); err != nil {
t.Fatal(err)
} else if version != firstMigration.Version {
t.Fatalf("Expected first version %v, got %v", firstMigration.Version, version)
}
}
}