Skip to content

Commit 1f680b5

Browse files
authored
feat: improve error reporting for bad/missing discriminator (#718)
1 parent 1490eae commit 1f680b5

File tree

2 files changed

+26
-7
lines changed

2 files changed

+26
-7
lines changed

openapi3/schema.go

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -922,16 +922,35 @@ func (schema *Schema) visitSetOperations(settings *schemaValidationSettings, val
922922
if valuemap, okcheck := value.(map[string]interface{}); okcheck {
923923
discriminatorVal, okcheck := valuemap[pn]
924924
if !okcheck {
925-
return errors.New("input does not contain the discriminator property")
925+
return &SchemaError{
926+
Schema: schema,
927+
SchemaField: "discriminator",
928+
Reason: fmt.Sprintf("input does not contain the discriminator property %q", pn),
929+
}
926930
}
927931

928932
discriminatorValString, okcheck := discriminatorVal.(string)
929933
if !okcheck {
930-
return errors.New("descriminator value is not a string")
934+
valStr := "null"
935+
if discriminatorVal != nil {
936+
valStr = fmt.Sprintf("%v", discriminatorVal)
937+
}
938+
939+
return &SchemaError{
940+
Value: discriminatorVal,
941+
Schema: schema,
942+
SchemaField: "discriminator",
943+
Reason: fmt.Sprintf("value of discriminator property %q is not a string: %v", pn, valStr),
944+
}
931945
}
932946

933947
if discriminatorRef, okcheck = schema.Discriminator.Mapping[discriminatorValString]; len(schema.Discriminator.Mapping) > 0 && !okcheck {
934-
return errors.New("input does not contain a valid discriminator value")
948+
return &SchemaError{
949+
Value: discriminatorVal,
950+
Schema: schema,
951+
SchemaField: "discriminator",
952+
Reason: fmt.Sprintf("discriminator property %q has invalid value: %q", pn, discriminatorVal),
953+
}
935954
}
936955
}
937956
}

openapi3/schema_oneOf_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ func TestVisitJSON_OneOf_MissingDiscriptorProperty(t *testing.T) {
8686
err = s.Components.Schemas["Animal"].Value.VisitJSON(map[string]interface{}{
8787
"name": "snoopy",
8888
})
89-
require.EqualError(t, err, "input does not contain the discriminator property")
89+
require.ErrorContains(t, err, "input does not contain the discriminator property \"$type\"\n")
9090
}
9191

9292
func TestVisitJSON_OneOf_MissingDiscriptorValue(t *testing.T) {
@@ -96,7 +96,7 @@ func TestVisitJSON_OneOf_MissingDiscriptorValue(t *testing.T) {
9696
"name": "snoopy",
9797
"$type": "snake",
9898
})
99-
require.EqualError(t, err, "input does not contain a valid discriminator value")
99+
require.ErrorContains(t, err, "discriminator property \"$type\" has invalid value: \"snake\"")
100100
}
101101

102102
func TestVisitJSON_OneOf_MissingField(t *testing.T) {
@@ -126,14 +126,14 @@ func TestVisitJSON_OneOf_BadDescriminatorType(t *testing.T) {
126126
"scratches": true,
127127
"$type": 1,
128128
})
129-
require.EqualError(t, err, "descriminator value is not a string")
129+
require.ErrorContains(t, err, "value of discriminator property \"$type\" is not a string: 1")
130130

131131
err = s.Components.Schemas["Animal"].Value.VisitJSON(map[string]interface{}{
132132
"name": "snoopy",
133133
"barks": true,
134134
"$type": nil,
135135
})
136-
require.EqualError(t, err, "descriminator value is not a string")
136+
require.ErrorContains(t, err, "value of discriminator property \"$type\" is not a string: null")
137137
}
138138

139139
func TestVisitJSON_OneOf_Path(t *testing.T) {

0 commit comments

Comments
 (0)