1 package cockroachdb
2
3
4
5 import (
6 "context"
7 "database/sql"
8 "fmt"
9 "github.com/golang-migrate/migrate/v4"
10 "log"
11 "strings"
12 "testing"
13 )
14
15 import (
16 "github.com/dhui/dktest"
17 _ "github.com/lib/pq"
18 )
19
20 import (
21 dt "github.com/golang-migrate/migrate/v4/database/testing"
22 "github.com/golang-migrate/migrate/v4/dktesting"
23 _ "github.com/golang-migrate/migrate/v4/source/file"
24 )
25
26 const defaultPort = 26257
27
28 var (
29 opts = dktest.Options{Cmd: []string{"start", "--insecure"}, PortRequired: true, ReadyFunc: isReady}
30
31 specs = []dktesting.ContainerSpec{
32 {ImageName: "cockroachdb/cockroach:v1.0.7", Options: opts},
33 {ImageName: "cockroachdb/cockroach:v1.1.9", Options: opts},
34 {ImageName: "cockroachdb/cockroach:v2.0.7", Options: opts},
35 {ImageName: "cockroachdb/cockroach:v2.1.3", Options: opts},
36 }
37 )
38
39 func isReady(ctx context.Context, c dktest.ContainerInfo) bool {
40 ip, port, err := c.Port(defaultPort)
41 if err != nil {
42 log.Println("port error:", err)
43 return false
44 }
45
46 db, err := sql.Open("postgres", fmt.Sprintf("postgres://root@%v:%v?sslmode=disable", ip, port))
47 if err != nil {
48 log.Println("open error:", err)
49 return false
50 }
51 if err := db.PingContext(ctx); err != nil {
52 log.Println("ping error:", err)
53 return false
54 }
55 if err := db.Close(); err != nil {
56 log.Println("close error:", err)
57 }
58 return true
59 }
60
61 func createDB(t *testing.T, c dktest.ContainerInfo) {
62 ip, port, err := c.Port(defaultPort)
63 if err != nil {
64 t.Fatal(err)
65 }
66
67 db, err := sql.Open("postgres", fmt.Sprintf("postgres://root@%v:%v?sslmode=disable", ip, port))
68 if err != nil {
69 t.Fatal(err)
70 }
71 if err = db.Ping(); err != nil {
72 t.Fatal(err)
73 }
74 defer func() {
75 if err := db.Close(); err != nil {
76 t.Error(err)
77 }
78 }()
79
80 if _, err = db.Exec("CREATE DATABASE migrate"); err != nil {
81 t.Fatal(err)
82 }
83 }
84
85 func Test(t *testing.T) {
86 dktesting.ParallelTest(t, specs, func(t *testing.T, ci dktest.ContainerInfo) {
87 createDB(t, ci)
88
89 ip, port, err := ci.Port(26257)
90 if err != nil {
91 t.Fatal(err)
92 }
93
94 addr := fmt.Sprintf("cockroach://root@%v:%v/migrate?sslmode=disable", ip, port)
95 c := &CockroachDb{}
96 d, err := c.Open(addr)
97 if err != nil {
98 t.Fatal(err)
99 }
100 dt.Test(t, d, []byte("SELECT 1"))
101 })
102 }
103
104 func TestMigrate(t *testing.T) {
105 dktesting.ParallelTest(t, specs, func(t *testing.T, ci dktest.ContainerInfo) {
106 createDB(t, ci)
107
108 ip, port, err := ci.Port(26257)
109 if err != nil {
110 t.Fatal(err)
111 }
112
113 addr := fmt.Sprintf("cockroach://root@%v:%v/migrate?sslmode=disable", ip, port)
114 c := &CockroachDb{}
115 d, err := c.Open(addr)
116 if err != nil {
117 t.Fatal(err)
118 }
119
120 m, err := migrate.NewWithDatabaseInstance("file://./examples/migrations", "migrate", d)
121 if err != nil {
122 t.Fatal(err)
123 }
124 dt.TestMigrate(t, m)
125 })
126 }
127
128 func TestMultiStatement(t *testing.T) {
129 dktesting.ParallelTest(t, specs, func(t *testing.T, ci dktest.ContainerInfo) {
130 createDB(t, ci)
131
132 ip, port, err := ci.Port(26257)
133 if err != nil {
134 t.Fatal(err)
135 }
136
137 addr := fmt.Sprintf("cockroach://root@%v:%v/migrate?sslmode=disable", ip, port)
138 c := &CockroachDb{}
139 d, err := c.Open(addr)
140 if err != nil {
141 t.Fatal(err)
142 }
143 if err := d.Run(strings.NewReader("CREATE TABLE foo (foo text); CREATE TABLE bar (bar text);")); err != nil {
144 t.Fatalf("expected err to be nil, got %v", err)
145 }
146
147
148 var exists bool
149 if err := d.(*CockroachDb).db.QueryRow("SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'bar' AND table_schema = (SELECT current_schema()))").Scan(&exists); err != nil {
150 t.Fatal(err)
151 }
152 if !exists {
153 t.Fatalf("expected table bar to exist")
154 }
155 })
156 }
157
158 func TestFilterCustomQuery(t *testing.T) {
159 dktesting.ParallelTest(t, specs, func(t *testing.T, ci dktest.ContainerInfo) {
160 createDB(t, ci)
161
162 ip, port, err := ci.Port(26257)
163 if err != nil {
164 t.Fatal(err)
165 }
166
167 addr := fmt.Sprintf("cockroach://root@%v:%v/migrate?sslmode=disable&x-custom=foobar", ip, port)
168 c := &CockroachDb{}
169 _, err = c.Open(addr)
170 if err != nil {
171 t.Fatal(err)
172 }
173 })
174 }
175
View as plain text