Skip to content

Commit 2640fcc

Browse files
committed
Add defaulter support
1 parent deaf2c9 commit 2640fcc

15 files changed

+387
-137
lines changed

defaulter_test.go

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package validate
2+
3+
import (
4+
"encoding/json"
5+
"io/ioutil"
6+
"path/filepath"
7+
"testing"
8+
9+
"github.com/stretchr/testify/assert"
10+
11+
"github.com/go-openapi/spec"
12+
"github.com/go-openapi/strfmt"
13+
"fmt"
14+
)
15+
16+
var defaulterFixturesPath = filepath.Join("fixtures", "defaulting")
17+
18+
func TestDefaulter(t *testing.T) {
19+
fname := filepath.Join(defaulterFixturesPath, "schema.json")
20+
b, err := ioutil.ReadFile(fname)
21+
assert.NoError(t, err)
22+
var schema spec.Schema
23+
assert.NoError(t, json.Unmarshal(b, &schema))
24+
25+
err = spec.ExpandSchema(&schema, nil, nil /*new(noopResCache)*/)
26+
assert.NoError(t, err, fname+" should expand cleanly")
27+
28+
validator := NewSchemaValidator(&schema, nil, "", strfmt.Default)
29+
x := map[string]interface{}{
30+
"nested": map[string]interface{}{},
31+
"all": map[string]interface{}{},
32+
"any": map[string]interface{}{},
33+
"one": map[string]interface{}{},
34+
}
35+
t.Logf("Before: %v", x)
36+
r, _ := validator.Validate(x)
37+
assert.False(t, r.HasErrors(), fmt.Sprintf("unexpected validation error: %v", r.AsError()))
38+
39+
r.ApplyDefaults()
40+
t.Logf("After: %v", x)
41+
}

fixtures/defaulting/schema.json

+97
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
{
2+
"properties": {
3+
"int": {
4+
"type": "integer",
5+
"default": 42
6+
},
7+
"str": {
8+
"type": "string",
9+
"minLength": 4,
10+
"default": "Hello"
11+
},
12+
"obj": {
13+
"type": "object",
14+
"default": {"foo": "bar"}
15+
},
16+
"nested": {
17+
"type": "object",
18+
"properties": {
19+
"inner": {
20+
"type": "integer",
21+
"default": 7
22+
}
23+
}
24+
},
25+
"all": {
26+
"allOf": [
27+
{
28+
"type": "object",
29+
"properties": {
30+
"foo": {
31+
"type": "integer",
32+
"default": 42
33+
}
34+
}
35+
},
36+
{
37+
"type": "object",
38+
"properties": {
39+
"bar": {
40+
"type": "integer",
41+
"default": 42
42+
}
43+
}
44+
}
45+
]
46+
},
47+
"any": {
48+
"anyOf": [
49+
{
50+
"type": "object",
51+
"properties": {
52+
"foo": {
53+
"type": "integer",
54+
"default": 42
55+
}
56+
}
57+
},
58+
{
59+
"type": "object",
60+
"properties": {
61+
"bar": {
62+
"type": "integer",
63+
"default": 42
64+
}
65+
}
66+
}
67+
]
68+
},
69+
"one": {
70+
"oneOf": [
71+
{
72+
"type": "object",
73+
"properties": {
74+
"foo": {
75+
"type": "integer"
76+
}
77+
},
78+
"required": ["foo"]
79+
},
80+
{
81+
"type": "object",
82+
"properties": {
83+
"bar": {
84+
"type": "integer",
85+
"default": 42
86+
}
87+
}
88+
}
89+
]
90+
},
91+
"not": {
92+
"type": "object",
93+
"default": {"foo": 1}
94+
}
95+
},
96+
"required": ["int", "str", "nested", "all", "any", "one"]
97+
}

formats.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,15 @@ func (f *formatValidator) Applies(source interface{}, kind reflect.Kind) bool {
5555
return r
5656
}
5757

58-
func (f *formatValidator) Validate(val interface{}) *Result {
58+
func (f *formatValidator) Validate(val interface{}) (*Result, interface{}) {
5959
result := new(Result)
6060

6161
if err := FormatOf(f.Path, f.In, f.Format, val.(string), f.KnownFormats); err != nil {
6262
result.AddErrors(err)
6363
}
6464

6565
if result.HasErrors() {
66-
return result
66+
return result, nil
6767
}
68-
return nil
68+
return nil, nil
6969
}

items_validator_test.go

+20-20
Original file line numberDiff line numberDiff line change
@@ -112,47 +112,47 @@ func TestNumberItemsValidation(t *testing.T) {
112112
validator := newItemsValidator(parent.Name, parent.In, items, parent, strfmt.Default)
113113

114114
// MultipleOf
115-
err := validator.Validate(i, v[0])
115+
err, _ := validator.Validate(i, v[0])
116116
assert.True(t, err.HasErrors())
117117
assert.EqualError(t, multipleOfErrorItems(path, validator.in, items), err.Errors[0].Error())
118118

119119
// Maximum
120-
err = validator.Validate(i, v[1])
120+
err, _ = validator.Validate(i, v[1])
121121
assert.True(t, err == nil || err.IsValid())
122-
err = validator.Validate(i, v[2])
122+
err, _ = validator.Validate(i, v[2])
123123
assert.True(t, err.HasErrors())
124124
assert.EqualError(t, maxErrorItems(path, validator.in, items), err.Errors[0].Error())
125125

126126
// ExclusiveMaximum
127127
items.ExclusiveMaximum = true
128128
// requires a new items validator because this is set a creation time
129129
validator = newItemsValidator(parent.Name, parent.In, items, parent, strfmt.Default)
130-
err = validator.Validate(i, v[1])
130+
err, _ = validator.Validate(i, v[1])
131131
assert.True(t, err.HasErrors())
132132
assert.EqualError(t, maxErrorItems(path, validator.in, items), err.Errors[0].Error())
133133

134134
// Minimum
135-
err = validator.Validate(i, v[3])
135+
err, _ = validator.Validate(i, v[3])
136136
assert.True(t, err == nil || err.IsValid())
137-
err = validator.Validate(i, v[4])
137+
err, _ = validator.Validate(i, v[4])
138138
assert.True(t, err.HasErrors())
139139
assert.EqualError(t, minErrorItems(path, validator.in, items), err.Errors[0].Error())
140140

141141
// ExclusiveMinimum
142142
items.ExclusiveMinimum = true
143143
// requires a new items validator because this is set a creation time
144144
validator = newItemsValidator(parent.Name, parent.In, items, parent, strfmt.Default)
145-
err = validator.Validate(i, v[3])
145+
err, _ = validator.Validate(i, v[3])
146146
assert.True(t, err.HasErrors())
147147
assert.EqualError(t, minErrorItems(path, validator.in, items), err.Errors[0].Error())
148148

149149
// Enum
150-
err = validator.Validate(i, v[5])
150+
err, _ = validator.Validate(i, v[5])
151151
assert.True(t, err.HasErrors())
152152
assert.EqualError(t, enumFailItems(path, validator.in, items, v[5]), err.Errors[0].Error())
153153

154154
// Valid passes
155-
err = validator.Validate(i, v[6])
155+
err, _ = validator.Validate(i, v[6])
156156
assert.True(t, err == nil || err.IsValid())
157157
}
158158

@@ -166,32 +166,32 @@ func TestStringItemsValidation(t *testing.T) {
166166
validator := newItemsValidator(parent.Name, parent.In, items, parent, strfmt.Default)
167167

168168
// required
169-
err := validator.Validate(1, "")
169+
err, _ := validator.Validate(1, "")
170170
assert.True(t, err.HasErrors())
171171
assert.EqualError(t, minLengthErrorItems(path, validator.in, items), err.Errors[0].Error())
172172

173173
// MaxLength
174-
err = validator.Validate(1, "abcdef")
174+
err, _ = validator.Validate(1, "abcdef")
175175
assert.True(t, err.HasErrors())
176176
assert.EqualError(t, maxLengthErrorItems(path, validator.in, items), err.Errors[0].Error())
177177

178178
// MinLength
179-
err = validator.Validate(1, "a")
179+
err, _ = validator.Validate(1, "a")
180180
assert.True(t, err.HasErrors())
181181
assert.EqualError(t, minLengthErrorItems(path, validator.in, items), err.Errors[0].Error())
182182

183183
// Pattern
184-
err = validator.Validate(1, "a394")
184+
err, _ = validator.Validate(1, "a394")
185185
assert.True(t, err.HasErrors())
186186
assert.EqualError(t, patternFailItems(path, validator.in, items), err.Errors[0].Error())
187187

188188
// Enum
189-
err = validator.Validate(1, "abcde")
189+
err, _ = validator.Validate(1, "abcde")
190190
assert.True(t, err.HasErrors())
191191
assert.EqualError(t, enumFailItems(path, validator.in, items, "abcde"), err.Errors[0].Error())
192192

193193
// Valid passes
194-
err = validator.Validate(1, "bbb")
194+
err, _ = validator.Validate(1, "bbb")
195195
assert.True(t, err == nil || err.IsValid())
196196
}
197197

@@ -203,20 +203,20 @@ func TestArrayItemsValidation(t *testing.T) {
203203
validator := newItemsValidator(parent.Name, parent.In, items, parent, strfmt.Default)
204204

205205
// MinItems
206-
err := validator.Validate(1, []string{})
206+
err, _ := validator.Validate(1, []string{})
207207
assert.True(t, err.HasErrors())
208208
assert.EqualError(t, minItemsErrorItems(path, validator.in, items), err.Errors[0].Error())
209209
// MaxItems
210-
err = validator.Validate(1, []string{"a", "b", "c", "d", "e", "f"})
210+
err, _ = validator.Validate(1, []string{"a", "b", "c", "d", "e", "f"})
211211
assert.True(t, err.HasErrors())
212212
assert.EqualError(t, maxItemsErrorItems(path, validator.in, items), err.Errors[0].Error())
213213
// UniqueItems
214-
err = validator.Validate(1, []string{"a", "a"})
214+
err, _ = validator.Validate(1, []string{"a", "a"})
215215
assert.True(t, err.HasErrors())
216216
assert.EqualError(t, duplicatesErrorItems(path, validator.in), err.Errors[0].Error())
217217

218218
// Enum
219-
err = validator.Validate(1, []string{"a", "b", "c"})
219+
err, _ = validator.Validate(1, []string{"a", "b", "c"})
220220
assert.True(t, err.HasErrors())
221221
assert.EqualError(t, enumFailItems(path, validator.in, items, []string{"a", "b", "c"}), err.Errors[0].Error())
222222

@@ -225,7 +225,7 @@ func TestArrayItemsValidation(t *testing.T) {
225225
items = spec.NewItems().CollectionOf(strItems, "").WithMinItems(1).WithMaxItems(5).UniqueValues()
226226
validator = newItemsValidator(parent.Name, parent.In, items, parent, strfmt.Default)
227227

228-
err = validator.Validate(1, []string{"aa", "bbb", "ccc"})
228+
err, _ = validator.Validate(1, []string{"aa", "bbb", "ccc"})
229229
assert.True(t, err.HasErrors())
230230
assert.EqualError(t, minLengthErrorItems(path+".0", parent.In, strItems), err.Errors[0].Error())
231231
}

0 commit comments

Comments
 (0)