@@ -11,16 +11,21 @@ import (
11
11
12
12
func TestFields (t * testing.T ) {
13
13
14
+ // mockValidation := func(value interface{}) error { return nil }
15
+ validate := In ("id" , "name" )
16
+
14
17
// Fields:
15
18
cases := []struct {
16
19
url string
17
20
expected string
21
+ v ValidationFunc
18
22
err error
19
23
}{
20
- {url : "?" , expected : "*" , err : nil },
21
- {url : "?fields=" , expected : "*" , err : nil },
22
- {url : "?fields=id" , expected : "id" , err : nil },
23
- {url : "?fields=id,name" , expected : "id, name" , err : nil },
24
+ {url : "?" , expected : "*" , v : validate , err : nil },
25
+ {url : "?fields=" , expected : "*" , v : validate , err : nil },
26
+ {url : "?fields=id" , expected : "id" , v : validate , err : nil },
27
+ {url : "?fields=id,name" , expected : "id, name" , v : validate , err : nil },
28
+ {"?fields=" , "*" , nil , ErrValidationNotFound },
24
29
}
25
30
26
31
for _ , c := range cases {
@@ -29,10 +34,14 @@ func TestFields(t *testing.T) {
29
34
assert .NoError (t , err )
30
35
q := NewQV (URL .Query (), nil )
31
36
assert .NoError (t , err )
32
- q .AddValidation ("fields" , In ( "id" , "name" ) )
37
+ q .AddValidation ("fields" , c . v )
33
38
err = q .Parse ()
34
- assert .Equal (t , c .err , err )
35
- assert .Equal (t , c .expected , q .FieldsString ())
39
+ if c .err != nil {
40
+ assert .Equal (t , c .expected , q .FieldsString ())
41
+ } else {
42
+ assert .NoError (t , err )
43
+ assert .Equal (t , c .err , errors .Cause (err ))
44
+ }
36
45
})
37
46
}
38
47
}
@@ -74,17 +83,24 @@ func TestLimit(t *testing.T) {
74
83
}{
75
84
{url : "?" , expected : "" },
76
85
{url : "?limit=" , expected : "" , err : ErrBadFormat },
86
+ {url : "?limit=1,2" , expected : "" , err : ErrBadFormat },
87
+ {url : "?limit=11" , expected : "" , err : ErrNotInScope },
88
+ {url : "?limit=-1" , expected : "" , err : ErrNotInScope },
89
+ {url : "?limit=1" , expected : "" , err : ErrNotInScope },
90
+ {url : "?limit=q" , expected : "" , err : ErrBadFormat },
77
91
{url : "?limit=10" , expected : " LIMIT 10" },
78
92
}
79
93
for _ , c := range cases {
80
- URL , err := url .Parse (c .url )
81
- assert .NoError (t , err )
82
- q := New ().
83
- SetUrlQuery (URL .Query ()).
84
- AddValidation ("limit" , Max (10 ))
85
- err = q .Parse ()
86
- assert .Equal (t , c .err , errors .Cause (err ))
87
- assert .Equal (t , c .expected , q .LIMIT ())
94
+ t .Run (c .url , func (t * testing.T ) {
95
+ URL , err := url .Parse (c .url )
96
+ assert .NoError (t , err )
97
+ q := New ().
98
+ SetUrlQuery (URL .Query ()).
99
+ AddValidation ("limit" , Multi (Min (2 ), Max (10 )))
100
+ err = q .Parse ()
101
+ assert .Equal (t , c .err , errors .Cause (err ))
102
+ assert .Equal (t , c .expected , q .LIMIT ())
103
+ })
88
104
}
89
105
}
90
106
@@ -103,21 +119,29 @@ func TestSort(t *testing.T) {
103
119
{url : "?sort=id,-name" , expected : " ORDER BY id, name DESC" },
104
120
}
105
121
for _ , c := range cases {
106
- URL , err := url .Parse (c .url )
107
- assert .NoError (t , err )
108
- q , err := NewParse (URL .Query (), Validations {"sort" : In ("id" , "name" )})
109
- assert .Equal (t , c .err , err )
110
- assert .Equal (t , c .expected , q .ORDER ())
122
+ t .Run (c .url , func (t * testing.T ) {
123
+ URL , err := url .Parse (c .url )
124
+ assert .NoError (t , err )
125
+ q , err := NewParse (URL .Query (), Validations {"sort" : In ("id" , "name" )})
126
+ assert .Equal (t , c .err , err )
127
+ assert .Equal (t , c .expected , q .ORDER ())
128
+ })
111
129
}
112
130
113
131
q := New ().SetValidations (Validations {"sort" : In ("id" )})
114
132
err := q .SetUrlString ("://" )
115
133
assert .Error (t , err )
134
+
116
135
err = q .SetUrlString ("?sort=id" )
117
136
assert .NoError (t , err )
137
+
118
138
err = q .Parse ()
119
139
assert .NoError (t , err )
120
140
assert .True (t , q .HaveSortBy ("id" ))
141
+
142
+ // Test AddSortBy
143
+ q .AddSortBy ("email" , true )
144
+ assert .True (t , q .HaveSortBy ("email" ))
121
145
}
122
146
123
147
func TestWhere (t * testing.T ) {
@@ -157,47 +181,53 @@ func TestWhere(t *testing.T) {
157
181
{url : "?id[eq]=1&id[eq]=4" , err : "id[eq]: bad format" },
158
182
{url : "?id[gte]=1&id[lte]=4" , expected : " WHERE id >= ? AND id <= ?" , expected2 : " WHERE id <= ? AND id >= ?" },
159
183
{url : "?id[gte]=1|id[lte]=4" , expected : " WHERE (id >= ? OR id <= ?)" , expected2 : " WHERE (id <= ? OR id >= ?)" },
184
+ {url : "?u[not]=NULL" , expected : " WHERE u IS NOT NULL" },
185
+ // bool:
186
+ {url : "?b=true" , expected : " WHERE b = ?" },
187
+ {url : "?b=true1" , err : "b: bad format" },
188
+ {url : "?b[not]=true" , err : "b[not]: method are not allowed" },
189
+ {url : "?b[eq]=true,false" , err : "b[eq]: method are not allowed" },
160
190
}
161
191
for _ , c := range cases {
162
- //t.Log(c)
163
-
164
- URL , err := url .Parse (c .url )
165
- assert .NoError (t , err )
166
-
167
- q := NewQV (URL .Query (), Validations {
168
- "id:int" : func (value interface {}) error {
169
- if value .(int ) > 10 {
170
- return errors .New ("can't be greater then 10" )
171
- }
172
- return nil
173
- },
174
- "s" : In (
175
- "super" ,
176
- "best" ,
177
- ),
178
- "u:string" : nil ,
179
- "custom" : func (value interface {}) error {
180
- return nil
181
- },
182
- }).IgnoreUnknownFilters (c .ignore )
192
+ t .Run (c .url , func (t * testing.T ) {
193
+ URL , err := url .Parse (c .url )
194
+ assert .NoError (t , err )
183
195
184
- err = q .Parse ()
196
+ q := NewQV (URL .Query (), Validations {
197
+ "id:int" : func (value interface {}) error {
198
+ if value .(int ) > 10 {
199
+ return errors .New ("can't be greater then 10" )
200
+ }
201
+ return nil
202
+ },
203
+ "s" : In (
204
+ "super" ,
205
+ "best" ,
206
+ ),
207
+ "u:string" : nil ,
208
+ "b:bool" : nil ,
209
+ "custom" : func (value interface {}) error {
210
+ return nil
211
+ },
212
+ }).IgnoreUnknownFilters (c .ignore )
185
213
186
- if len (c .err ) > 0 {
187
- assert .EqualError (t , err , c .err )
188
- }
189
- where := q .WHERE ()
190
- //t.Log(q.SQL("table"), q.Args())
191
- if len (c .expected2 ) > 0 {
192
- //t.Log("expected:", c.expected, "or:", c.expected2, "got:", where)
193
- assert .True (t , c .expected == where || c .expected2 == where )
194
- } else {
195
- //t.Log("expected:", c.expected, "got:", where)
196
- assert .True (t , c .expected == where )
197
- }
214
+ err = q .Parse ()
198
215
216
+ if len (c .err ) > 0 {
217
+ assert .EqualError (t , err , c .err )
218
+ } else {
219
+ assert .NoError (t , err )
220
+ }
221
+ where := q .WHERE ()
222
+ //t.Log(q.SQL("table"), q.Args())
223
+ if len (c .expected2 ) > 0 {
224
+ //t.Log("expected:", c.expected, "or:", c.expected2, "got:", where)
225
+ assert .True (t , c .expected == where || c .expected2 == where )
226
+ } else {
227
+ assert .Equal (t , c .expected , where )
228
+ }
229
+ })
199
230
}
200
-
201
231
}
202
232
203
233
func TestWhere2 (t * testing.T ) {
@@ -230,7 +260,7 @@ func TestArgs(t *testing.T) {
230
260
q .SetDelimiterIN ("!" )
231
261
assert .Len (t , q .Args (), 0 )
232
262
// setup url
233
- URL , err := url .Parse ("?fields=id!status&sort=id!+id!-id&offset=10&one=123&two=test&three[like]=*www*&three[in]=www1!www2" )
263
+ URL , err := url .Parse ("?fields=id!status&sort=id!+id!-id&offset=10&one=123&two=test&three[like]=*www*&three[in]=www1!www2&four[not]=NULL " )
234
264
assert .NoError (t , err )
235
265
236
266
err = q .SetUrlQuery (URL .Query ()).SetValidations (Validations {
@@ -239,15 +269,17 @@ func TestArgs(t *testing.T) {
239
269
"one:int" : nil ,
240
270
"two" : nil ,
241
271
"three" : nil ,
272
+ "four" : nil ,
242
273
}).Parse ()
243
274
assert .NoError (t , err )
244
275
245
- assert .Len (t , q .Args (), 5 )
276
+ assert .Len (t , q .Args (), 6 )
246
277
assert .Contains (t , q .Args (), 123 )
247
278
assert .Contains (t , q .Args (), "test" )
248
279
assert .Contains (t , q .Args (), "%www%" )
249
280
assert .Contains (t , q .Args (), "www1" )
250
281
assert .Contains (t , q .Args (), "www2" )
282
+ assert .Contains (t , q .Args (), "NULL" )
251
283
}
252
284
253
285
func TestSQL (t * testing.T ) {
@@ -270,11 +302,14 @@ func TestSQL(t *testing.T) {
270
302
}
271
303
272
304
func TestReplaceFiltersNames (t * testing.T ) {
273
- URL , err := url .Parse ("?one=123&another=yes" )
305
+ URL , err := url .Parse ("?fields=one&sort=one& one=123&another=yes" )
274
306
assert .NoError (t , err )
275
307
276
308
q , err := NewParse (URL .Query (), Validations {
277
- "one" : nil , "another" : nil ,
309
+ "fields" : In ("one" , "another" , "two" ),
310
+ "sort" : In ("one" , "another" , "two" ),
311
+ "one" : nil ,
312
+ "another" : nil ,
278
313
})
279
314
assert .NoError (t , err )
280
315
assert .True (t , q .HaveFilter ("one" ))
@@ -364,3 +399,18 @@ func Test_ignoreUnknown(t *testing.T) {
364
399
assert .Equal (t , ErrFilterNotFound , errors .Cause (q .Parse ()))
365
400
366
401
}
402
+
403
+ func TestRemoveValidation (t * testing.T ) {
404
+ q := New ()
405
+
406
+ // validation not found case
407
+ assert .EqualError (t , q .RemoveValidation ("fields" ), ErrValidationNotFound .Error ())
408
+
409
+ // remove plain validation
410
+ q .AddValidation ("fields" , In ("id" ))
411
+ assert .NoError (t , q .RemoveValidation ("fields" ))
412
+
413
+ // remove typed validation
414
+ q .AddValidation ("name:string" , In ("id" ))
415
+ assert .NoError (t , q .RemoveValidation ("name" ))
416
+ }
0 commit comments