diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f37ee2b..1ad5f5f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +- Return uniqe errors in default error responses + ## 3.1.0 ### openapi_first/test diff --git a/lib/openapi_first/error_responses/default.rb b/lib/openapi_first/error_responses/default.rb index 02ee5fd2..0cc18c95 100644 --- a/lib/openapi_first/error_responses/default.rb +++ b/lib/openapi_first/error_responses/default.rb @@ -48,7 +48,7 @@ def errors key => pointer(error.data_pointer), code: error.type } - end + end.uniq end def pointer_key diff --git a/lib/openapi_first/error_responses/jsonapi.rb b/lib/openapi_first/error_responses/jsonapi.rb index 8c512f33..2cb629cb 100644 --- a/lib/openapi_first/error_responses/jsonapi.rb +++ b/lib/openapi_first/error_responses/jsonapi.rb @@ -27,7 +27,7 @@ def serialized_errors title: error.message, code: error.type } - end + end.uniq end def default_errors diff --git a/spec/error_responses/default_spec.rb b/spec/error_responses/default_spec.rb index c0a839f1..c4da81c8 100644 --- a/spec/error_responses/default_spec.rb +++ b/spec/error_responses/default_spec.rb @@ -77,6 +77,32 @@ end end + context 'with duplicated errors' do + subject(:error_response) do + error = instance_double(OpenapiFirst::Schema::ValidationError, message: 'hey', data_pointer: '/data', type: 'fail') + described_class.new( + failure: OpenapiFirst::Failure.new( + :invalid_body, + errors: [error, error] + ) + ) + end + + it 'returns unique errors' do + response = Rack::MockResponse[*error_response.render] + expect(response.status).to eq(400) + expect(JSON.parse(response.body, symbolize_names: true).fetch(:errors)).to eq( + [ + { + message: 'hey', + pointer: '/data', + code: 'fail' + } + ] + ) + end + end + context 'with invalid query parameter' do let(:schema) do { diff --git a/spec/error_responses/jsonapi_spec.rb b/spec/error_responses/jsonapi_spec.rb index 737c768b..1685c903 100644 --- a/spec/error_responses/jsonapi_spec.rb +++ b/spec/error_responses/jsonapi_spec.rb @@ -17,6 +17,34 @@ expect(response.content_type).to eq 'application/vnd.api+json' end + context 'with duplicated errors' do + subject(:error_response) do + error = instance_double(OpenapiFirst::Schema::ValidationError, message: 'hey', data_pointer: '/data', type: 'fail') + described_class.new( + failure: OpenapiFirst::Failure.new( + :invalid_body, + errors: [error, error] + ) + ) + end + + it 'returns unique errors' do + response = Rack::MockResponse[*error_response.render] + expect(response.status).to eq(400) + expect(JSON.parse(response.body, symbolize_names: true).fetch(:errors)).to eq( + [ + { + title: 'hey', + source: { pointer: '/data' }, + code: 'fail', + status: '400' + + } + ] + ) + end + end + context 'with invalid body' do let(:schema) do {