diff --git a/openapi3/schema.go b/openapi3/schema.go index 4fcc864ac..4968feca0 100644 --- a/openapi3/schema.go +++ b/openapi3/schema.go @@ -25,6 +25,9 @@ var ( errSchema = errors.New("Input does not match the schema") + // ErrOneOfConflict is the SchemaError Origin when data matches more than one oneOf schema + ErrOneOfConflict = errors.New("input matches more than one oneOf schemas") + // ErrSchemaInputNaN may be returned when validating a number ErrSchemaInputNaN = errors.New("NaN is not allowed") // ErrSchemaInputInf may be returned when validating a number @@ -851,11 +854,15 @@ func (schema *Schema) visitSetOperations(settings *schemaValidationSettings, val if settings.failfast { return errSchema } - return &SchemaError{ + e := &SchemaError{ Value: value, Schema: schema, SchemaField: "oneOf", } + if ok > 1 { + e.Origin = ErrOneOfConflict + } + return e } } diff --git a/openapi3/schema_issue289_test.go b/openapi3/schema_issue289_test.go new file mode 100644 index 000000000..e4e4aad36 --- /dev/null +++ b/openapi3/schema_issue289_test.go @@ -0,0 +1,39 @@ +package openapi3 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestIssue289(t *testing.T) { + spec := []byte(`components: + schemas: + Server: + properties: + address: + oneOf: + - $ref: "#/components/schemas/ip-address" + - $ref: "#/components/schemas/domain-name" + name: + type: string + type: object + domain-name: + maxLength: 10 + minLength: 5 + pattern: "((([a-zA-Z0-9_]([a-zA-Z0-9\\-_]){0,61})?[a-zA-Z0-9]\\.)*([a-zA-Z0-9_]([a-zA-Z0-9\\-_]){0,61})?[a-zA-Z0-9]\\.?)|\\." + type: string + ip-address: + pattern: "^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$" + type: string +openapi: "3.0.1" +`) + + s, err := NewSwaggerLoader().LoadSwaggerFromData(spec) + require.NoError(t, err) + err = s.Components.Schemas["Server"].Value.VisitJSON(map[string]interface{}{ + "name": "kin-openapi", + "address": "127.0.0.1", + }) + require.EqualError(t, err, ErrOneOfConflict.Error()) +}