1 package sqlite3
2
3 import (
4 "database/sql"
5 "fmt"
6 "io/ioutil"
7 "os"
8 "path/filepath"
9 "testing"
10
11 "github.com/stretchr/testify/assert"
12
13 "github.com/golang-migrate/migrate/v4"
14 dt "github.com/golang-migrate/migrate/v4/database/testing"
15 _ "github.com/golang-migrate/migrate/v4/source/file"
16 _ "github.com/mattn/go-sqlite3"
17 )
18
19 func Test(t *testing.T) {
20 dir, err := ioutil.TempDir("", "sqlite3-driver-test")
21 if err != nil {
22 return
23 }
24 defer func() {
25 if err := os.RemoveAll(dir); err != nil {
26 t.Error(err)
27 }
28 }()
29 t.Logf("DB path : %s\n", filepath.Join(dir, "sqlite3.db"))
30 p := &Sqlite{}
31 addr := fmt.Sprintf("sqlite3://%s", filepath.Join(dir, "sqlite3.db"))
32 d, err := p.Open(addr)
33 if err != nil {
34 t.Fatal(err)
35 }
36 dt.Test(t, d, []byte("CREATE TABLE t (Qty int, Name string);"))
37 }
38
39 func TestMigrate(t *testing.T) {
40 dir, err := ioutil.TempDir("", "sqlite3-driver-test")
41 if err != nil {
42 return
43 }
44 defer func() {
45 if err := os.RemoveAll(dir); err != nil {
46 t.Error(err)
47 }
48 }()
49 t.Logf("DB path : %s\n", filepath.Join(dir, "sqlite3.db"))
50
51 db, err := sql.Open("sqlite3", filepath.Join(dir, "sqlite3.db"))
52 if err != nil {
53 return
54 }
55 defer func() {
56 if err := db.Close(); err != nil {
57 return
58 }
59 }()
60 driver, err := WithInstance(db, &Config{})
61 if err != nil {
62 t.Fatal(err)
63 }
64
65 m, err := migrate.NewWithDatabaseInstance(
66 "file://./examples/migrations",
67 "ql", driver)
68 if err != nil {
69 t.Fatal(err)
70 }
71 dt.TestMigrate(t, m)
72 }
73
74 func TestMigrationTable(t *testing.T) {
75 dir, err := ioutil.TempDir("", "sqlite3-driver-test-migration-table")
76 if err != nil {
77 return
78 }
79 defer func() {
80 if err := os.RemoveAll(dir); err != nil {
81 t.Error(err)
82 }
83 }()
84
85 t.Logf("DB path : %s\n", filepath.Join(dir, "sqlite3.db"))
86
87 db, err := sql.Open("sqlite3", filepath.Join(dir, "sqlite3.db"))
88 if err != nil {
89 return
90 }
91 defer func() {
92 if err := db.Close(); err != nil {
93 return
94 }
95 }()
96
97 config := &Config{
98 MigrationsTable: "my_migration_table",
99 }
100 driver, err := WithInstance(db, config)
101 if err != nil {
102 t.Fatal(err)
103 }
104 m, err := migrate.NewWithDatabaseInstance(
105 "file://./examples/migrations",
106 "ql", driver)
107 if err != nil {
108 t.Fatal(err)
109 }
110 t.Log("UP")
111 err = m.Up()
112 if err != nil {
113 t.Fatal(err)
114 }
115
116 _, err = db.Query(fmt.Sprintf("SELECT * FROM %s", config.MigrationsTable))
117 if err != nil {
118 t.Fatal(err)
119 }
120 }
121
122 func TestNoTxWrap(t *testing.T) {
123 dir, err := ioutil.TempDir("", "sqlite3-driver-test")
124 if err != nil {
125 return
126 }
127 defer func() {
128 if err := os.RemoveAll(dir); err != nil {
129 t.Error(err)
130 }
131 }()
132 t.Logf("DB path : %s\n", filepath.Join(dir, "sqlite3.db"))
133 p := &Sqlite{}
134 addr := fmt.Sprintf("sqlite3://%s?x-no-tx-wrap=true", filepath.Join(dir, "sqlite3.db"))
135 d, err := p.Open(addr)
136 if err != nil {
137 t.Fatal(err)
138 }
139
140
141 dt.Test(t, d, []byte("BEGIN; CREATE TABLE t (Qty int, Name string); COMMIT;"))
142 }
143
144 func TestNoTxWrapInvalidValue(t *testing.T) {
145 dir, err := ioutil.TempDir("", "sqlite3-driver-test")
146 if err != nil {
147 return
148 }
149 defer func() {
150 if err := os.RemoveAll(dir); err != nil {
151 t.Error(err)
152 }
153 }()
154 t.Logf("DB path : %s\n", filepath.Join(dir, "sqlite3.db"))
155 p := &Sqlite{}
156 addr := fmt.Sprintf("sqlite3://%s?x-no-tx-wrap=yeppers", filepath.Join(dir, "sqlite3.db"))
157 _, err = p.Open(addr)
158 if assert.Error(t, err) {
159 assert.Contains(t, err.Error(), "x-no-tx-wrap")
160 assert.Contains(t, err.Error(), "invalid syntax")
161 }
162 }
163
164 func TestMigrateWithDirectoryNameContainsWhitespaces(t *testing.T) {
165 dir, err := ioutil.TempDir("", "directory name contains whitespaces")
166 if err != nil {
167 return
168 }
169 defer func() {
170 if err := os.RemoveAll(dir); err != nil {
171 t.Error(err)
172 }
173 }()
174 dbPath := filepath.Join(dir, "sqlite3.db")
175 t.Logf("DB path : %s\n", dbPath)
176 p := &Sqlite{}
177 addr := fmt.Sprintf("sqlite3://file:%s", dbPath)
178 d, err := p.Open(addr)
179 if err != nil {
180 t.Fatal(err)
181 }
182 dt.Test(t, d, []byte("CREATE TABLE t (Qty int, Name string);"))
183 }
184
View as plain text