Skip to content

Commit 1b4f211

Browse files
committed
OAS3 requestBody to include all defined parameters
1 parent a60933d commit 1b4f211

File tree

1 file changed

+20
-1
lines changed

1 file changed

+20
-1
lines changed

lib/rspec_api_documentation/writers/open_api_writer.rb

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,9 +208,14 @@ def extract_request_body(example)
208208
body = example.requests.map { |req| JSON.parse(req[:request_body]) rescue nil }.compact.reduce({}, :merge)
209209
return nil if body.empty?
210210

211+
schema = get_schema(body)
212+
example.extended_parameters.select { |p| p[:in].nil? }.each do |parameter|
213+
inject_body_parameter(schema, parameter)
214+
end
215+
211216
OpenApi::RequestBody.new(
212217
content: {
213-
'application/json' => OpenApi::Media.new(schema: get_schema(body), example: body)
218+
'application/json' => OpenApi::Media.new(schema: schema, example: body)
214219
}
215220
)
216221
end
@@ -255,6 +260,20 @@ def extract_known_parameters(parameters)
255260
parameters.select { |parameter| %w(query path header cookie).include?(parameter[:in].to_s) }
256261
.map { |parameter| extract_parameter(parameter) }
257262
end
263+
264+
def inject_body_parameter(schema, parameter)
265+
scope = schema
266+
parameter[:scope] && Array(parameter[:scope]).each do |curr|
267+
scope.properties[curr.to_s] ||= OpenApi::Schema.new(type: 'object', properties: {})
268+
scope = scope.properties[curr.to_s]
269+
end
270+
271+
scope.required ||= []
272+
scope.required << parameter[:name].to_s if parameter[:required]
273+
274+
scope.properties[parameter[:name].to_s] ||= get_schema(parameter[:value])
275+
scope.properties[parameter[:name].to_s].description = parameter[:description] if parameter[:description]
276+
end
258277
end
259278

260279
class OpenApiExample

0 commit comments

Comments
 (0)