func TestMigrate(t *testing.T) { var session *gocql.Session driverUrl := "cassandra://localhost/migratetest" // prepare a clean test database u, err := url.Parse(driverUrl) if err != nil { t.Fatal(err) } splittedHosts := strings.Split(u.Host, ",") cluster := gocql.NewCluster(splittedHosts...) cluster.Keyspace = u.Path[1:len(u.Path)] cluster.Consistency = gocql.All cluster.Timeout = 1 * time.Minute session, err = cluster.CreateSession() if err != nil { t.Fatal(err) } if err := session.Query(`DROP TABLE IF EXISTS yolo`).Exec(); err != nil { t.Fatal(err) } if err := session.Query(`DROP TABLE IF EXISTS ` + tableName).Exec(); err != nil { t.Fatal(err) } d := &Driver{} if err := d.Initialize(driverUrl); err != nil { t.Fatal(err) } files := []file.File{ { Path: "/foobar", FileName: "20150801233454_foobar.up.sql", Version: 20150801233454, Name: "foobar", Direction: direction.Up, Content: []byte(` CREATE TABLE yolo ( id varint primary key, msg text ); CREATE INDEX ON yolo (msg); `), }, { Path: "/foobar", FileName: "20150801233454_foobar.down.sql", Version: 20150801233454, Name: "foobar", Direction: direction.Down, Content: []byte(` DROP TABLE yolo; `), }, { Path: "/foobar", FileName: "20150803233454_foobar.up.sql", Version: 20150803233454, Name: "foobar", Direction: direction.Up, Content: []byte(` CREATE TABLE error ( id THIS WILL CAUSE AN ERROR ) `), }, } pipe := pipep.New() go d.Migrate(files[0], pipe) errs := pipep.ReadErrors(pipe) if len(errs) > 0 { t.Fatal(errs) } version, err := d.Version() if err != nil { t.Fatal(err) } if version != 20150801233454 { t.Fatal("Unable to migrate up. Expected 20150801233454 but get ", version) } pipe = pipep.New() go d.Migrate(files[1], pipe) errs = pipep.ReadErrors(pipe) if len(errs) > 0 { t.Fatal(errs) } version, err = d.Version() if err != nil { t.Fatal(err) } if version != 0 { t.Fatal("Unable to migrate down. Expected 0 but get ", version) } pipe = pipep.New() go d.Migrate(files[2], pipe) errs = pipep.ReadErrors(pipe) if len(errs) == 0 { t.Error("Expected test case to fail") } version, err = d.Version() if err != nil { t.Fatal(err) } if version != 0 { t.Fatal("This migration should have failed, so we should get the last migration version 0 in here.", version) } if err := d.Close(); err != nil { t.Fatal(err) } }
// TestMigrate runs some additional tests on Migrate() // Basic testing is already done in migrate/migrate_test.go func TestMigrate(t *testing.T) { driverFile := ":memory:" driverUrl := "sqlite3://" + driverFile // prepare clean database connection, err := sql.Open("sqlite3", driverFile) if err != nil { t.Fatal(err) } if _, err := connection.Exec(` DROP TABLE IF EXISTS yolo; DROP TABLE IF EXISTS ` + tableName + `;`); err != nil { t.Fatal(err) } d := &Driver{} if err := d.Initialize(driverUrl); err != nil { t.Fatal(err) } files := []file.File{ { Path: "/foobar", FileName: "001_foobar.up.sql", Version: 1, Name: "foobar", Direction: direction.Up, Content: []byte(` CREATE TABLE yolo ( id INTEGER PRIMARY KEY AUTOINCREMENT ); `), }, { Path: "/foobar", FileName: "002_foobar.down.sql", Version: 1, Name: "foobar", Direction: direction.Down, Content: []byte(` DROP TABLE yolo; `), }, { Path: "/foobar", FileName: "002_foobar.up.sql", Version: 1, Name: "foobar", Direction: direction.Down, Content: []byte(` CREATE TABLE error ( THIS; WILL CAUSE; AN ERROR; ) `), }, } pipe := pipep.New() go d.Migrate(files[0], pipe) errs := pipep.ReadErrors(pipe) if len(errs) > 0 { t.Fatal(errs) } pipe = pipep.New() go d.Migrate(files[1], pipe) errs = pipep.ReadErrors(pipe) if len(errs) > 0 { t.Fatal(errs) } pipe = pipep.New() go d.Migrate(files[2], pipe) errs = pipep.ReadErrors(pipe) if len(errs) == 0 { t.Error("Expected test case to fail") } if err := d.Close(); err != nil { t.Fatal(err) } }
// TestMigrate runs some additional tests on Migrate(). // Basic testing is already done in migrate/migrate_test.go func TestMigrate(t *testing.T) { driverUrl := "postgres://localhost/migratetest?sslmode=disable" // prepare clean database connection, err := sql.Open("postgres", driverUrl) if err != nil { t.Fatal(err) } if _, err := connection.Exec(` DROP TABLE IF EXISTS yolo; DROP TABLE IF EXISTS ` + tableName + `;`); err != nil { t.Fatal(err) } d := &Driver{} if err := d.Initialize(driverUrl); err != nil { t.Fatal(err) } files := []file.File{ { Path: "/foobar", FileName: "001_foobar.up.sql", Version: 1, Name: "foobar", Direction: direction.Up, Content: []byte(` CREATE TABLE yolo ( id serial not null primary key ); `), }, { Path: "/foobar", FileName: "002_foobar.down.sql", Version: 1, Name: "foobar", Direction: direction.Down, Content: []byte(` DROP TABLE yolo; `), }, { Path: "/foobar", FileName: "002_foobar.up.sql", Version: 2, Name: "foobar", Direction: direction.Up, Content: []byte(` CREATE TABLE error ( id THIS WILL CAUSE AN ERROR ) `), }, } pipe := pipep.New() go d.Migrate(files[0], pipe) errs := pipep.ReadErrors(pipe) if len(errs) > 0 { t.Fatal(errs) } pipe = pipep.New() go d.Migrate(files[1], pipe) errs = pipep.ReadErrors(pipe) if len(errs) > 0 { t.Fatal(errs) } pipe = pipep.New() go d.Migrate(files[2], pipe) errs = pipep.ReadErrors(pipe) if len(errs) == 0 { t.Error("Expected test case to fail") } if err := d.Close(); err != nil { t.Fatal(err) } }
// TestMigrate runs some additional tests on Migrate(). // Basic testing is already done in migrate/migrate_test.go func TestMigrate(t *testing.T) { driverUrl := "mysql://root@tcp(127.0.0.1:3306)/migratetest" // prepare clean database connection, err := sql.Open("mysql", strings.SplitN(driverUrl, "mysql://", 2)[1]) if err != nil { t.Fatal(err) } if _, err := connection.Exec(`DROP TABLE IF EXISTS yolo, yolo1, ` + tableName); err != nil { t.Fatal(err) } d := &Driver{} if err := d.Initialize(driverUrl); err != nil { t.Fatal(err) } files := []file.File{ { Path: "/foobar", FileName: "001_foobar.up.sql", Version: 1, Name: "foobar", Direction: direction.Up, Content: []byte(` CREATE TABLE yolo ( id int(11) not null primary key auto_increment ); CREATE TABLE yolo1 ( id int(11) not null primary key auto_increment ); `), }, { Path: "/foobar", FileName: "002_foobar.down.sql", Version: 1, Name: "foobar", Direction: direction.Down, Content: []byte(` DROP TABLE yolo; `), }, { Path: "/foobar", FileName: "002_foobar.up.sql", Version: 2, Name: "foobar", Direction: direction.Up, Content: []byte(` // a comment CREATE TABLE error ( id THIS WILL CAUSE AN ERROR ); `), }, } pipe := pipep.New() go d.Migrate(files[0], pipe) errs := pipep.ReadErrors(pipe) if len(errs) > 0 { t.Fatal(errs) } pipe = pipep.New() go d.Migrate(files[1], pipe) errs = pipep.ReadErrors(pipe) if len(errs) > 0 { t.Fatal(errs) } pipe = pipep.New() go d.Migrate(files[2], pipe) errs = pipep.ReadErrors(pipe) if len(errs) == 0 { t.Error("Expected test case to fail") } if err := d.Close(); err != nil { t.Fatal(err) } }
// UpSync is synchronous version of Up func UpSync(url, migrationsPath string) (err []error, ok bool) { pipe := pipep.New() go Up(pipe, url, migrationsPath) err = pipep.ReadErrors(pipe) return err, len(err) == 0 }
// MigrateSync is synchronous version of Migrate func MigrateSync(url, migrationsPath string, relativeN int) (err []error, ok bool) { pipe := pipep.New() go Migrate(pipe, url, migrationsPath, relativeN) err = pipep.ReadErrors(pipe) return err, len(err) == 0 }