-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathquery_test.go
115 lines (106 loc) · 2.64 KB
/
query_test.go
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
package query
import (
"net/url"
"reflect"
"testing"
)
func ptr(i uint64) *uint64 {
return &i
}
func TestParseQuery(t *testing.T) {
type args struct {
query string
}
tests := []struct {
name string
args args
want *Query
wantErr bool
}{
{
name: "test 1",
args: args{
query: "name=foo,a%2Fb&age=1&sort=-age&limit=10&offset=5&fields=id,name",
},
want: &Query{
Select: []string{"id", "name"},
Where: []Expression{
newExpressionCmp(OperatorIn, "name", []string{"foo", "a/b"}),
newExpressionCmp(OperatorEq, "age", "1"),
},
Sort: []ExpressionSort{
{
Field: "age",
Desc: true,
},
},
Offset: ptr(5),
Limit: ptr(10),
},
wantErr: false,
},
{
name: "test 2",
args: args{
query: "name=foo|nick=bar&age=1&sort=age&limit=10",
},
want: &Query{
Where: []Expression{
ExpressionLogic{
Operator: OperatorOr,
List: []Expression{
newExpressionCmp(OperatorEq, "name", "foo"),
newExpressionCmp(OperatorEq, "nick", "bar"),
},
},
newExpressionCmp(OperatorEq, "age", "1"),
},
Sort: []ExpressionSort{
{
Field: "age",
Desc: false,
},
},
Limit: ptr(10),
},
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := Parse(tt.args.query)
if (err != nil) != tt.wantErr {
t.Fatalf("ParseQuery() error = %s, wantErr %#v", err, tt.wantErr)
}
if got.Limit != nil && tt.want.Limit != nil {
if *got.Limit != *tt.want.Limit {
t.Fatalf("ParseQuery() Limit = %d, want %d", *got.Limit, *tt.want.Limit)
}
}
if got.Offset != nil && tt.want.Offset != nil {
if *got.Offset != *tt.want.Offset {
t.Fatalf("ParseQuery() Offset = %d, want %d", *got.Offset, *tt.want.Offset)
}
}
if !reflect.DeepEqual(got.Where, tt.want.Where) {
t.Fatalf("ParseQuery() = \n%#v\n, want \n%#v\n", got.Where, tt.want.Where)
}
if !reflect.DeepEqual(got.Sort, tt.want.Sort) {
t.Fatalf("ParseQuery() = \n%#v\n, want \n%#v\n", got.Sort, tt.want.Sort)
}
if !reflect.DeepEqual(got.Select, tt.want.Select) {
t.Fatalf("ParseQuery() = \n%#v\n, want \n%#v\n", got.Select, tt.want.Select)
}
})
}
}
func Test_URLQuery(t *testing.T) {
testURL := "http://example.com?name=foo|nick=foo&age=1&sort=age&limit=10&offset=5&fields=id,name#test"
parsedURL, err := url.Parse(testURL)
if err != nil {
t.Fatalf("failed to parse URL: %v", err)
}
if parsedURL.RawQuery != "name=foo|nick=foo&age=1&sort=age&limit=10&offset=5&fields=id,name" {
t.Fatalf("parsed URL query does not match expected value: %s", parsedURL.RawQuery)
}
}