aboutsummaryrefslogtreecommitdiff
path: root/migrate_test.go
blob: c857014b4a4f4e88d6131223e54430b6ad72e8d8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package migrate

import (
	"database/sql"
	"testing"

	_ "github.com/mattn/go-sqlite3"
)

const testDB = "file:test?mode=memory&cache=shared"

type mig struct {
	version int64
	sql     string
}

func createMigration(v int64, sql string) Migration {
	return &mig{version: v, sql: sql}
}

func (m mig) Version() int64 { return m.version }

func (m mig) Run(tx *sql.Tx) error {
	_, err := tx.Exec(m.sql)
	return err
}

var testMigrations = []struct {
	version int64
	sql     string
}{
	// Out of order please
	{version: 2, sql: "insert into test1 (pk) values (1)"},
	{version: 3, sql: "insert into test1 (pk) values (2)"},
	{version: 1, sql: "create table if not exists test1 (pk bigint not null primary key)"},
}

func TestMigrate(t *testing.T) {
	// Load migrations
	var migrations []Migration
	for _, m := range testMigrations {
		migrations = append(migrations, createMigration(m.version, m.sql))
	}

	db, err := sql.Open("sqlite3", testDB)
	if err != nil {
		t.Fatalf("DB setup failed: %v", err)
	}
	defer db.Close()
	//db.SetMaxOpenConns(1)

	migrator := Migrator{
		db:         db,
		migrations: migrations,
	}

	v, err := migrator.Version()
	if err != nil {
		t.Fatalf("Migrator.Version() failed: %v", err)
	}
	if v != NilVersion {
		t.Fatalf("Migrator.Version() should be NilVersion, got %d", v)
	}

	err = migrator.Migrate()
	if err != nil {
		t.Fatalf("Migrator.Migrate() failed: %v", err)
	}

	v, err = migrator.Version()
	if err != nil {
		t.Fatalf("Migrator.Version() failed: %v", err)
	}

	if int(v) != len(migrations) {
		t.Errorf("expected migration version %d, got %d", len(migrations), v)
	}

	var result int64
	err = db.QueryRow(`select pk from test1`).Scan(&result)
	if err != nil {
		t.Fatal(err)
	}
}