1// Copyright 2015 go-swagger maintainers
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//    http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package errors
16
17import (
18	"errors"
19	"fmt"
20	"testing"
21
22	"github.com/stretchr/testify/assert"
23)
24
25func TestSchemaErrors(t *testing.T) {
26	err := InvalidType("confirmed", "query", "boolean", nil)
27	assert.Error(t, err)
28	assert.EqualValues(t, InvalidTypeCode, err.Code())
29	assert.Equal(t, "confirmed in query must be of type boolean", err.Error())
30
31	err = InvalidType("confirmed", "", "boolean", nil)
32	assert.Error(t, err)
33	assert.EqualValues(t, InvalidTypeCode, err.Code())
34	assert.Equal(t, "confirmed must be of type boolean", err.Error())
35
36	err = InvalidType("confirmed", "query", "boolean", "hello")
37	assert.Error(t, err)
38	assert.EqualValues(t, InvalidTypeCode, err.Code())
39	assert.Equal(t, "confirmed in query must be of type boolean: \"hello\"", err.Error())
40
41	err = InvalidType("confirmed", "query", "boolean", errors.New("hello"))
42	assert.Error(t, err)
43	assert.EqualValues(t, InvalidTypeCode, err.Code())
44	assert.Equal(t, "confirmed in query must be of type boolean, because: hello", err.Error())
45
46	err = InvalidType("confirmed", "", "boolean", "hello")
47	assert.Error(t, err)
48	assert.EqualValues(t, InvalidTypeCode, err.Code())
49	assert.Equal(t, "confirmed must be of type boolean: \"hello\"", err.Error())
50
51	err = InvalidType("confirmed", "", "boolean", errors.New("hello"))
52	assert.Error(t, err)
53	assert.EqualValues(t, InvalidTypeCode, err.Code())
54	assert.Equal(t, "confirmed must be of type boolean, because: hello", err.Error())
55
56	err = DuplicateItems("uniques", "query")
57	assert.Error(t, err)
58	assert.EqualValues(t, UniqueFailCode, err.Code())
59	assert.Equal(t, "uniques in query shouldn't contain duplicates", err.Error())
60
61	err = DuplicateItems("uniques", "")
62	assert.Error(t, err)
63	assert.EqualValues(t, UniqueFailCode, err.Code())
64	assert.Equal(t, "uniques shouldn't contain duplicates", err.Error())
65
66	err = TooManyItems("something", "query", 5, 6)
67	assert.Error(t, err)
68	assert.EqualValues(t, MaxItemsFailCode, err.Code())
69	assert.Equal(t, "something in query should have at most 5 items", err.Error())
70	assert.Equal(t, 6, err.Value)
71
72	err = TooManyItems("something", "", 5, 6)
73	assert.Error(t, err)
74	assert.EqualValues(t, MaxItemsFailCode, err.Code())
75	assert.Equal(t, "something should have at most 5 items", err.Error())
76	assert.Equal(t, 6, err.Value)
77
78	err = TooFewItems("something", "", 5, 4)
79	assert.Error(t, err)
80	assert.EqualValues(t, MinItemsFailCode, err.Code())
81	assert.Equal(t, "something should have at least 5 items", err.Error())
82	assert.Equal(t, 4, err.Value)
83
84	err = ExceedsMaximumInt("something", "query", 5, false, 6)
85	assert.Error(t, err)
86	assert.EqualValues(t, MaxFailCode, err.Code())
87	assert.Equal(t, "something in query should be less than or equal to 5", err.Error())
88	assert.Equal(t, 6, err.Value)
89
90	err = ExceedsMaximumInt("something", "", 5, false, 6)
91	assert.Error(t, err)
92	assert.EqualValues(t, MaxFailCode, err.Code())
93	assert.Equal(t, "something should be less than or equal to 5", err.Error())
94	assert.Equal(t, 6, err.Value)
95
96	err = ExceedsMaximumInt("something", "query", 5, true, 6)
97	assert.Error(t, err)
98	assert.EqualValues(t, MaxFailCode, err.Code())
99	assert.Equal(t, "something in query should be less than 5", err.Error())
100	assert.Equal(t, 6, err.Value)
101
102	err = ExceedsMaximumInt("something", "", 5, true, 6)
103	assert.Error(t, err)
104	assert.EqualValues(t, MaxFailCode, err.Code())
105	assert.Equal(t, "something should be less than 5", err.Error())
106	assert.Equal(t, 6, err.Value)
107
108	err = ExceedsMaximumUint("something", "query", 5, false, 6)
109	assert.Error(t, err)
110	assert.EqualValues(t, MaxFailCode, err.Code())
111	assert.Equal(t, "something in query should be less than or equal to 5", err.Error())
112	assert.Equal(t, 6, err.Value)
113
114	err = ExceedsMaximumUint("something", "", 5, false, 6)
115	assert.Error(t, err)
116	assert.EqualValues(t, MaxFailCode, err.Code())
117	assert.Equal(t, "something should be less than or equal to 5", err.Error())
118	assert.Equal(t, 6, err.Value)
119
120	err = ExceedsMaximumUint("something", "query", 5, true, 6)
121	assert.Error(t, err)
122	assert.EqualValues(t, MaxFailCode, err.Code())
123	assert.Equal(t, "something in query should be less than 5", err.Error())
124	assert.Equal(t, 6, err.Value)
125
126	err = ExceedsMaximumUint("something", "", 5, true, 6)
127	assert.Error(t, err)
128	assert.EqualValues(t, MaxFailCode, err.Code())
129	assert.Equal(t, "something should be less than 5", err.Error())
130	assert.Equal(t, 6, err.Value)
131
132	err = ExceedsMaximum("something", "query", 5, false, 6)
133	assert.Error(t, err)
134	assert.EqualValues(t, MaxFailCode, err.Code())
135	assert.Equal(t, "something in query should be less than or equal to 5", err.Error())
136	assert.Equal(t, 6, err.Value)
137
138	err = ExceedsMaximum("something", "", 5, false, 6)
139	assert.Error(t, err)
140	assert.EqualValues(t, MaxFailCode, err.Code())
141	assert.Equal(t, "something should be less than or equal to 5", err.Error())
142	assert.Equal(t, 6, err.Value)
143
144	err = ExceedsMaximum("something", "query", 5, true, 6)
145	assert.Error(t, err)
146	assert.EqualValues(t, MaxFailCode, err.Code())
147	assert.Equal(t, "something in query should be less than 5", err.Error())
148	assert.Equal(t, 6, err.Value)
149
150	err = ExceedsMaximum("something", "", 5, true, 6)
151	assert.Error(t, err)
152	assert.EqualValues(t, MaxFailCode, err.Code())
153	assert.Equal(t, "something should be less than 5", err.Error())
154	assert.Equal(t, 6, err.Value)
155
156	err = ExceedsMinimumInt("something", "query", 5, false, 4)
157	assert.Error(t, err)
158	assert.EqualValues(t, MinFailCode, err.Code())
159	assert.Equal(t, "something in query should be greater than or equal to 5", err.Error())
160	assert.Equal(t, 4, err.Value)
161
162	err = ExceedsMinimumInt("something", "", 5, false, 4)
163	assert.Error(t, err)
164	assert.EqualValues(t, MinFailCode, err.Code())
165	assert.Equal(t, "something should be greater than or equal to 5", err.Error())
166	assert.Equal(t, 4, err.Value)
167
168	err = ExceedsMinimumInt("something", "query", 5, true, 4)
169	assert.Error(t, err)
170	assert.EqualValues(t, MinFailCode, err.Code())
171	assert.Equal(t, "something in query should be greater than 5", err.Error())
172	assert.Equal(t, 4, err.Value)
173
174	err = ExceedsMinimumInt("something", "", 5, true, 4)
175	assert.Error(t, err)
176	assert.EqualValues(t, MinFailCode, err.Code())
177	assert.Equal(t, "something should be greater than 5", err.Error())
178	assert.Equal(t, 4, err.Value)
179
180	err = ExceedsMinimumUint("something", "query", 5, false, 4)
181	assert.Error(t, err)
182	assert.EqualValues(t, MinFailCode, err.Code())
183	assert.Equal(t, "something in query should be greater than or equal to 5", err.Error())
184	assert.Equal(t, 4, err.Value)
185
186	err = ExceedsMinimumUint("something", "", 5, false, 4)
187	assert.Error(t, err)
188	assert.EqualValues(t, MinFailCode, err.Code())
189	assert.Equal(t, "something should be greater than or equal to 5", err.Error())
190	assert.Equal(t, 4, err.Value)
191
192	err = ExceedsMinimumUint("something", "query", 5, true, 4)
193	assert.Error(t, err)
194	assert.EqualValues(t, MinFailCode, err.Code())
195	assert.Equal(t, "something in query should be greater than 5", err.Error())
196	assert.Equal(t, 4, err.Value)
197
198	err = ExceedsMinimumUint("something", "", 5, true, 4)
199	assert.Error(t, err)
200	assert.EqualValues(t, MinFailCode, err.Code())
201	assert.Equal(t, "something should be greater than 5", err.Error())
202	assert.Equal(t, 4, err.Value)
203
204	err = ExceedsMinimum("something", "query", 5, false, 4)
205	assert.Error(t, err)
206	assert.EqualValues(t, MinFailCode, err.Code())
207	assert.Equal(t, "something in query should be greater than or equal to 5", err.Error())
208	assert.Equal(t, 4, err.Value)
209
210	err = ExceedsMinimum("something", "", 5, false, 4)
211	assert.Error(t, err)
212	assert.EqualValues(t, MinFailCode, err.Code())
213	assert.Equal(t, "something should be greater than or equal to 5", err.Error())
214	assert.Equal(t, 4, err.Value)
215
216	err = ExceedsMinimum("something", "query", 5, true, 4)
217	assert.Error(t, err)
218	assert.EqualValues(t, MinFailCode, err.Code())
219	assert.Equal(t, "something in query should be greater than 5", err.Error())
220	assert.Equal(t, 4, err.Value)
221
222	err = ExceedsMinimum("something", "", 5, true, 4)
223	assert.Error(t, err)
224	assert.EqualValues(t, MinFailCode, err.Code())
225	assert.Equal(t, "something should be greater than 5", err.Error())
226	assert.Equal(t, 4, err.Value)
227
228	err = NotMultipleOf("something", "query", 5, 1)
229	assert.Error(t, err)
230	assert.EqualValues(t, MultipleOfFailCode, err.Code())
231	assert.Equal(t, "something in query should be a multiple of 5", err.Error())
232	assert.Equal(t, 1, err.Value)
233
234	err = NotMultipleOf("something", "query", float64(5), float64(1))
235	assert.Error(t, err)
236	assert.EqualValues(t, MultipleOfFailCode, err.Code())
237	assert.Equal(t, "something in query should be a multiple of 5", err.Error())
238	assert.Equal(t, float64(1), err.Value)
239
240	err = NotMultipleOf("something", "query", uint64(5), uint64(1))
241	assert.Error(t, err)
242	assert.EqualValues(t, MultipleOfFailCode, err.Code())
243	assert.Equal(t, "something in query should be a multiple of 5", err.Error())
244	assert.Equal(t, uint64(1), err.Value)
245
246	err = NotMultipleOf("something", "", 5, 1)
247	assert.Error(t, err)
248	assert.EqualValues(t, MultipleOfFailCode, err.Code())
249	assert.Equal(t, "something should be a multiple of 5", err.Error())
250	assert.Equal(t, 1, err.Value)
251
252	err = EnumFail("something", "query", "yada", []interface{}{"hello", "world"})
253	assert.Error(t, err)
254	assert.EqualValues(t, EnumFailCode, err.Code())
255	assert.Equal(t, "something in query should be one of [hello world]", err.Error())
256	assert.Equal(t, "yada", err.Value)
257
258	err = EnumFail("something", "", "yada", []interface{}{"hello", "world"})
259	assert.Error(t, err)
260	assert.EqualValues(t, EnumFailCode, err.Code())
261	assert.Equal(t, "something should be one of [hello world]", err.Error())
262	assert.Equal(t, "yada", err.Value)
263
264	err = Required("something", "query", nil)
265	assert.Error(t, err)
266	assert.EqualValues(t, RequiredFailCode, err.Code())
267	assert.Equal(t, "something in query is required", err.Error())
268	assert.Equal(t, nil, err.Value)
269
270	err = Required("something", "", nil)
271	assert.Error(t, err)
272	assert.EqualValues(t, RequiredFailCode, err.Code())
273	assert.Equal(t, "something is required", err.Error())
274	assert.Equal(t, nil, err.Value)
275
276	err = ReadOnly("something", "query", nil)
277	assert.Error(t, err)
278	assert.EqualValues(t, ReadOnlyFailCode, err.Code())
279	assert.Equal(t, "something in query is readOnly", err.Error())
280	assert.Equal(t, nil, err.Value)
281
282	err = ReadOnly("something", "", nil)
283	assert.Error(t, err)
284	assert.EqualValues(t, ReadOnlyFailCode, err.Code())
285	assert.Equal(t, "something is readOnly", err.Error())
286	assert.Equal(t, nil, err.Value)
287
288	err = TooLong("something", "query", 5, "abcdef")
289	assert.Error(t, err)
290	assert.EqualValues(t, TooLongFailCode, err.Code())
291	assert.Equal(t, "something in query should be at most 5 chars long", err.Error())
292	assert.Equal(t, "abcdef", err.Value)
293
294	err = TooLong("something", "", 5, "abcdef")
295	assert.Error(t, err)
296	assert.EqualValues(t, TooLongFailCode, err.Code())
297	assert.Equal(t, "something should be at most 5 chars long", err.Error())
298	assert.Equal(t, "abcdef", err.Value)
299
300	err = TooShort("something", "query", 5, "a")
301	assert.Error(t, err)
302	assert.EqualValues(t, TooShortFailCode, err.Code())
303	assert.Equal(t, "something in query should be at least 5 chars long", err.Error())
304	assert.Equal(t, "a", err.Value)
305
306	err = TooShort("something", "", 5, "a")
307	assert.Error(t, err)
308	assert.EqualValues(t, TooShortFailCode, err.Code())
309	assert.Equal(t, "something should be at least 5 chars long", err.Error())
310	assert.Equal(t, "a", err.Value)
311
312	err = FailedPattern("something", "query", "\\d+", "a")
313	assert.Error(t, err)
314	assert.EqualValues(t, PatternFailCode, err.Code())
315	assert.Equal(t, "something in query should match '\\d+'", err.Error())
316	assert.Equal(t, "a", err.Value)
317
318	err = FailedPattern("something", "", "\\d+", "a")
319	assert.Error(t, err)
320	assert.EqualValues(t, PatternFailCode, err.Code())
321	assert.Equal(t, "something should match '\\d+'", err.Error())
322	assert.Equal(t, "a", err.Value)
323
324	err = InvalidTypeName("something")
325	assert.Error(t, err)
326	assert.EqualValues(t, InvalidTypeCode, err.Code())
327	assert.Equal(t, "something is an invalid type name", err.Error())
328
329	err = AdditionalItemsNotAllowed("something", "query")
330	assert.Error(t, err)
331	assert.EqualValues(t, NoAdditionalItemsCode, err.Code())
332	assert.Equal(t, "something in query can't have additional items", err.Error())
333
334	err = AdditionalItemsNotAllowed("something", "")
335	assert.Error(t, err)
336	assert.EqualValues(t, NoAdditionalItemsCode, err.Code())
337	assert.Equal(t, "something can't have additional items", err.Error())
338
339	err = InvalidCollectionFormat("something", "query", "yada")
340	assert.Error(t, err)
341	assert.EqualValues(t, InvalidTypeCode, err.Code())
342	assert.Equal(t, "the collection format \"yada\" is not supported for the query param \"something\"", err.Error())
343
344	err2 := CompositeValidationError()
345	assert.Error(t, err2)
346	assert.EqualValues(t, CompositeErrorCode, err2.Code())
347	assert.Equal(t, "validation failure list", err2.Error())
348
349	err2 = CompositeValidationError(fmt.Errorf("first error"), fmt.Errorf("second error"))
350	assert.Error(t, err2)
351	assert.EqualValues(t, CompositeErrorCode, err2.Code())
352	assert.Equal(t, "validation failure list:\nfirst error\nsecond error", err2.Error())
353
354	// func MultipleOfMustBePositive(name, in string, factor interface{}) *Validation {
355	err = MultipleOfMustBePositive("path", "body", float64(-10))
356	assert.Error(t, err)
357	assert.EqualValues(t, MultipleOfMustBePositiveCode, err.Code())
358	assert.Equal(t, `factor MultipleOf declared for path must be positive: -10`, err.Error())
359	assert.Equal(t, float64(-10), err.Value)
360
361	err = MultipleOfMustBePositive("path", "body", int64(-10))
362	assert.Error(t, err)
363	assert.EqualValues(t, MultipleOfMustBePositiveCode, err.Code())
364	assert.Equal(t, `factor MultipleOf declared for path must be positive: -10`, err.Error())
365	assert.Equal(t, int64(-10), err.Value)
366
367	// func PropertyNotAllowed(name, in, key string) *Validation {
368	err = PropertyNotAllowed("path", "body", "key")
369	assert.Error(t, err)
370	assert.EqualValues(t, UnallowedPropertyCode, err.Code())
371	// unallowedProperty         = "%s.%s in %s is a forbidden property"
372	assert.Equal(t, "path.key in body is a forbidden property", err.Error())
373
374	err = PropertyNotAllowed("path", "", "key")
375	assert.Error(t, err)
376	assert.EqualValues(t, UnallowedPropertyCode, err.Code())
377	// unallowedPropertyNoIn     = "%s.%s is a forbidden property"
378	assert.Equal(t, "path.key is a forbidden property", err.Error())
379
380	// func TooManyProperties(name, in string, n int64) *Validation {
381	err = TooManyProperties("path", "body", 10)
382	assert.Error(t, err)
383	assert.EqualValues(t, TooManyPropertiesCode, err.Code())
384	// tooManyProperties         = "%s in %s should have at most %d properties"
385	assert.Equal(t, "path in body should have at most 10 properties", err.Error())
386
387	err = TooManyProperties("path", "", 10)
388	assert.Error(t, err)
389	assert.EqualValues(t, TooManyPropertiesCode, err.Code())
390	// tooManyPropertiesNoIn     = "%s should have at most %d properties"
391	assert.Equal(t, "path should have at most 10 properties", err.Error())
392
393	err = TooFewProperties("path", "body", 10)
394	// func TooFewProperties(name, in string, n int64) *Validation {
395	assert.Error(t, err)
396	assert.EqualValues(t, TooFewPropertiesCode, err.Code())
397	// tooFewProperties          = "%s in %s should have at least %d properties"
398	assert.Equal(t, "path in body should have at least 10 properties", err.Error())
399
400	err = TooFewProperties("path", "", 10)
401	// func TooFewProperties(name, in string, n int64) *Validation {
402	assert.Error(t, err)
403	assert.EqualValues(t, TooFewPropertiesCode, err.Code())
404	// tooFewPropertiesNoIn      = "%s should have at least %d properties"
405	assert.Equal(t, "path should have at least 10 properties", err.Error())
406
407	// func FailedAllPatternProperties(name, in, key string) *Validation {
408	err = FailedAllPatternProperties("path", "body", "key")
409	assert.Error(t, err)
410	assert.EqualValues(t, FailedAllPatternPropsCode, err.Code())
411	// failedAllPatternProps     = "%s.%s in %s failed all pattern properties"
412	assert.Equal(t, "path.key in body failed all pattern properties", err.Error())
413
414	err = FailedAllPatternProperties("path", "", "key")
415	assert.Error(t, err)
416	assert.EqualValues(t, FailedAllPatternPropsCode, err.Code())
417	// failedAllPatternPropsNoIn = "%s.%s failed all pattern properties"
418	assert.Equal(t, "path.key failed all pattern properties", err.Error())
419}
420