Skip to content

Commit e56a195

Browse files
authored
Fix validation of complex enum values (#647)
1 parent ac18113 commit e56a195

File tree

2 files changed

+44
-1
lines changed

2 files changed

+44
-1
lines changed

Diff for: openapi3/schema.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"fmt"
99
"math"
1010
"math/big"
11+
"reflect"
1112
"regexp"
1213
"sort"
1314
"strconv"
@@ -870,7 +871,7 @@ func (schema *Schema) visitJSON(settings *schemaValidationSettings, value interf
870871
func (schema *Schema) visitSetOperations(settings *schemaValidationSettings, value interface{}) (err error) {
871872
if enum := schema.Enum; len(enum) != 0 {
872873
for _, v := range enum {
873-
if value == v {
874+
if reflect.DeepEqual(v, value) {
874875
return
875876
}
876877
}

Diff for: openapi3/schema_test.go

+42
Original file line numberDiff line numberDiff line change
@@ -1314,3 +1314,45 @@ func TestValidationFailsOnInvalidPattern(t *testing.T) {
13141314
err := schema.Validate(context.Background())
13151315
require.Error(t, err)
13161316
}
1317+
1318+
func TestIssue646(t *testing.T) {
1319+
data := []byte(`
1320+
enum:
1321+
- 42
1322+
- []
1323+
- [a]
1324+
- {}
1325+
- {b: c}
1326+
`[1:])
1327+
1328+
var schema Schema
1329+
err := yaml.Unmarshal(data, &schema)
1330+
require.NoError(t, err)
1331+
1332+
err = schema.Validate(context.Background())
1333+
require.NoError(t, err)
1334+
1335+
err = schema.VisitJSON(42)
1336+
require.NoError(t, err)
1337+
1338+
err = schema.VisitJSON(1337)
1339+
require.Error(t, err)
1340+
1341+
err = schema.VisitJSON([]interface{}{})
1342+
require.NoError(t, err)
1343+
1344+
err = schema.VisitJSON([]interface{}{"a"})
1345+
require.NoError(t, err)
1346+
1347+
err = schema.VisitJSON([]interface{}{"b"})
1348+
require.Error(t, err)
1349+
1350+
err = schema.VisitJSON(map[string]interface{}{})
1351+
require.NoError(t, err)
1352+
1353+
err = schema.VisitJSON(map[string]interface{}{"b": "c"})
1354+
require.NoError(t, err)
1355+
1356+
err = schema.VisitJSON(map[string]interface{}{"d": "e"})
1357+
require.Error(t, err)
1358+
}

0 commit comments

Comments
 (0)