-
Notifications
You must be signed in to change notification settings - Fork 2
/
sqlite3_test.go
153 lines (139 loc) · 3.58 KB
/
sqlite3_test.go
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
144
145
146
147
148
149
150
151
152
153
package sqlite3
import (
"io/ioutil"
"os"
"reflect"
"testing"
"github.com/db-journey/migrate/v2/direction"
"github.com/db-journey/migrate/v2/driver"
"github.com/db-journey/migrate/v2/file"
)
// TestMigrate runs some additional tests on Migrate()
// Basic testing is already done in migrate/migrate_test.go
func TestMigrate(t *testing.T) {
f, err := ioutil.TempFile(os.TempDir(), "migrate_test")
if err != nil {
t.Fatal(err)
}
defer os.Remove(f.Name())
var d driver.Driver
if d, err = Open("sqlite3://" + f.Name()); err != nil {
t.Fatal(err)
}
files := []file.File{
{
Path: "/foobar",
FileName: "20060102150405_foobar.up.sql",
Version: 20060102150405,
Name: "foobar",
Direction: direction.Up,
Content: []byte(`
CREATE TABLE yolo (
id INTEGER PRIMARY KEY AUTOINCREMENT
);
`),
},
{
Path: "/foobar",
FileName: "20060102200405_alter_table.up.sql",
Version: 20060102200405,
Name: "alter_table",
Direction: direction.Up,
Content: []byte(`
ALTER TABLE yolo ADD COLUMN data1 VCHAR(255);
ALTER TABLE yolo ADD COLUMN data2 VCHAR(255);
`),
},
{
Path: "/foobar",
FileName: "20060102150405_foobar.down.sql",
Version: 20060102150405,
Name: "foobar",
Direction: direction.Down,
Content: []byte(`
DROP TABLE yolo;
`),
},
{
Path: "/foobar",
FileName: "20060102150406_failing.up.sql",
Version: 20060103200406,
Name: "failing",
Direction: direction.Down,
Content: []byte(`
CREATE TABLE error (
THIS; WILL CAUSE; AN ERROR;
)
`),
},
}
err = d.Migrate(files[0])
if err != nil {
t.Fatal(err)
}
version, err := d.Version()
if err != nil {
t.Fatal(err)
}
if version != files[0].Version {
t.Errorf("Expected version to be: %d, got: %d", files[0].Version, version)
}
// Check versions applied in DB.
expectedVersions := file.Versions{files[0].Version}
versions, err := d.Versions()
if err != nil {
t.Errorf("Could not fetch versions: %s", err)
}
if !reflect.DeepEqual(versions, expectedVersions) {
t.Errorf("Expected versions to be: %v, got: %v", expectedVersions, versions)
}
err = d.Migrate(files[1])
if err != nil {
t.Fatal(err)
}
if _, err := d.(*Driver).db.Query("SELECT id, data1, data2 FROM yolo"); err != nil {
t.Errorf("Sequential migration failed: %v", err)
}
// Check versions applied in DB.
expectedVersions = file.Versions{files[1].Version, files[0].Version}
versions, err = d.Versions()
if err != nil {
t.Errorf("Could not fetch versions: %s", err)
}
if !reflect.DeepEqual(versions, expectedVersions) {
t.Errorf("Expected versions to be: %v, got: %v", expectedVersions, versions)
}
err = d.Migrate(files[2])
if err != nil {
t.Fatal(err)
}
err = d.Migrate(files[3])
if err == nil {
t.Error("Expected test case to fail")
}
if err := d.Close(); err != nil {
t.Fatal(err)
}
}
func TestSplitStatements(t *testing.T) {
testCases := []struct {
name string
q string
want []string
}{
{"empty noop", "", []string{}},
{"single query", "CREATE TABLE a id INT;", []string{"CREATE TABLE a id INT;"}},
{"multiple queries", "CREATE TABLE a id INT; CREATE TABLE b id INT; ",
[]string{"CREATE TABLE a id INT;", "CREATE TABLE b id INT;"},
},
{"with line breaks", "CREATE TABLE a id INT;\n\n\t CREATE TABLE b id INT; ",
[]string{"CREATE TABLE a id INT;", "CREATE TABLE b id INT;"},
},
}
for _, tc := range testCases {
got := splitStatements(tc.q)
if !reflect.DeepEqual(got, tc.want) {
t.Errorf("(%s) splitStatements(%q) = %q, want: %q", tc.name, tc.q, got, tc.want)
}
}
}