Skip to content

Commit

Permalink
openapi3: fix default values count even when disabled (#767) (#770)
Browse files Browse the repository at this point in the history
  • Loading branch information
orshlom authored Feb 14, 2023
1 parent 47d329d commit cb687bf
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 6 deletions.
90 changes: 90 additions & 0 deletions openapi3/issue767_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package openapi3_test

import (
"testing"

"github.com/stretchr/testify/require"

"github.com/getkin/kin-openapi/openapi3"
)

func TestIssue767(t *testing.T) {
t.Parallel()

tests := [...]struct {
name string
schema *openapi3.Schema
value map[string]interface{}
opts []openapi3.SchemaValidationOption
checkErr require.ErrorAssertionFunc
}{
{
name: "default values disabled should fail with minProps 1",
schema: openapi3.NewSchema().WithProperties(map[string]*openapi3.Schema{
"foo": {Type: "boolean", Default: true}}).WithMinProperties(1),
value: map[string]interface{}{},
opts: []openapi3.SchemaValidationOption{
openapi3.VisitAsRequest(),
},
checkErr: require.Error,
},
{
name: "default values enabled should pass with minProps 1",
schema: openapi3.NewSchema().WithProperties(map[string]*openapi3.Schema{
"foo": {Type: "boolean", Default: true}}).WithMinProperties(1),
value: map[string]interface{}{},
opts: []openapi3.SchemaValidationOption{
openapi3.VisitAsRequest(),
openapi3.DefaultsSet(func() {}),
},
checkErr: require.NoError,
},
{
name: "default values enabled should pass with minProps 2",
schema: openapi3.NewSchema().WithProperties(map[string]*openapi3.Schema{
"foo": {Type: "boolean", Default: true},
"bar": {Type: "boolean"},
}).WithMinProperties(2),
value: map[string]interface{}{"bar": false},
opts: []openapi3.SchemaValidationOption{
openapi3.VisitAsRequest(),
openapi3.DefaultsSet(func() {}),
},
checkErr: require.NoError,
},
{
name: "default values enabled should fail with maxProps 1",
schema: openapi3.NewSchema().WithProperties(map[string]*openapi3.Schema{
"foo": {Type: "boolean", Default: true},
"bar": {Type: "boolean"},
}).WithMaxProperties(1),
value: map[string]interface{}{"bar": false},
opts: []openapi3.SchemaValidationOption{
openapi3.VisitAsRequest(),
openapi3.DefaultsSet(func() {}),
},
checkErr: require.Error,
},
{
name: "default values disabled should pass with maxProps 1",
schema: openapi3.NewSchema().WithProperties(map[string]*openapi3.Schema{
"foo": {Type: "boolean", Default: true},
"bar": {Type: "boolean"},
}).WithMaxProperties(1),
value: map[string]interface{}{"bar": false},
opts: []openapi3.SchemaValidationOption{
openapi3.VisitAsRequest(),
},
checkErr: require.NoError,
},
}

for _, test := range tests {
test := test
t.Run(test.name, func(t *testing.T) {
t.Parallel()
err := test.schema.VisitJSON(test.value, test.opts...)
test.checkErr(t, err)
})
}
}
10 changes: 4 additions & 6 deletions openapi3/schema.go
Original file line number Diff line number Diff line change
Expand Up @@ -1789,12 +1789,10 @@ func (schema *Schema) visitJSONObject(settings *schemaValidationSettings, value
reqRO := settings.asreq && propSchema.Value.ReadOnly && !settings.readOnlyValidationDisabled
repWO := settings.asrep && propSchema.Value.WriteOnly && !settings.writeOnlyValidationDisabled

if value[propName] == nil {
if dlft := propSchema.Value.Default; dlft != nil && !reqRO && !repWO {
value[propName] = dlft
if f := settings.defaultsSet; f != nil {
settings.onceSettingDefaults.Do(f)
}
if f := settings.defaultsSet; f != nil && value[propName] == nil {
if dflt := propSchema.Value.Default; dflt != nil && !reqRO && !repWO {
value[propName] = dflt
settings.onceSettingDefaults.Do(f)
}
}

Expand Down

0 comments on commit cb687bf

Please sign in to comment.