Skip to content

Commit 7b1db39

Browse files
committed
Show details about invalid requests / responses in coverage report
1 parent ca5f0f2 commit 7b1db39

5 files changed

Lines changed: 40 additions & 4 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
- 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.
66
- Add option to skip certain responses in coverage calculation
7+
- Show details about invalid requests / responses in coverage report
78

89
## 2.4.0
910

lib/openapi_first/test/coverage/request_task.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,15 @@ class RequestTask
1414
def initialize(request_definition)
1515
@request = request_definition
1616
@requested = false
17+
@last_error_message = nil
1718
end
1819

19-
attr_reader :request
20+
attr_reader :request, :last_error_message
2021

2122
def track(validated_request)
2223
@requested = true
2324
@valid ||= true if validated_request.valid?
25+
@last_error_message = validated_request.error.exception_message unless validated_request.valid?
2426
end
2527

2628
def requested?

lib/openapi_first/test/coverage/response_task.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,15 @@ class ResponseTask
1414
def initialize(response_definition)
1515
@response = response_definition
1616
@responded = false
17+
@last_error_message = nil
1718
end
1819

19-
attr_reader :response
20+
attr_reader :response, :last_error_message
2021

2122
def track(validated_response)
2223
@responded = true
2324
@valid ||= true if validated_response.valid?
25+
@last_error_message = validated_response.error.exception_message unless validated_response.valid?
2426
end
2527

2628
def responded?

lib/openapi_first/test/coverage/terminal_formatter.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ def request_label(request)
8484
def explain_unfinished_request(request)
8585
return 'No requests tracked!' unless request.requested?
8686

87-
'All requests invalid!' unless request.any_valid_request?
87+
"All requests invalid! (#{request.last_error_message.inspect})" unless request.any_valid_request?
8888
end
8989

9090
def response_label(response)
@@ -97,7 +97,7 @@ def response_label(response)
9797
def explain_unfinished_response(response)
9898
return 'No responses tracked!' unless response.responded?
9999

100-
'All responses invalid!' unless response.any_valid_response?
100+
"All responses invalid! (#{response.last_error_message.inspect})" unless response.any_valid_response?
101101
end
102102
end
103103
end

spec/test/coverage/plan_spec.rb

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@
5050
oad.validate_request(request)
5151
end
5252

53+
let(:invalid_request) do
54+
request = Rack::Request.new(Rack::MockRequest.env_for('/stuff/2t4'))
55+
oad.validate_request(request)
56+
end
57+
5358
let(:valid_response) do
5459
request = Rack::Request.new(Rack::MockRequest.env_for('/stuff/24'))
5560
response = Rack::Response.new
@@ -58,6 +63,14 @@
5863
oad.validate_response(request, response)
5964
end
6065

66+
let(:invalid_response) do
67+
request = Rack::Request.new(Rack::MockRequest.env_for('/stuff/24'))
68+
response = Rack::Response.new
69+
response.content_type = 'application/json'
70+
response.write JSON.generate('foo')
71+
oad.validate_response(request, response)
72+
end
73+
6174
let(:valid_400_response) do
6275
request = Rack::Request.new(Rack::MockRequest.env_for('/stuff/24'))
6376
response = Rack::Response.new
@@ -85,6 +98,24 @@
8598
expect(response.responded?).to be(true)
8699
end
87100

101+
it 'stores details about invalid responses' do
102+
plan.track_response(invalid_response)
103+
104+
response = plan.routes.first.responses.first
105+
expect(response.responded?).to eq(true)
106+
expect(response.any_valid_response?).to eq(false)
107+
expect(response.last_error_message).to eq('Response body is invalid: value at root is not an object')
108+
end
109+
110+
it 'stores details about invalid requests' do
111+
plan.track_request(invalid_request)
112+
113+
request = plan.routes.first.requests.first
114+
expect(request.requested?).to eq(true)
115+
expect(request.any_valid_request?).to eq(false)
116+
expect(request.last_error_message).to eq('Path segment is invalid: value at `/id` is not an integer')
117+
end
118+
88119
it 'ignores unknown requests' do
89120
request = Rack::Request.new(Rack::MockRequest.env_for('/unknown/24'))
90121
plan.track_request(oad.validate_request(request))

0 commit comments

Comments
 (0)