github.com/schemalex/git-schemalex@v0.0.0-20170921120917-b690b7f9e063/gitschemalex_test.go (about) 1 package gitschemalex 2 3 import ( 4 "context" 5 "database/sql" 6 "io/ioutil" 7 "os" 8 "os/exec" 9 "path/filepath" 10 "regexp" 11 "strconv" 12 "testing" 13 14 _ "github.com/go-sql-driver/mysql" 15 "github.com/lestrrat/go-test-mysqld" 16 ) 17 18 func TestRunner(t *testing.T) { 19 var dsn = "root:@tcp(127.0.0.1:3306)/mysql" 20 if ok, _ := strconv.ParseBool(os.Getenv("TRAVIS")); !ok { 21 mysqld, err := mysqltest.NewMysqld(nil) 22 if err != nil { 23 t.Fatal(err) 24 } 25 defer mysqld.Stop() 26 dsn = mysqld.DSN() 27 } 28 29 db, err := sql.Open("mysql", dsn) 30 if err != nil { 31 t.Fatal(err) 32 } 33 defer db.Close() 34 35 if _, err := db.Exec("CREATE DATABASE IF NOT EXISTS `test`"); err != nil { 36 t.Fatal(err) 37 } 38 39 if _, err := db.Exec("USE `test`"); err != nil { 40 t.Fatal(err) 41 } 42 43 dir, err := ioutil.TempDir("", "gitschemalex") 44 if err != nil { 45 t.Fatal(err) 46 } 47 defer os.RemoveAll(dir) 48 49 if err := os.Chdir(dir); err != nil { 50 t.Fatal(err) 51 } 52 53 if err := exec.Command("git", "init").Run(); err != nil { 54 t.Fatal(err) 55 } 56 57 if err := exec.Command("git", "config", "user.email", "hoge@example.com").Run(); err != nil { 58 t.Fatal(err) 59 } 60 61 if err := exec.Command("git", "config", "user.name", "hoge").Run(); err != nil { 62 t.Fatal(err) 63 } 64 65 schema, err := os.Create(filepath.Join(dir, "schema.sql")) 66 if err != nil { 67 t.Fatal(err) 68 } 69 70 // first table 71 72 if _, err := schema.WriteString("CREATE TABLE hoge ( `id` INTEGER NOT NULL, `c` VARCHAR(20) );\n"); err != nil { 73 t.Fatal(err) 74 } 75 76 if err := exec.Command("git", "add", "schema.sql").Run(); err != nil { 77 t.Fatal(err) 78 } 79 80 if err := exec.Command("git", "commit", "-m", "initial commit").Run(); err != nil { 81 t.Fatal(err) 82 } 83 84 // This is a silly hack, but we need to change the DSN from "mysql" or 85 // whatever to "test" 86 re := regexp.MustCompile(`/[^/]+$`) 87 dsn = re.ReplaceAllString(dsn, `/test`) 88 r := &Runner{ 89 Workspace: dir, 90 Deploy: true, 91 DSN: dsn, 92 Table: "git_schemalex_version", 93 Schema: "schema.sql", 94 } 95 if err := r.Run(context.TODO()); err != nil { 96 t.Fatal(err) 97 } 98 99 // deployed 100 if _, err := db.Exec("INSERT INTO `hoge` (`id`, `c`) VALUES (1, '2')"); err != nil { 101 t.Fatal(err) 102 } 103 104 // second table 105 106 if _, err := schema.WriteString("CREATE TABLE fuga ( `id` INTEGER NOT NULL, `c` VARCHAR(20) );\n"); err != nil { 107 t.Fatal(err) 108 } 109 110 if err := exec.Command("git", "add", "schema.sql").Run(); err != nil { 111 t.Fatal(err) 112 } 113 if err := exec.Command("git", "commit", "--author", "hoge <hoge@example.com>", "-m", "second commit").Run(); err != nil { 114 t.Fatal(err) 115 } 116 117 if err := r.Run(context.TODO()); err != nil { 118 t.Fatal(err) 119 } 120 121 if _, err := db.Exec("INSERT INTO `fuga` (`id`, `c`) VALUES (1, '2')"); err != nil { 122 t.Fatal(err) 123 } 124 125 // equal version 126 if err := r.Run(context.TODO()); err != ErrEqualVersion { 127 t.Fatal("should %v got %v", err, ErrEqualVersion) 128 } 129 }