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  }