From 991d6d5d87de61d131c841344a9dfa0431fb684c Mon Sep 17 00:00:00 2001 From: sasamuku Date: Thu, 21 Sep 2023 19:37:53 +0900 Subject: [PATCH] support for uniqueItems in array --- lib/openapi_parser/errors.rb | 11 +++++++++++ .../schema_validator/array_validator.rb | 9 +++++++++ .../schema_validator/array_validator_spec.rb | 15 ++++++++++++++- 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/lib/openapi_parser/errors.rb b/lib/openapi_parser/errors.rb index 8ffddd8..18fc93f 100644 --- a/lib/openapi_parser/errors.rb +++ b/lib/openapi_parser/errors.rb @@ -272,4 +272,15 @@ def message "#{@reference} #{@value.inspect} contains fewer than min items" end end + + class NotUniqueItems < OpenAPIError + def initialize(value, reference) + super(reference) + @value = value + end + + def message + "#{@reference} #{@value.inspect} contains duplicate items" + end + end end diff --git a/lib/openapi_parser/schema_validator/array_validator.rb b/lib/openapi_parser/schema_validator/array_validator.rb index b7ec082..71df390 100644 --- a/lib/openapi_parser/schema_validator/array_validator.rb +++ b/lib/openapi_parser/schema_validator/array_validator.rb @@ -8,6 +8,9 @@ def coerce_and_validate(value, schema, **_keyword_args) value, err = validate_max_min_items(value, schema) return [nil, err] if err + value, err = validate_unique_items(value, schema) + return [nil, err] if err + # array type have an schema in items property items_schema = schema.items coerced_values = value.map do |v| @@ -28,5 +31,11 @@ def validate_max_min_items(value, schema) [value, nil] end + + def validate_unique_items(value, schema) + return [nil, OpenAPIParser::NotUniqueItems.new(value, schema.object_reference)] if schema.uniqueItems && value.length != value.uniq.length + + [value, nil] + end end end diff --git a/spec/openapi_parser/schema_validator/array_validator_spec.rb b/spec/openapi_parser/schema_validator/array_validator_spec.rb index 5c36c35..b44a234 100644 --- a/spec/openapi_parser/schema_validator/array_validator_spec.rb +++ b/spec/openapi_parser/schema_validator/array_validator_spec.rb @@ -19,7 +19,8 @@ type: 'array', items: { 'type': 'integer' }, maxItems: 2, - minItems: 1 + minItems: 1, + uniqueItems: true }, } end @@ -53,6 +54,18 @@ end end end + + context 'unique items breached' do + let(:invalid_array) { [1, 1] } + let(:params) { { 'ids' => invalid_array } } + + it do + expect { subject }.to raise_error do |e| + expect(e).to be_kind_of(OpenAPIParser::NotUniqueItems) + expect(e.message).to end_with("#{invalid_array} contains duplicate items") + end + end + end end end end