Newer
Older
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package sqlutil
import (
"context"
"database/sql"
"io/ioutil"
"os"
"testing"
)
func init() {
DebugMigrations = true
}
func TestOpenDB(t *testing.T) {
dir, err := ioutil.TempDir("", "")
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(dir)
db, err := OpenDB(dir+"/test.db", nil)
if err != nil {
t.Fatal(err)
}
db.Close()
}
func getTestValue(db *sql.DB, id int) (out string, err error) {
err = WithReadonlyTx(context.Background(), db, func(tx *sql.Tx) error {
return tx.QueryRow("SELECT value FROM test WHERE id=?", id).Scan(&out)
})
return
}
func checkTestValue(t *testing.T, db *sql.DB) {
value, err := getTestValue(db, 1)
if err != nil {
t.Fatal(err)
}
if value != "test" {
t.Fatalf("got bad value '%s', expected 'test'", value)
}
}
func TestOpenDB_Migrations_MultipleStatements(t *testing.T) {
dir, err := ioutil.TempDir("", "")
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(dir)
db, err := OpenDB(dir+"/test.db", []func(*sql.Tx) error{
Statement("CREATE TABLE test (id INTEGER PRIMARY KEY NOT NULL, value TEXT)"),
Statement("CREATE INDEX idx_test_value ON test(value)"),
Statement("INSERT INTO test (id, value) VALUES (1, 'test')"),
})
if err != nil {
t.Fatal(err)
}
defer db.Close()
checkTestValue(t, db)
}
func TestOpenDB_Migrations_SingleStatement(t *testing.T) {
dir, err := ioutil.TempDir("", "")
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(dir)
db, err := OpenDB(dir+"/test.db", []func(*sql.Tx) error{
Statement(
"CREATE TABLE test (id INTEGER PRIMARY KEY NOT NULL, value TEXT)",
"CREATE INDEX idx_test_value ON test(value)",
"INSERT INTO test (id, value) VALUES (1, 'test')",
),
})
if err != nil {
t.Fatal(err)
}
defer db.Close()
checkTestValue(t, db)
}
func TestOpenDB_Migrations_Versions(t *testing.T) {
dir, err := ioutil.TempDir("", "")
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(dir)
migrations := []func(*sql.Tx) error{
Statement("CREATE TABLE test (id INTEGER PRIMARY KEY NOT NULL, value TEXT)"),
Statement("CREATE INDEX idx_test_value ON test(value)"),
}
db, err := OpenDB(dir+"/test.db", migrations)
if err != nil {
t.Fatal("first open: ", err)
}
db.Close()
migrations = append(migrations, Statement("INSERT INTO test (id, value) VALUES (1, 'test')"))
db, err = OpenDB(dir+"/test.db", migrations)
if err != nil {
t.Fatal("second open: ", err)
}
defer db.Close()
checkTestValue(t, db)
}
func TestOpenDB_Write(t *testing.T) {
dir, err := ioutil.TempDir("", "")
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(dir)
db, err := OpenDB(dir+"/test.db", []func(*sql.Tx) error{
Statement(
"CREATE TABLE test (id INTEGER PRIMARY KEY NOT NULL, value TEXT)",
"CREATE INDEX idx_test_value ON test(value)",
),
})
if err != nil {
t.Fatal(err)
}
defer db.Close()
err = WithTx(context.Background(), db, func(tx *sql.Tx) error {
_, err := tx.Exec("INSERT INTO test (id, value) VALUES (?, ?)", 1, "test")
return err
})
if err != nil {
t.Fatalf("INSERT error: %v", err)
}
checkTestValue(t, db)
}