cloudflare/cloudflared

Public

mirrored from https://github.com/cloudflare/cloudflaredAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
2020.8.0

Branches

Tags

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

Clone

HTTPS

Download ZIP

dbconnect_tests/sql_test.go

265lines · modeblame

759cd019Ashcon Partovi6 years ago1package 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) {
16ctx, pq := helperNewSQLClient(t, "POSTGRESQL_URL")
17
18err := pq.Ping(ctx)
19assert.NoError(t, err)
20
21_, err = pq.Submit(ctx, &dbconnect.Command{
22Statement: "CREATE TABLE t (a TEXT, b UUID, c JSON, d INET[], e SERIAL);",
23Mode: "exec",
24})
25assert.NoError(t, err)
26
27_, err = pq.Submit(ctx, &dbconnect.Command{
28Statement: "INSERT INTO t VALUES ($1, $2, $3, $4);",
29Mode: "exec",
30Arguments: dbconnect.Arguments{
31Positional: []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})
39assert.NoError(t, err)
40
41_, err = pq.Submit(ctx, &dbconnect.Command{
42Statement: "UPDATE t SET b = NULL;",
43Mode: "exec",
44})
45assert.NoError(t, err)
46
47res, err := pq.Submit(ctx, &dbconnect.Command{
48Statement: "SELECT * FROM t;",
49Mode: "query",
50})
51assert.NoError(t, err)
52assert.IsType(t, make([]map[string]interface{}, 0), res)
53
54actual := res.([]map[string]interface{})[0]
55expected := 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}
66assert.EqualValues(t, expected, actual)
67
68_, err = pq.Submit(ctx, &dbconnect.Command{
69Statement: "DROP TABLE t;",
70Mode: "exec",
71})
72assert.NoError(t, err)
73}
74
75func TestIntegrationMySQL(t *testing.T) {
76ctx, my := helperNewSQLClient(t, "MYSQL_URL")
77
78err := my.Ping(ctx)
79assert.NoError(t, err)
80
81_, err = my.Submit(ctx, &dbconnect.Command{
82Statement: "CREATE TABLE t (a CHAR, b TINYINT, c FLOAT, d JSON, e YEAR);",
83Mode: "exec",
84})
85assert.NoError(t, err)
86
87_, err = my.Submit(ctx, &dbconnect.Command{
88Statement: "INSERT INTO t VALUES (?, ?, ?, ?, ?);",
89Mode: "exec",
90Arguments: dbconnect.Arguments{
91Positional: []interface{}{
92"a",
9310,
943.14,
95"{\"bool\":true}",
962000,
97},
98},
99})
100assert.NoError(t, err)
101
102_, err = my.Submit(ctx, &dbconnect.Command{
103Statement: "ALTER TABLE t ADD COLUMN f GEOMETRY;",
104Mode: "exec",
105})
106assert.NoError(t, err)
107
108res, err := my.Submit(ctx, &dbconnect.Command{
109Statement: "SELECT * FROM t;",
110Mode: "query",
111})
112assert.NoError(t, err)
113assert.IsType(t, make([]map[string]interface{}, 0), res)
114
115actual := res.([]map[string]interface{})[0]
116expected := 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}
124assert.EqualValues(t, expected, actual)
125
126_, err = my.Submit(ctx, &dbconnect.Command{
127Statement: "DROP TABLE t;",
128Mode: "exec",
129})
130assert.NoError(t, err)
131}
132
133func TestIntegrationMSSQL(t *testing.T) {
134ctx, ms := helperNewSQLClient(t, "MSSQL_URL")
135
136err := ms.Ping(ctx)
137assert.NoError(t, err)
138
139_, err = ms.Submit(ctx, &dbconnect.Command{
140Statement: "CREATE TABLE t (a BIT, b DECIMAL, c MONEY, d TEXT);",
141Mode: "exec"})
142assert.NoError(t, err)
143
144_, err = ms.Submit(ctx, &dbconnect.Command{
145Statement: "INSERT INTO t VALUES (?, ?, ?, ?);",
146Mode: "exec",
147Arguments: dbconnect.Arguments{
148Positional: []interface{}{
1490,
1503,
151"$0.99",
152"text",
153},
154},
155})
156assert.NoError(t, err)
157
158_, err = ms.Submit(ctx, &dbconnect.Command{
159Statement: "UPDATE t SET d = NULL;",
160Mode: "exec",
161})
162assert.NoError(t, err)
163
164res, err := ms.Submit(ctx, &dbconnect.Command{
165Statement: "SELECT * FROM t;",
166Mode: "query",
167})
168assert.NoError(t, err)
169assert.IsType(t, make([]map[string]interface{}, 0), res)
170
171actual := res.([]map[string]interface{})[0]
172expected := map[string]interface{}{
173"a": false,
174"b": float64(3),
175"c": float64(0.99),
176"d": nil,
177}
178assert.EqualValues(t, expected, actual)
179
180_, err = ms.Submit(ctx, &dbconnect.Command{
181Statement: "DROP TABLE t;",
182Mode: "exec",
183})
184assert.NoError(t, err)
185}
186
187func TestIntegrationClickhouse(t *testing.T) {
188ctx, ch := helperNewSQLClient(t, "CLICKHOUSE_URL")
189
190err := ch.Ping(ctx)
191assert.NoError(t, err)
192
193_, err = ch.Submit(ctx, &dbconnect.Command{
194Statement: "CREATE TABLE t (a UUID, b String, c Float64, d UInt32, e Int16, f Array(Enum8('a'=1, 'b'=2, 'c'=3))) engine=Memory;",
195Mode: "exec",
196})
197assert.NoError(t, err)
198
199_, err = ch.Submit(ctx, &dbconnect.Command{
200Statement: "INSERT INTO t VALUES (?, ?, ?, ?, ?, ?);",
201Mode: "exec",
202Arguments: dbconnect.Arguments{
203Positional: []interface{}{
204"ec65f626-6f50-4c86-9628-6314ef1edacd",
205"",
2063.14,
207314,
208-144,
209[]string{"a", "b", "c"},
210},
211},
212})
213assert.NoError(t, err)
214
215res, err := ch.Submit(ctx, &dbconnect.Command{
216Statement: "SELECT * FROM t;",
217Mode: "query",
218})
219assert.NoError(t, err)
220assert.IsType(t, make([]map[string]interface{}, 0), res)
221
222actual := res.([]map[string]interface{})[0]
223expected := 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}
231assert.EqualValues(t, expected, actual)
232
233_, err = ch.Submit(ctx, &dbconnect.Command{
234Statement: "DROP TABLE t;",
235Mode: "exec",
236})
237assert.NoError(t, err)
238}
239
240func helperNewSQLClient(t *testing.T, env string) (context.Context, dbconnect.Client) {
241_, ok := os.LookupEnv("DBCONNECT_INTEGRATION_TEST")
242if ok {
243t.Helper()
244} else {
245t.SkipNow()
246}
247
248val, ok := os.LookupEnv(env)
249if !ok {
250log.Fatalf("must provide database url as environment variable: %s", env)
251}
252
253parsed, err := url.Parse(val)
254if err != nil {
255log.Fatalf("cannot provide invalid database url: %s=%s", env, val)
256}
257
258ctx := context.Background()
259client, err := dbconnect.NewSQLClient(ctx, parsed)
260if err != nil {
261log.Fatalf("could not start test client: %s", err)
262}
263
264return ctx, client
265}