cloudflare/cloudflared

Public

mirrored fromhttps://github.com/cloudflare/cloudflaredAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
2020.6.1

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

dbconnect_tests/sql_test.go

265lines · modecode

1package dbconnect_tests
2
3import (
4 "context"
5 "log"
6 "net/url"
7 "os"
8 "testing"
9
10 "github.com/stretchr/testify/assert"
11
12 "github.com/cloudflare/cloudflared/dbconnect"
13)
14
15func TestIntegrationPostgreSQL(t *testing.T) {
16 ctx, pq := helperNewSQLClient(t, "POSTGRESQL_URL")
17
18 err := pq.Ping(ctx)
19 assert.NoError(t, err)
20
21 _, err = pq.Submit(ctx, &dbconnect.Command{
22 Statement: "CREATE TABLE t (a TEXT, b UUID, c JSON, d INET[], e SERIAL);",
23 Mode: "exec",
24 })
25 assert.NoError(t, err)
26
27 _, err = pq.Submit(ctx, &dbconnect.Command{
28 Statement: "INSERT INTO t VALUES ($1, $2, $3, $4);",
29 Mode: "exec",
30 Arguments: dbconnect.Arguments{
31 Positional: []interface{}{
32 "text",
33 "6b8d686d-bd8e-43bc-b09a-cfcbbe702c10",
34 "{\"bool\":true,\"array\":[\"a\", 1, 3.14],\"embed\":{\"num\":21}}",
35 []string{"1.1.1.1", "1.0.0.1"},
36 },
37 },
38 })
39 assert.NoError(t, err)
40
41 _, err = pq.Submit(ctx, &dbconnect.Command{
42 Statement: "UPDATE t SET b = NULL;",
43 Mode: "exec",
44 })
45 assert.NoError(t, err)
46
47 res, err := pq.Submit(ctx, &dbconnect.Command{
48 Statement: "SELECT * FROM t;",
49 Mode: "query",
50 })
51 assert.NoError(t, err)
52 assert.IsType(t, make([]map[string]interface{}, 0), res)
53
54 actual := res.([]map[string]interface{})[0]
55 expected := map[string]interface{}{
56 "a": "text",
57 "b": nil,
58 "c": map[string]interface{}{
59 "bool": true,
60 "array": []interface{}{"a", float64(1), 3.14},
61 "embed": map[string]interface{}{"num": float64(21)},
62 },
63 "d": "{1.1.1.1,1.0.0.1}",
64 "e": int64(1),
65 }
66 assert.EqualValues(t, expected, actual)
67
68 _, err = pq.Submit(ctx, &dbconnect.Command{
69 Statement: "DROP TABLE t;",
70 Mode: "exec",
71 })
72 assert.NoError(t, err)
73}
74
75func TestIntegrationMySQL(t *testing.T) {
76 ctx, my := helperNewSQLClient(t, "MYSQL_URL")
77
78 err := my.Ping(ctx)
79 assert.NoError(t, err)
80
81 _, err = my.Submit(ctx, &dbconnect.Command{
82 Statement: "CREATE TABLE t (a CHAR, b TINYINT, c FLOAT, d JSON, e YEAR);",
83 Mode: "exec",
84 })
85 assert.NoError(t, err)
86
87 _, err = my.Submit(ctx, &dbconnect.Command{
88 Statement: "INSERT INTO t VALUES (?, ?, ?, ?, ?);",
89 Mode: "exec",
90 Arguments: dbconnect.Arguments{
91 Positional: []interface{}{
92 "a",
93 10,
94 3.14,
95 "{\"bool\":true}",
96 2000,
97 },
98 },
99 })
100 assert.NoError(t, err)
101
102 _, err = my.Submit(ctx, &dbconnect.Command{
103 Statement: "ALTER TABLE t ADD COLUMN f GEOMETRY;",
104 Mode: "exec",
105 })
106 assert.NoError(t, err)
107
108 res, err := my.Submit(ctx, &dbconnect.Command{
109 Statement: "SELECT * FROM t;",
110 Mode: "query",
111 })
112 assert.NoError(t, err)
113 assert.IsType(t, make([]map[string]interface{}, 0), res)
114
115 actual := res.([]map[string]interface{})[0]
116 expected := map[string]interface{}{
117 "a": "a",
118 "b": float64(10),
119 "c": 3.14,
120 "d": map[string]interface{}{"bool": true},
121 "e": float64(2000),
122 "f": nil,
123 }
124 assert.EqualValues(t, expected, actual)
125
126 _, err = my.Submit(ctx, &dbconnect.Command{
127 Statement: "DROP TABLE t;",
128 Mode: "exec",
129 })
130 assert.NoError(t, err)
131}
132
133func TestIntegrationMSSQL(t *testing.T) {
134 ctx, ms := helperNewSQLClient(t, "MSSQL_URL")
135
136 err := ms.Ping(ctx)
137 assert.NoError(t, err)
138
139 _, err = ms.Submit(ctx, &dbconnect.Command{
140 Statement: "CREATE TABLE t (a BIT, b DECIMAL, c MONEY, d TEXT);",
141 Mode: "exec"})
142 assert.NoError(t, err)
143
144 _, err = ms.Submit(ctx, &dbconnect.Command{
145 Statement: "INSERT INTO t VALUES (?, ?, ?, ?);",
146 Mode: "exec",
147 Arguments: dbconnect.Arguments{
148 Positional: []interface{}{
149 0,
150 3,
151 "$0.99",
152 "text",
153 },
154 },
155 })
156 assert.NoError(t, err)
157
158 _, err = ms.Submit(ctx, &dbconnect.Command{
159 Statement: "UPDATE t SET d = NULL;",
160 Mode: "exec",
161 })
162 assert.NoError(t, err)
163
164 res, err := ms.Submit(ctx, &dbconnect.Command{
165 Statement: "SELECT * FROM t;",
166 Mode: "query",
167 })
168 assert.NoError(t, err)
169 assert.IsType(t, make([]map[string]interface{}, 0), res)
170
171 actual := res.([]map[string]interface{})[0]
172 expected := map[string]interface{}{
173 "a": false,
174 "b": float64(3),
175 "c": float64(0.99),
176 "d": nil,
177 }
178 assert.EqualValues(t, expected, actual)
179
180 _, err = ms.Submit(ctx, &dbconnect.Command{
181 Statement: "DROP TABLE t;",
182 Mode: "exec",
183 })
184 assert.NoError(t, err)
185}
186
187func TestIntegrationClickhouse(t *testing.T) {
188 ctx, ch := helperNewSQLClient(t, "CLICKHOUSE_URL")
189
190 err := ch.Ping(ctx)
191 assert.NoError(t, err)
192
193 _, err = ch.Submit(ctx, &dbconnect.Command{
194 Statement: "CREATE TABLE t (a UUID, b String, c Float64, d UInt32, e Int16, f Array(Enum8('a'=1, 'b'=2, 'c'=3))) engine=Memory;",
195 Mode: "exec",
196 })
197 assert.NoError(t, err)
198
199 _, err = ch.Submit(ctx, &dbconnect.Command{
200 Statement: "INSERT INTO t VALUES (?, ?, ?, ?, ?, ?);",
201 Mode: "exec",
202 Arguments: dbconnect.Arguments{
203 Positional: []interface{}{
204 "ec65f626-6f50-4c86-9628-6314ef1edacd",
205 "",
206 3.14,
207 314,
208 -144,
209 []string{"a", "b", "c"},
210 },
211 },
212 })
213 assert.NoError(t, err)
214
215 res, err := ch.Submit(ctx, &dbconnect.Command{
216 Statement: "SELECT * FROM t;",
217 Mode: "query",
218 })
219 assert.NoError(t, err)
220 assert.IsType(t, make([]map[string]interface{}, 0), res)
221
222 actual := res.([]map[string]interface{})[0]
223 expected := map[string]interface{}{
224 "a": "ec65f626-6f50-4c86-9628-6314ef1edacd",
225 "b": "",
226 "c": float64(3.14),
227 "d": uint32(314),
228 "e": int16(-144),
229 "f": []string{"a", "b", "c"},
230 }
231 assert.EqualValues(t, expected, actual)
232
233 _, err = ch.Submit(ctx, &dbconnect.Command{
234 Statement: "DROP TABLE t;",
235 Mode: "exec",
236 })
237 assert.NoError(t, err)
238}
239
240func helperNewSQLClient(t *testing.T, env string) (context.Context, dbconnect.Client) {
241 _, ok := os.LookupEnv("DBCONNECT_INTEGRATION_TEST")
242 if ok {
243 t.Helper()
244 } else {
245 t.SkipNow()
246 }
247
248 val, ok := os.LookupEnv(env)
249 if !ok {
250 log.Fatalf("must provide database url as environment variable: %s", env)
251 }
252
253 parsed, err := url.Parse(val)
254 if err != nil {
255 log.Fatalf("cannot provide invalid database url: %s=%s", env, val)
256 }
257
258 ctx := context.Background()
259 client, err := dbconnect.NewSQLClient(ctx, parsed)
260 if err != nil {
261 log.Fatalf("could not start test client: %s", err)
262 }
263
264 return ctx, client
265}
266