github.com/gocaveman/caveman@v0.0.0-20191211162744-0ddf99dbdf6e/migrate/migrate_test.go (about) 1 package migrate 2 3 import ( 4 "testing" 5 6 "github.com/gocaveman/caveman/migrate/migratedbr" 7 "github.com/gocraft/dbr" 8 "github.com/spf13/afero" 9 "github.com/stretchr/testify/assert" 10 11 _ "github.com/mattn/go-sqlite3" 12 ) 13 14 func writeFile(fs afero.Fs, p string, b []byte) { 15 16 f, err := fs.Create(p) 17 if err != nil { 18 panic(err) 19 } 20 defer f.Close() 21 f.Write(b) 22 23 } 24 25 func writeTestFiles(fs afero.Fs) { 26 27 fs.Mkdir("/data", 0755) 28 29 writeFile(fs, "/data/sqlite3-example1-2017120101_test1-up.sql", []byte(` 30 CREATE TABLE test1( 31 id TEXT, 32 PRIMARY KEY(id) 33 ); 34 ALTER TABLE test1 ADD COLUMN name TEXT; 35 `)) 36 37 writeFile(fs, "/data/sqlite3-example1-2017120101_test1-down.sql", []byte(` 38 DROP TABLE test1; 39 `)) 40 41 writeFile(fs, "/data/sqlite3-example1-2017120102_test2-up.sql", []byte(` 42 CREATE TABLE test2( 43 id TEXT, 44 name TEXT, 45 PRIMARY KEY(id) 46 ); 47 `)) 48 49 writeFile(fs, "/data/sqlite3-example1-2017120102_test2-down.sql", []byte(` 50 DROP TABLE test2; 51 `)) 52 53 writeFile(fs, "/data/sqlite3-example2-2017120103_test3-up.sql", []byte(` 54 CREATE TABLE test3( 55 id TEXT, 56 name TEXT, 57 PRIMARY KEY(id) 58 ); 59 `)) 60 61 writeFile(fs, "/data/sqlite3-example2-2017120103_test3-down.sql", []byte(` 62 DROP TABLE test3; 63 `)) 64 65 } 66 67 func TestLoadSQLMigrationsHFS(t *testing.T) { 68 69 assert := assert.New(t) 70 71 fs := afero.NewMemMapFs() 72 writeTestFiles(fs) 73 74 hfs := afero.NewHttpFs(fs) 75 76 ml, err := LoadSQLMigrationsHFS(hfs, "/data") 77 if err != nil { 78 t.Fatal(err) 79 } 80 81 assert.Equal(3, len(ml.WithDriverName("sqlite3"))) 82 assert.Equal(2, len(ml.WithDriverName("sqlite3").WithCategory("example1"))) 83 assert.Equal("2017120101_test1", ml.WithDriverName("sqlite3").WithCategory("example1").Versions()[0]) 84 assert.Equal("2017120102_test2", ml.WithDriverName("sqlite3").WithCategory("example1").Versions()[1]) 85 86 mig := ml.WithDriverName("sqlite3").WithCategory("example1")[0].(*SQLMigration) 87 assert.Equal("2017120101_test1", mig.Version()) 88 assert.Equal(2, len(mig.UpSQL)) 89 90 } 91 92 func TestRunner(t *testing.T) { 93 94 assert := assert.New(t) 95 96 fs := afero.NewMemMapFs() 97 writeTestFiles(fs) 98 99 hfs := afero.NewHttpFs(fs) 100 101 ml, err := LoadSQLMigrationsHFS(hfs, "/data") 102 if err != nil { 103 t.Fatal(err) 104 } 105 106 dsn := `file:TestRunner?mode=memory&cache=shared` 107 driverName := "sqlite3" 108 109 versioner, err := migratedbr.New(driverName, dsn) 110 if err != nil { 111 t.Fatal(err) 112 } 113 114 runner := NewRunner(driverName, dsn, versioner, ml) 115 116 result, err := runner.CheckAll(true) 117 if err != nil { 118 t.Fatal(err) 119 } 120 121 for _, item := range result { 122 if item.Category == "example1" { 123 assert.Equal("", item.CurrentVersion) 124 assert.Equal("2017120102_test2", item.LatestVersion) 125 } 126 } 127 128 err = runner.RunAllUpToLatest() 129 assert.NoError(err) 130 131 conn, err := dbr.Open(driverName, dsn, nil) 132 assert.NoError(err) 133 134 sess := conn.NewSession(nil) 135 136 _, err = sess.InsertInto("test1").Columns("id", "name").Values("k1", "Key 1").Exec() 137 assert.NoError(err) 138 _, err = sess.InsertInto("test2").Columns("id", "name").Values("k2", "Key 2").Exec() 139 assert.NoError(err) 140 141 var name string 142 err = sess.Select("name").From("test2").Where("id = ?", "k2").LoadOne(&name) 143 assert.NoError(err) 144 145 assert.Equal("Key 2", name) 146 147 // now step example1 down 148 err = runner.RunTo("example1", "2017120101_test1") 149 assert.NoError(err) 150 151 // make sure test2 errors now 152 err = sess.Select("name").From("test2").Where("id = ?", "k2").LoadOne(&name) 153 assert.Error(err) 154 155 version := "" 156 err = sess.Select("version").From("migration_state").Where("category = ?", "example1").LoadOne(&version) 157 assert.NoError(err) 158 assert.Equal("2017120101_test1", version) 159 160 // and upgrade it again 161 err = runner.RunUpTo("example1", "2017120102_test2") 162 assert.NoError(err) 163 // and make sure test2 exists now 164 _, err = sess.InsertInto("test2").Columns("id", "name").Values("k2", "Key 2").Exec() 165 assert.NoError(err) 166 err = sess.Select("name").From("test2").Where("id = ?", "k2").LoadOne(&name) 167 assert.NoError(err) 168 169 } 170 171 func TestSQLTmplMigration(t *testing.T) { 172 173 assert := assert.New(t) 174 175 dsn := `file:TestSQLTmplMigration?mode=memory&cache=shared` 176 driverName := "sqlite3" 177 178 var ml MigrationList 179 ml = append(ml, &SQLTmplMigration{ 180 DriverNameValue: driverName, 181 CategoryValue: "example1", 182 VersionValue: "0001", 183 TablePrefix: "prefix_", 184 UpSQL: []string{` 185 CREATE TABLE {{.TablePrefix}}test1( 186 id TEXT, 187 name TEXT, 188 PRIMARY KEY(id) 189 ); 190 `}, 191 DownSQL: []string{` 192 DROP TABLE {{.TablePrefix}}test1; 193 `}, 194 }) 195 196 versioner, err := migratedbr.New(driverName, dsn) 197 if err != nil { 198 t.Fatal(err) 199 } 200 201 runner := NewRunner(driverName, dsn, versioner, ml) 202 203 err = runner.RunAllUpToLatest() 204 assert.NoError(err) 205 206 conn, err := dbr.Open(driverName, dsn, nil) 207 assert.NoError(err) 208 209 sess := conn.NewSession(nil) 210 211 _, err = sess.InsertInto("prefix_test1").Columns("id", "name").Values("k1", "Key 1").Exec() 212 assert.NoError(err) 213 }