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)
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
71	err = TooManyItems("something", "", 5)
72	assert.Error(t, err)
73	assert.EqualValues(t, MaxItemsFailCode, err.Code())
74	assert.Equal(t, "something should have at most 5 items", err.Error())
75
76	err = TooFewItems("something", "", 5)
77	assert.Error(t, err)
78	assert.EqualValues(t, MinItemsFailCode, err.Code())
79	assert.Equal(t, "something should have at least 5 items", err.Error())
80
81	err = ExceedsMaximumInt("something", "query", 5, false)
82	assert.Error(t, err)
83	assert.EqualValues(t, MaxFailCode, err.Code())
84	assert.Equal(t, "something in query should be less than or equal to 5", err.Error())
85
86	err = ExceedsMaximumInt("something", "", 5, false)
87	assert.Error(t, err)
88	assert.EqualValues(t, MaxFailCode, err.Code())
89	assert.Equal(t, "something should be less than or equal to 5", err.Error())
90
91	err = ExceedsMaximumInt("something", "query", 5, true)
92	assert.Error(t, err)
93	assert.EqualValues(t, MaxFailCode, err.Code())
94	assert.Equal(t, "something in query should be less than 5", err.Error())
95
96	err = ExceedsMaximumInt("something", "", 5, true)
97	assert.Error(t, err)
98	assert.EqualValues(t, MaxFailCode, err.Code())
99	assert.Equal(t, "something should be less than 5", err.Error())
100
101	err = ExceedsMaximumUint("something", "query", 5, false)
102	assert.Error(t, err)
103	assert.EqualValues(t, MaxFailCode, err.Code())
104	assert.Equal(t, "something in query should be less than or equal to 5", err.Error())
105
106	err = ExceedsMaximumUint("something", "", 5, false)
107	assert.Error(t, err)
108	assert.EqualValues(t, MaxFailCode, err.Code())
109	assert.Equal(t, "something should be less than or equal to 5", err.Error())
110
111	err = ExceedsMaximumUint("something", "query", 5, true)
112	assert.Error(t, err)
113	assert.EqualValues(t, MaxFailCode, err.Code())
114	assert.Equal(t, "something in query should be less than 5", err.Error())
115
116	err = ExceedsMaximumUint("something", "", 5, true)
117	assert.Error(t, err)
118	assert.EqualValues(t, MaxFailCode, err.Code())
119	assert.Equal(t, "something should be less than 5", err.Error())
120
121	err = ExceedsMaximum("something", "query", 5, false)
122	assert.Error(t, err)
123	assert.EqualValues(t, MaxFailCode, err.Code())
124	assert.Equal(t, "something in query should be less than or equal to 5", err.Error())
125
126	err = ExceedsMaximum("something", "", 5, false)
127	assert.Error(t, err)
128	assert.EqualValues(t, MaxFailCode, err.Code())
129	assert.Equal(t, "something should be less than or equal to 5", err.Error())
130
131	err = ExceedsMaximum("something", "query", 5, true)
132	assert.Error(t, err)
133	assert.EqualValues(t, MaxFailCode, err.Code())
134	assert.Equal(t, "something in query should be less than 5", err.Error())
135
136	err = ExceedsMaximum("something", "", 5, true)
137	assert.Error(t, err)
138	assert.EqualValues(t, MaxFailCode, err.Code())
139	assert.Equal(t, "something should be less than 5", err.Error())
140
141	err = ExceedsMinimumInt("something", "query", 5, false)
142	assert.Error(t, err)
143	assert.EqualValues(t, MinFailCode, err.Code())
144	assert.Equal(t, "something in query should be greater than or equal to 5", err.Error())
145
146	err = ExceedsMinimumInt("something", "", 5, false)
147	assert.Error(t, err)
148	assert.EqualValues(t, MinFailCode, err.Code())
149	assert.Equal(t, "something should be greater than or equal to 5", err.Error())
150
151	err = ExceedsMinimumInt("something", "query", 5, true)
152	assert.Error(t, err)
153	assert.EqualValues(t, MinFailCode, err.Code())
154	assert.Equal(t, "something in query should be greater than 5", err.Error())
155
156	err = ExceedsMinimumInt("something", "", 5, true)
157	assert.Error(t, err)
158	assert.EqualValues(t, MinFailCode, err.Code())
159	assert.Equal(t, "something should be greater than 5", err.Error())
160
161	err = ExceedsMinimumUint("something", "query", 5, false)
162	assert.Error(t, err)
163	assert.EqualValues(t, MinFailCode, err.Code())
164	assert.Equal(t, "something in query should be greater than or equal to 5", err.Error())
165
166	err = ExceedsMinimumUint("something", "", 5, false)
167	assert.Error(t, err)
168	assert.EqualValues(t, MinFailCode, err.Code())
169	assert.Equal(t, "something should be greater than or equal to 5", err.Error())
170
171	err = ExceedsMinimumUint("something", "query", 5, true)
172	assert.Error(t, err)
173	assert.EqualValues(t, MinFailCode, err.Code())
174	assert.Equal(t, "something in query should be greater than 5", err.Error())
175
176	err = ExceedsMinimumUint("something", "", 5, true)
177	assert.Error(t, err)
178	assert.EqualValues(t, MinFailCode, err.Code())
179	assert.Equal(t, "something should be greater than 5", err.Error())
180
181	err = ExceedsMinimum("something", "query", 5, false)
182	assert.Error(t, err)
183	assert.EqualValues(t, MinFailCode, err.Code())
184	assert.Equal(t, "something in query should be greater than or equal to 5", err.Error())
185
186	err = ExceedsMinimum("something", "", 5, false)
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
191	err = ExceedsMinimum("something", "query", 5, true)
192	assert.Error(t, err)
193	assert.EqualValues(t, MinFailCode, err.Code())
194	assert.Equal(t, "something in query should be greater than 5", err.Error())
195
196	err = ExceedsMinimum("something", "", 5, true)
197	assert.Error(t, err)
198	assert.EqualValues(t, MinFailCode, err.Code())
199	assert.Equal(t, "something should be greater than 5", err.Error())
200
201	err = NotMultipleOf("something", "query", 5)
202	assert.Error(t, err)
203	assert.EqualValues(t, MultipleOfFailCode, err.Code())
204	assert.Equal(t, "something in query should be a multiple of 5", err.Error())
205
206	err = NotMultipleOf("something", "query", float64(5))
207	assert.Error(t, err)
208	assert.EqualValues(t, MultipleOfFailCode, err.Code())
209	assert.Equal(t, "something in query should be a multiple of 5", err.Error())
210
211	err = NotMultipleOf("something", "query", uint64(5))
212	assert.Error(t, err)
213	assert.EqualValues(t, MultipleOfFailCode, err.Code())
214	assert.Equal(t, "something in query should be a multiple of 5", err.Error())
215
216	err = NotMultipleOf("something", "", 5)
217	assert.Error(t, err)
218	assert.EqualValues(t, MultipleOfFailCode, err.Code())
219	assert.Equal(t, "something should be a multiple of 5", err.Error())
220
221	err = EnumFail("something", "query", "yada", []interface{}{"hello", "world"})
222	assert.Error(t, err)
223	assert.EqualValues(t, EnumFailCode, err.Code())
224	assert.Equal(t, "something in query should be one of [hello world]", err.Error())
225
226	err = EnumFail("something", "", "yada", []interface{}{"hello", "world"})
227	assert.Error(t, err)
228	assert.EqualValues(t, EnumFailCode, err.Code())
229	assert.Equal(t, "something should be one of [hello world]", err.Error())
230
231	err = Required("something", "query")
232	assert.Error(t, err)
233	assert.EqualValues(t, RequiredFailCode, err.Code())
234	assert.Equal(t, "something in query is required", err.Error())
235
236	err = Required("something", "")
237	assert.Error(t, err)
238	assert.EqualValues(t, RequiredFailCode, err.Code())
239	assert.Equal(t, "something is required", err.Error())
240
241	err = TooLong("something", "query", 5)
242	assert.Error(t, err)
243	assert.EqualValues(t, TooLongFailCode, err.Code())
244	assert.Equal(t, "something in query should be at most 5 chars long", err.Error())
245
246	err = TooLong("something", "", 5)
247	assert.Error(t, err)
248	assert.EqualValues(t, TooLongFailCode, err.Code())
249	assert.Equal(t, "something should be at most 5 chars long", err.Error())
250
251	err = TooShort("something", "query", 5)
252	assert.Error(t, err)
253	assert.EqualValues(t, TooShortFailCode, err.Code())
254	assert.Equal(t, "something in query should be at least 5 chars long", err.Error())
255
256	err = TooShort("something", "", 5)
257	assert.Error(t, err)
258	assert.EqualValues(t, TooShortFailCode, err.Code())
259	assert.Equal(t, "something should be at least 5 chars long", err.Error())
260
261	err = FailedPattern("something", "query", "\\d+")
262	assert.Error(t, err)
263	assert.EqualValues(t, PatternFailCode, err.Code())
264	assert.Equal(t, "something in query should match '\\d+'", err.Error())
265
266	err = FailedPattern("something", "", "\\d+")
267	assert.Error(t, err)
268	assert.EqualValues(t, PatternFailCode, err.Code())
269	assert.Equal(t, "something should match '\\d+'", err.Error())
270
271	err = InvalidTypeName("something")
272	assert.Error(t, err)
273	assert.EqualValues(t, InvalidTypeCode, err.Code())
274	assert.Equal(t, "something is an invalid type name", err.Error())
275
276	err = AdditionalItemsNotAllowed("something", "query")
277	assert.Error(t, err)
278	assert.EqualValues(t, NoAdditionalItemsCode, err.Code())
279	assert.Equal(t, "something in query can't have additional items", err.Error())
280
281	err = AdditionalItemsNotAllowed("something", "")
282	assert.Error(t, err)
283	assert.EqualValues(t, NoAdditionalItemsCode, err.Code())
284	assert.Equal(t, "something can't have additional items", err.Error())
285
286	err = InvalidCollectionFormat("something", "query", "yada")
287	assert.Error(t, err)
288	assert.EqualValues(t, InvalidTypeCode, err.Code())
289	assert.Equal(t, "the collection format \"yada\" is not supported for the query param \"something\"", err.Error())
290
291	err2 := CompositeValidationError()
292	assert.Error(t, err2)
293	assert.EqualValues(t, CompositeErrorCode, err2.Code())
294	assert.Equal(t, "validation failure list", err2.Error())
295
296	err2 = CompositeValidationError(fmt.Errorf("first error"), fmt.Errorf("second error"))
297	assert.Error(t, err2)
298	assert.EqualValues(t, CompositeErrorCode, err2.Code())
299	assert.Equal(t, "validation failure list:\nfirst error\nsecond error", err2.Error())
300
301	//func MultipleOfMustBePositive(name, in string, factor interface{}) *Validation {
302	err = MultipleOfMustBePositive("path", "body", float64(-10))
303	assert.Error(t, err)
304	assert.EqualValues(t, MultipleOfMustBePositiveCode, err.Code())
305	assert.Equal(t, `factor MultipleOf declared for path must be positive: -10`, err.Error())
306
307	err = MultipleOfMustBePositive("path", "body", int64(-10))
308	assert.Error(t, err)
309	assert.EqualValues(t, MultipleOfMustBePositiveCode, err.Code())
310	assert.Equal(t, `factor MultipleOf declared for path must be positive: -10`, err.Error())
311
312	// func PropertyNotAllowed(name, in, key string) *Validation {
313	err = PropertyNotAllowed("path", "body", "key")
314	assert.Error(t, err)
315	assert.EqualValues(t, UnallowedPropertyCode, err.Code())
316	//unallowedProperty         = "%s.%s in %s is a forbidden property"
317	assert.Equal(t, "path.key in body is a forbidden property", err.Error())
318
319	err = PropertyNotAllowed("path", "", "key")
320	assert.Error(t, err)
321	assert.EqualValues(t, UnallowedPropertyCode, err.Code())
322	//unallowedPropertyNoIn     = "%s.%s is a forbidden property"
323	assert.Equal(t, "path.key is a forbidden property", err.Error())
324
325	//func TooManyProperties(name, in string, n int64) *Validation {
326	err = TooManyProperties("path", "body", 10)
327	assert.Error(t, err)
328	assert.EqualValues(t, TooManyPropertiesCode, err.Code())
329	//tooManyProperties         = "%s in %s should have at most %d properties"
330	assert.Equal(t, "path in body should have at most 10 properties", err.Error())
331
332	err = TooManyProperties("path", "", 10)
333	assert.Error(t, err)
334	assert.EqualValues(t, TooManyPropertiesCode, err.Code())
335	//tooManyPropertiesNoIn     = "%s should have at most %d properties"
336	assert.Equal(t, "path should have at most 10 properties", err.Error())
337
338	err = TooFewProperties("path", "body", 10)
339	// func TooFewProperties(name, in string, n int64) *Validation {
340	assert.Error(t, err)
341	assert.EqualValues(t, TooFewPropertiesCode, err.Code())
342	//tooFewProperties          = "%s in %s should have at least %d properties"
343	assert.Equal(t, "path in body should have at least 10 properties", err.Error())
344
345	err = TooFewProperties("path", "", 10)
346	// func TooFewProperties(name, in string, n int64) *Validation {
347	assert.Error(t, err)
348	assert.EqualValues(t, TooFewPropertiesCode, err.Code())
349	//tooFewPropertiesNoIn      = "%s should have at least %d properties"
350	assert.Equal(t, "path should have at least 10 properties", err.Error())
351
352	//func FailedAllPatternProperties(name, in, key string) *Validation {
353	err = FailedAllPatternProperties("path", "body", "key")
354	assert.Error(t, err)
355	assert.EqualValues(t, FailedAllPatternPropsCode, err.Code())
356	//failedAllPatternProps     = "%s.%s in %s failed all pattern properties"
357	assert.Equal(t, "path.key in body failed all pattern properties", err.Error())
358
359	err = FailedAllPatternProperties("path", "", "key")
360	assert.Error(t, err)
361	assert.EqualValues(t, FailedAllPatternPropsCode, err.Code())
362	//failedAllPatternPropsNoIn = "%s.%s failed all pattern properties"
363	assert.Equal(t, "path.key failed all pattern properties", err.Error())
364}
365