Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

- OpenapiFirst::Test.report_coverage now includes fractional digits when returning a coverage value to avoid reporting "0% / no requests made" even though some requests have been made.
- Add option to skip certain responses in coverage calculation
- Show details about invalid requests / responses in coverage report

## 2.4.0

Expand Down
4 changes: 3 additions & 1 deletion lib/openapi_first/test/coverage/request_task.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,15 @@ class RequestTask
def initialize(request_definition)
@request = request_definition
@requested = false
@last_error_message = nil
end

attr_reader :request
attr_reader :request, :last_error_message

def track(validated_request)
@requested = true
@valid ||= true if validated_request.valid?
@last_error_message = validated_request.error.exception_message unless validated_request.valid?
end

def requested?
Expand Down
4 changes: 3 additions & 1 deletion lib/openapi_first/test/coverage/response_task.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,15 @@ class ResponseTask
def initialize(response_definition)
@response = response_definition
@responded = false
@last_error_message = nil
end

attr_reader :response
attr_reader :response, :last_error_message

def track(validated_response)
@responded = true
@valid ||= true if validated_response.valid?
@last_error_message = validated_response.error.exception_message unless validated_response.valid?
end

def responded?
Expand Down
4 changes: 2 additions & 2 deletions lib/openapi_first/test/coverage/terminal_formatter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ def request_label(request)
def explain_unfinished_request(request)
return 'No requests tracked!' unless request.requested?

'All requests invalid!' unless request.any_valid_request?
"All requests invalid! (#{request.last_error_message.inspect})" unless request.any_valid_request?
end

def response_label(response)
Expand All @@ -97,7 +97,7 @@ def response_label(response)
def explain_unfinished_response(response)
return 'No responses tracked!' unless response.responded?

'All responses invalid!' unless response.any_valid_response?
"All responses invalid! (#{response.last_error_message.inspect})" unless response.any_valid_response?
end
end
end
Expand Down
31 changes: 31 additions & 0 deletions spec/test/coverage/plan_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,11 @@
oad.validate_request(request)
end

let(:invalid_request) do
request = Rack::Request.new(Rack::MockRequest.env_for('/stuff/2t4'))
oad.validate_request(request)
end

let(:valid_response) do
request = Rack::Request.new(Rack::MockRequest.env_for('/stuff/24'))
response = Rack::Response.new
Expand All @@ -58,6 +63,14 @@
oad.validate_response(request, response)
end

let(:invalid_response) do
request = Rack::Request.new(Rack::MockRequest.env_for('/stuff/24'))
response = Rack::Response.new
response.content_type = 'application/json'
response.write JSON.generate('foo')
oad.validate_response(request, response)
end

let(:valid_400_response) do
request = Rack::Request.new(Rack::MockRequest.env_for('/stuff/24'))
response = Rack::Response.new
Expand Down Expand Up @@ -85,6 +98,24 @@
expect(response.responded?).to be(true)
end

it 'stores details about invalid responses' do
plan.track_response(invalid_response)

response = plan.routes.first.responses.first
expect(response.responded?).to eq(true)
expect(response.any_valid_response?).to eq(false)
expect(response.last_error_message).to eq('Response body is invalid: value at root is not an object')
end

it 'stores details about invalid requests' do
plan.track_request(invalid_request)

request = plan.routes.first.requests.first
expect(request.requested?).to eq(true)
expect(request.any_valid_request?).to eq(false)
expect(request.last_error_message).to eq('Path segment is invalid: value at `/id` is not an integer')
end

it 'ignores unknown requests' do
request = Rack::Request.new(Rack::MockRequest.env_for('/unknown/24'))
plan.track_request(oad.validate_request(request))
Expand Down