-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathparse_test.go
More file actions
133 lines (122 loc) · 2.89 KB
/
parse_test.go
File metadata and controls
133 lines (122 loc) · 2.89 KB
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
package dotpgx
import (
"strings"
"testing"
)
const parseFile = "tests/parse.sql"
func compareQm(exp queryMap, got queryMap) []interface{} {
msg := []interface{}{
"Maps not same;\nExpected:\n",
exp,
"\nGot:\n",
got,
}
if len(exp) == len(got) {
for k, v := range exp {
if got[k].sql != v.sql {
return msg
}
}
} else {
return msg
}
return nil
}
var mergeExpect = queryMap{
"one": &query{sql: "select 1;"},
"two": &query{sql: "select 2"},
"three": &query{sql: "select 3"},
}
func TestMerge(t *testing.T) {
qm := queryMap{
"one": &query{sql: "select 1;"},
"two": &query{sql: "select old;"},
}
qm2 := queryMap{
"two": &query{sql: "select 2"},
"three": &query{sql: "select 3"},
}
qm = merge(qm, qm2)
if msg := compareQm(mergeExpect, qm); msg != nil {
t.Fatal(msg...)
}
}
func TestGetQuery(t *testing.T) {
db := new(DB)
db.qm = make(queryMap)
err := db.ParseFiles(parseFile)
if err != nil {
t.Fatal("ParseFile err;", err)
}
q, err := db.qm.getQuery("two")
if err != nil {
t.Fatal("qm.getQuery error;", err)
}
exp := "select 2;"
if q.sql != exp {
t.Fatal("\nExpected:\n", exp, "\nGot:\n", q.sql)
}
q, err = db.qm.getQuery("none")
if err == nil || q != nil {
t.Fatal("Expected an error and empty sql;\n", "Got:", q.sql)
}
}
func TestParseSqlErr(t *testing.T) {
db := new(DB)
db.qm = make(queryMap)
err := db.ParseSQL(strings.NewReader(""))
if err == nil {
t.Fatal("Expected a parse error")
}
err = db.ParseSQL(
strings.NewReader(`
-- Nothing to parse here
`),
)
if err == nil {
t.Fatal("Expected a parse error")
}
}
var parseExpect = queryMap{
"one": &query{sql: "select 1 from users where $1 = me;"},
"two": &query{sql: "select 2;"},
"000000": &query{sql: "select 3;"},
"000001": &query{sql: "select 4"},
"five": &query{sql: "select 5"},
"func": &query{sql: "create or replace function tester() returns integer language 'sql' as $$ select 1; $$;"},
"000002": &query{sql: "create or replace function another() returns integer language 'sql' as $$ select 2; $$;"},
}
// Tests ParseSql and ParseFile at once
func TestParseFiles(t *testing.T) {
db := new(DB)
db.qm = make(queryMap)
err := db.ParseFiles(parseFile)
if err != nil {
t.Fatal("ParseFile err;", err)
}
if msg := compareQm(parseExpect, db.qm); msg != nil {
t.Fatal(msg...)
}
err = db.ParseFiles()
if err == nil {
t.Fatal("Expected error for empty file list")
}
err = db.ParseFiles("nope")
if err == nil {
t.Fatal("Expected error for non-existing file")
}
}
// This tests ParsePath and ParseFileBlob at once
// Parsing and merging is already tested, here we'll settle for the map size only
func TestParsePath(t *testing.T) {
db := new(DB)
db.qm = make(queryMap)
err := db.ParsePath(queriesDir)
if err != nil {
t.Fatal("ParseFileGlob err;", err)
}
exp, got := 5, len(db.qm)
if exp != got {
t.Fatal("Expected", exp, "queries in the map; Got", got)
}
}