Skip to content

Commit 4bb44a2

Browse files
authored
Fix failfast flag handling (#284)
1 parent f05a913 commit 4bb44a2

File tree

2 files changed

+46
-13
lines changed

2 files changed

+46
-13
lines changed

openapi3/schema.go

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -794,8 +794,6 @@ func (schema *Schema) visitJSON(settings *schemaValidationSettings, value interf
794794
}
795795

796796
func (schema *Schema) visitSetOperations(settings *schemaValidationSettings, value interface{}) (err error) {
797-
var oldfailfast bool
798-
799797
if enum := schema.Enum; len(enum) != 0 {
800798
for _, v := range enum {
801799
if value == v {
@@ -818,9 +816,12 @@ func (schema *Schema) visitSetOperations(settings *schemaValidationSettings, val
818816
if v == nil {
819817
return foundUnresolvedRef(ref.Ref)
820818
}
819+
var oldfailfast bool
821820
oldfailfast, settings.failfast = settings.failfast, true
822-
if err := v.visitJSON(settings, value); err == nil {
823-
if oldfailfast {
821+
err := v.visitJSON(settings, value)
822+
settings.failfast = oldfailfast
823+
if err == nil {
824+
if settings.failfast {
824825
return errSchema
825826
}
826827
return &SchemaError{
@@ -829,7 +830,6 @@ func (schema *Schema) visitSetOperations(settings *schemaValidationSettings, val
829830
SchemaField: "not",
830831
}
831832
}
832-
settings.failfast = oldfailfast
833833
}
834834

835835
if v := schema.OneOf; len(v) > 0 {
@@ -839,11 +839,13 @@ func (schema *Schema) visitSetOperations(settings *schemaValidationSettings, val
839839
if v == nil {
840840
return foundUnresolvedRef(item.Ref)
841841
}
842+
var oldfailfast bool
842843
oldfailfast, settings.failfast = settings.failfast, true
843-
if err := v.visitJSON(settings, value); err == nil {
844+
err := v.visitJSON(settings, value)
845+
settings.failfast = oldfailfast
846+
if err == nil {
844847
ok++
845848
}
846-
settings.failfast = oldfailfast
847849
}
848850
if ok != 1 {
849851
if settings.failfast {
@@ -864,12 +866,14 @@ func (schema *Schema) visitSetOperations(settings *schemaValidationSettings, val
864866
if v == nil {
865867
return foundUnresolvedRef(item.Ref)
866868
}
869+
var oldfailfast bool
867870
oldfailfast, settings.failfast = settings.failfast, true
868-
if err := v.visitJSON(settings, value); err == nil {
871+
err := v.visitJSON(settings, value)
872+
settings.failfast = oldfailfast
873+
if err == nil {
869874
ok = true
870875
break
871876
}
872-
settings.failfast = oldfailfast
873877
}
874878
if !ok {
875879
if settings.failfast {
@@ -888,9 +892,12 @@ func (schema *Schema) visitSetOperations(settings *schemaValidationSettings, val
888892
if v == nil {
889893
return foundUnresolvedRef(item.Ref)
890894
}
895+
var oldfailfast bool
891896
oldfailfast, settings.failfast = settings.failfast, false
892-
if err := v.visitJSON(settings, value); err != nil {
893-
if oldfailfast {
897+
err := v.visitJSON(settings, value)
898+
settings.failfast = oldfailfast
899+
if err != nil {
900+
if settings.failfast {
894901
return errSchema
895902
}
896903
return &SchemaError{
@@ -900,7 +907,6 @@ func (schema *Schema) visitSetOperations(settings *schemaValidationSettings, val
900907
Origin: err,
901908
}
902909
}
903-
settings.failfast = oldfailfast
904910
}
905911
return
906912
}
@@ -1494,7 +1500,7 @@ func (err *SchemaError) Error() string {
14941500
buf.WriteByte('/')
14951501
buf.WriteString(reversePath[i])
14961502
}
1497-
buf.WriteString(`":`)
1503+
buf.WriteString(`": `)
14981504
}
14991505
reason := err.Reason
15001506
if reason == "" {

openapi3/schema_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1192,3 +1192,30 @@ var schemaMultiErrorExamples = []schemaMultiErrorExample{
11921192
},
11931193
},
11941194
}
1195+
1196+
func TestIssue283(t *testing.T) {
1197+
const api = `
1198+
openapi: "3.0.1"
1199+
components:
1200+
schemas:
1201+
Test:
1202+
properties:
1203+
name:
1204+
type: string
1205+
ownerName:
1206+
not:
1207+
type: boolean
1208+
type: object
1209+
`
1210+
data := map[string]interface{}{
1211+
"name": "kin-openapi",
1212+
"ownerName": true,
1213+
}
1214+
s, err := NewSwaggerLoader().LoadSwaggerFromData([]byte(api))
1215+
require.NoError(t, err)
1216+
require.NotNil(t, s)
1217+
err = s.Components.Schemas["Test"].Value.VisitJSON(data)
1218+
require.NotNil(t, err)
1219+
require.NotEqual(t, errSchema, err)
1220+
require.Contains(t, err.Error(), `Error at "/ownerName": Doesn't match schema "not"`)
1221+
}

0 commit comments

Comments
 (0)