Skip to content

Commit be45f04

Browse files
committed
Require discriminator propertyName property
https://spec.openapis.org/oas/v3.1.0#discriminator-object > The expectation now is that a property with name petType MUST be present in the response payload It's a little unclear because the specification examples mostly specify the `propertyName` property under `required` as well, which seems redundant. It's probably safer this way, though, and the spec says "MUST" so we must.
1 parent 5c002fe commit be45f04

File tree

3 files changed

+10
-5
lines changed

3 files changed

+10
-5
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## [2.1.0] - XXXX-XX-XX
44

5+
### Bug Fixes
6+
7+
- Require discriminator `propertyName` property
8+
59
[2.1.0]: https://github.com/davishmcclurg/json_schemer/releases/tag/v2.1.0
610

711
## [2.0.0] - 2023-08-20

lib/json_schemer/openapi31/vocab/base.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ def validate(instance, instance_location, keyword_location, context)
4646
property_name = value.fetch('propertyName')
4747
mapping = value['mapping'] || {}
4848

49-
return result(instance, instance_location, keyword_location, true) unless instance.is_a?(Hash) && instance.key?(property_name)
49+
return result(instance, instance_location, keyword_location, true) unless instance.is_a?(Hash)
50+
return result(instance, instance_location, keyword_location, false) unless instance.key?(property_name)
5051

5152
property = instance.fetch(property_name)
5253
ref = mapping.fetch(property, property)

test/open_api_test.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ def test_discriminator_specification_example
205205
assert_equal([['enum', '/components/schemas/Cat/allOf/1/properties/huntingSkill']], schemer.validate(invalid_hunting_skill).map { |error| error.values_at('type', 'schema_pointer') })
206206
assert_equal([['required', '/components/schemas/Dog/allOf/1']], schemer.validate(missing_pack_size).map { |error| error.values_at('type', 'schema_pointer') })
207207
assert_equal([['format', '/components/schemas/Dog/allOf/1/properties/packSize']], schemer.validate(invalid_pack_size).map { |error| error.values_at('type', 'schema_pointer') })
208-
assert_equal([['required', '/components/schemas/Pet']], schemer.validate(missing_pet_type).map { |error| error.values_at('type', 'schema_pointer') })
208+
assert_equal([['required', '/components/schemas/Pet'], ['discriminator', '/components/schemas/Pet']], schemer.validate(missing_pet_type).map { |error| error.values_at('type', 'schema_pointer') })
209209
assert_equal([['required', '/components/schemas/Pet'], ['required', '/components/schemas/Cat/allOf/1']], schemer.validate(missing_name).map { |error| error.values_at('type', 'schema_pointer') })
210210
assert_raises(JSONSchemer::UnknownRef) { schemer.validate(invalid_pet_type) }
211211
end
@@ -404,7 +404,7 @@ def test_all_of_discriminator_subclass_schemas_work_on_their_own
404404
assert(schemer.valid?(CAT))
405405
assert(schemer.valid?(MISTY))
406406
assert_equal(['/components/schemas/Cat/allOf/1/properties/name'], schemer.validate(INVALID_CAT).map { |error| error.fetch('schema_pointer') })
407-
assert_equal([['required', '/components/schemas/Pet']], schemer.validate({}).map { |error| error.values_at('type', 'schema_pointer') })
407+
assert_equal([['required', '/components/schemas/Pet'], ['discriminator', '/components/schemas/Pet']], schemer.validate({}).map { |error| error.values_at('type', 'schema_pointer') })
408408
end
409409

410410
def test_all_of_discriminator_with_non_discriminator_ref
@@ -444,7 +444,7 @@ def test_all_of_discriminator_with_non_discriminator_ref
444444
refute(schemer.valid?(CAT))
445445
assert(schemer.valid?(CAT.merge('other' => 'y')))
446446
assert_equal(['/components/schemas/Other', '/components/schemas/Cat/allOf/2/properties/name'], schemer.validate(INVALID_CAT).map { |error| error.fetch('schema_pointer') })
447-
assert_equal([['required', '/components/schemas/Pet'], ['required', '/components/schemas/Other']], schemer.validate({}).map { |error| error.values_at('type', 'schema_pointer') })
447+
assert_equal([['required', '/components/schemas/Pet'], ['discriminator', '/components/schemas/Pet'], ['required', '/components/schemas/Other']], schemer.validate({}).map { |error| error.values_at('type', 'schema_pointer') })
448448
end
449449

450450
def test_any_of_discriminator_without_matching_schema
@@ -597,7 +597,7 @@ def test_non_json_pointer_discriminator
597597
def test_discriminator_non_object_and_missing_property_name
598598
schemer = JSONSchemer.schema({ 'discriminator' => { 'propertyName' => 'x' } }, :meta_schema => JSONSchemer.openapi31)
599599
assert(schemer.valid?(1))
600-
assert(schemer.valid?({ 'y' => 'z' }))
600+
refute(schemer.valid?({ 'y' => 'z' }))
601601
end
602602

603603
def test_openapi31_formats

0 commit comments

Comments
 (0)