gitlab-grape-swagger 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.coveralls.yml +1 -0
- data/.github/dependabot.yml +20 -0
- data/.github/workflows/ci.yml +45 -0
- data/.gitignore +44 -0
- data/.gitlab-ci.yml +19 -0
- data/.rspec +3 -0
- data/.rubocop.yml +136 -0
- data/.rubocop_todo.yml +60 -0
- data/.ruby-gemset +1 -0
- data/CHANGELOG.md +671 -0
- data/CONTRIBUTING.md +126 -0
- data/Dangerfile +3 -0
- data/Gemfile +45 -0
- data/Gemfile.lock +249 -0
- data/LICENSE.txt +20 -0
- data/README.md +1772 -0
- data/RELEASING.md +82 -0
- data/Rakefile +20 -0
- data/UPGRADING.md +201 -0
- data/example/api/endpoints.rb +131 -0
- data/example/api/entities.rb +18 -0
- data/example/config.ru +42 -0
- data/example/example_requests.postman_collection +146 -0
- data/example/splines.png +0 -0
- data/example/swagger-example.png +0 -0
- data/grape-swagger.gemspec +23 -0
- data/lib/grape-swagger/doc_methods/build_model_definition.rb +68 -0
- data/lib/grape-swagger/doc_methods/data_type.rb +110 -0
- data/lib/grape-swagger/doc_methods/extensions.rb +101 -0
- data/lib/grape-swagger/doc_methods/file_params.rb +17 -0
- data/lib/grape-swagger/doc_methods/format_data.rb +53 -0
- data/lib/grape-swagger/doc_methods/headers.rb +20 -0
- data/lib/grape-swagger/doc_methods/move_params.rb +209 -0
- data/lib/grape-swagger/doc_methods/operation_id.rb +32 -0
- data/lib/grape-swagger/doc_methods/optional_object.rb +30 -0
- data/lib/grape-swagger/doc_methods/parse_params.rb +190 -0
- data/lib/grape-swagger/doc_methods/path_string.rb +52 -0
- data/lib/grape-swagger/doc_methods/produces_consumes.rb +15 -0
- data/lib/grape-swagger/doc_methods/status_codes.rb +21 -0
- data/lib/grape-swagger/doc_methods/tag_name_description.rb +34 -0
- data/lib/grape-swagger/doc_methods/version.rb +20 -0
- data/lib/grape-swagger/doc_methods.rb +142 -0
- data/lib/grape-swagger/endpoint/params_parser.rb +76 -0
- data/lib/grape-swagger/endpoint.rb +476 -0
- data/lib/grape-swagger/errors.rb +17 -0
- data/lib/grape-swagger/instance.rb +7 -0
- data/lib/grape-swagger/model_parsers.rb +42 -0
- data/lib/grape-swagger/rake/oapi_tasks.rb +135 -0
- data/lib/grape-swagger/version.rb +5 -0
- data/lib/grape-swagger.rb +174 -0
- data/spec/issues/267_nested_namespaces.rb +55 -0
- data/spec/issues/403_versions_spec.rb +124 -0
- data/spec/issues/427_entity_as_string_spec.rb +39 -0
- data/spec/issues/430_entity_definitions_spec.rb +94 -0
- data/spec/issues/532_allow_custom_format_spec.rb +42 -0
- data/spec/issues/533_specify_status_code_spec.rb +78 -0
- data/spec/issues/537_enum_values_spec.rb +50 -0
- data/spec/issues/539_array_post_body_spec.rb +65 -0
- data/spec/issues/542_array_of_type_in_post_body_spec.rb +46 -0
- data/spec/issues/553_align_array_put_post_params_spec.rb +152 -0
- data/spec/issues/572_array_post_body_spec.rb +51 -0
- data/spec/issues/579_align_put_post_parameters_spec.rb +185 -0
- data/spec/issues/582_file_response_spec.rb +55 -0
- data/spec/issues/587_range_parameter_delimited_by_dash_spec.rb +26 -0
- data/spec/issues/605_root_route_documentation_spec.rb +23 -0
- data/spec/issues/650_params_array_spec.rb +65 -0
- data/spec/issues/677_consumes_produces_add_swagger_documentation_options_spec.rb +100 -0
- data/spec/issues/680_keep_204_error_schemas_spec.rb +55 -0
- data/spec/issues/721_set_default_parameter_location_based_on_consumes_spec.rb +62 -0
- data/spec/issues/751_deeply_nested_objects_spec.rb +190 -0
- data/spec/issues/776_multiple_presents_spec.rb +59 -0
- data/spec/issues/784_extensions_on_params_spec.rb +42 -0
- data/spec/issues/809_utf8_routes_spec.rb +55 -0
- data/spec/issues/832_array_hash_float_decimal_spec.rb +114 -0
- data/spec/issues/847_route_param_options_spec.rb +37 -0
- data/spec/issues/873_wildcard_segments_path_parameters_spec.rb +28 -0
- data/spec/issues/878_optional_path_segments_spec.rb +29 -0
- data/spec/issues/881_handle_file_params_spec.rb +38 -0
- data/spec/issues/883_query_array_parameter_spec.rb +46 -0
- data/spec/issues/884_dont_document_non_schema_examples_spec.rb +49 -0
- data/spec/issues/887_prevent_duplicate_operation_ids_spec.rb +35 -0
- data/spec/lib/data_type_spec.rb +111 -0
- data/spec/lib/endpoint/params_parser_spec.rb +124 -0
- data/spec/lib/endpoint_spec.rb +153 -0
- data/spec/lib/extensions_spec.rb +185 -0
- data/spec/lib/format_data_spec.rb +115 -0
- data/spec/lib/model_parsers_spec.rb +104 -0
- data/spec/lib/move_params_spec.rb +444 -0
- data/spec/lib/oapi_tasks_spec.rb +163 -0
- data/spec/lib/operation_id_spec.rb +55 -0
- data/spec/lib/optional_object_spec.rb +47 -0
- data/spec/lib/parse_params_spec.rb +68 -0
- data/spec/lib/path_string_spec.rb +101 -0
- data/spec/lib/produces_consumes_spec.rb +116 -0
- data/spec/lib/tag_name_description_spec.rb +80 -0
- data/spec/lib/version_spec.rb +28 -0
- data/spec/spec_helper.rb +39 -0
- data/spec/support/empty_model_parser.rb +23 -0
- data/spec/support/grape_version.rb +13 -0
- data/spec/support/mock_parser.rb +23 -0
- data/spec/support/model_parsers/entity_parser.rb +334 -0
- data/spec/support/model_parsers/mock_parser.rb +346 -0
- data/spec/support/model_parsers/representable_parser.rb +406 -0
- data/spec/support/namespace_tags.rb +93 -0
- data/spec/support/the_paths_definitions.rb +109 -0
- data/spec/swagger_v2/api_documentation_spec.rb +42 -0
- data/spec/swagger_v2/api_swagger_v2_additional_properties_spec.rb +83 -0
- data/spec/swagger_v2/api_swagger_v2_body_definitions_spec.rb +48 -0
- data/spec/swagger_v2/api_swagger_v2_definitions-models_spec.rb +36 -0
- data/spec/swagger_v2/api_swagger_v2_detail_spec.rb +79 -0
- data/spec/swagger_v2/api_swagger_v2_extensions_spec.rb +145 -0
- data/spec/swagger_v2/api_swagger_v2_format-content_type_spec.rb +137 -0
- data/spec/swagger_v2/api_swagger_v2_global_configuration_spec.rb +56 -0
- data/spec/swagger_v2/api_swagger_v2_hash_and_array_spec.rb +64 -0
- data/spec/swagger_v2/api_swagger_v2_headers_spec.rb +58 -0
- data/spec/swagger_v2/api_swagger_v2_hide_documentation_path_spec.rb +57 -0
- data/spec/swagger_v2/api_swagger_v2_hide_param_spec.rb +109 -0
- data/spec/swagger_v2/api_swagger_v2_ignore_defaults_spec.rb +48 -0
- data/spec/swagger_v2/api_swagger_v2_mounted_spec.rb +153 -0
- data/spec/swagger_v2/api_swagger_v2_param_type_body_nested_spec.rb +355 -0
- data/spec/swagger_v2/api_swagger_v2_param_type_body_spec.rb +217 -0
- data/spec/swagger_v2/api_swagger_v2_param_type_spec.rb +247 -0
- data/spec/swagger_v2/api_swagger_v2_request_params_fix_spec.rb +80 -0
- data/spec/swagger_v2/api_swagger_v2_response_spec.rb +147 -0
- data/spec/swagger_v2/api_swagger_v2_response_with_examples_spec.rb +135 -0
- data/spec/swagger_v2/api_swagger_v2_response_with_headers_spec.rb +216 -0
- data/spec/swagger_v2/api_swagger_v2_response_with_models_spec.rb +53 -0
- data/spec/swagger_v2/api_swagger_v2_response_with_root_spec.rb +153 -0
- data/spec/swagger_v2/api_swagger_v2_spec.rb +245 -0
- data/spec/swagger_v2/api_swagger_v2_status_codes_spec.rb +93 -0
- data/spec/swagger_v2/api_swagger_v2_type-format_spec.rb +90 -0
- data/spec/swagger_v2/boolean_params_spec.rb +38 -0
- data/spec/swagger_v2/default_api_spec.rb +175 -0
- data/spec/swagger_v2/deprecated_field_spec.rb +25 -0
- data/spec/swagger_v2/description_not_initialized_spec.rb +39 -0
- data/spec/swagger_v2/endpoint_versioned_path_spec.rb +130 -0
- data/spec/swagger_v2/errors_spec.rb +77 -0
- data/spec/swagger_v2/float_api_spec.rb +36 -0
- data/spec/swagger_v2/form_params_spec.rb +76 -0
- data/spec/swagger_v2/grape-swagger_spec.rb +17 -0
- data/spec/swagger_v2/guarded_endpoint_spec.rb +162 -0
- data/spec/swagger_v2/hide_api_spec.rb +147 -0
- data/spec/swagger_v2/host_spec.rb +43 -0
- data/spec/swagger_v2/inheritance_and_discriminator_spec.rb +57 -0
- data/spec/swagger_v2/mount_override_api_spec.rb +58 -0
- data/spec/swagger_v2/mounted_target_class_spec.rb +76 -0
- data/spec/swagger_v2/namespace_tags_prefix_spec.rb +122 -0
- data/spec/swagger_v2/namespace_tags_spec.rb +78 -0
- data/spec/swagger_v2/namespaced_api_spec.rb +121 -0
- data/spec/swagger_v2/nicknamed_api_spec.rb +25 -0
- data/spec/swagger_v2/operation_id_api_spec.rb +27 -0
- data/spec/swagger_v2/param_multi_type_spec.rb +82 -0
- data/spec/swagger_v2/param_type_spec.rb +95 -0
- data/spec/swagger_v2/param_values_spec.rb +180 -0
- data/spec/swagger_v2/params_array_collection_format_spec.rb +105 -0
- data/spec/swagger_v2/params_array_spec.rb +225 -0
- data/spec/swagger_v2/params_example_spec.rb +38 -0
- data/spec/swagger_v2/params_hash_spec.rb +77 -0
- data/spec/swagger_v2/params_nested_spec.rb +92 -0
- data/spec/swagger_v2/parent_less_namespace_spec.rb +32 -0
- data/spec/swagger_v2/reference_entity_spec.rb +129 -0
- data/spec/swagger_v2/security_requirement_spec.rb +46 -0
- data/spec/swagger_v2/simple_mounted_api_spec.rb +332 -0
- data/spec/version_spec.rb +10 -0
- metadata +225 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
|
|
5
|
+
describe 'headers' do
|
|
6
|
+
include_context "#{MODEL_PARSER} swagger example"
|
|
7
|
+
|
|
8
|
+
before :all do
|
|
9
|
+
module TheApi
|
|
10
|
+
class HeadersApi < Grape::API
|
|
11
|
+
format :json
|
|
12
|
+
|
|
13
|
+
desc 'This returns something',
|
|
14
|
+
failure: [{ code: 400, model: Entities::ApiError }],
|
|
15
|
+
headers: {
|
|
16
|
+
'X-Rate-Limit-Limit' => {
|
|
17
|
+
'description' => 'The number of allowed requests in the current period',
|
|
18
|
+
'type' => 'integer'
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
|
|
22
|
+
entity: Entities::UseResponse
|
|
23
|
+
params do
|
|
24
|
+
optional :param_x, type: String, desc: 'This is a parameter', documentation: { param_type: 'query' }
|
|
25
|
+
end
|
|
26
|
+
get '/use_headers' do
|
|
27
|
+
{ 'declared_params' => declared(params) }
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
add_swagger_documentation
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def app
|
|
36
|
+
TheApi::HeadersApi
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
subject do
|
|
40
|
+
get '/swagger_doc'
|
|
41
|
+
JSON.parse(last_response.body)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
specify do
|
|
45
|
+
parameters = subject['paths']['/use_headers']['get']['parameters']
|
|
46
|
+
expect(parameters).to include(
|
|
47
|
+
'in' => 'header',
|
|
48
|
+
'name' => 'X-Rate-Limit-Limit',
|
|
49
|
+
'description' => 'The number of allowed requests in the current period',
|
|
50
|
+
'type' => 'integer',
|
|
51
|
+
'format' => 'int32',
|
|
52
|
+
'required' => false
|
|
53
|
+
)
|
|
54
|
+
expect(parameters.size).to eq(2)
|
|
55
|
+
expect(parameters.first['in']).to eq('header')
|
|
56
|
+
expect(parameters.last['in']).to eq('query')
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
|
|
5
|
+
describe 'hide documentation path' do
|
|
6
|
+
include_context "#{MODEL_PARSER} swagger example"
|
|
7
|
+
|
|
8
|
+
before :all do
|
|
9
|
+
module TheApi
|
|
10
|
+
class HideDocumentationApi < Grape::API
|
|
11
|
+
format :json
|
|
12
|
+
|
|
13
|
+
desc 'This returns something',
|
|
14
|
+
params: Entities::UseResponse.documentation,
|
|
15
|
+
failure: [{ code: 400, message: 'NotFound', model: Entities::ApiError }]
|
|
16
|
+
params do
|
|
17
|
+
requires :foo, type: Integer
|
|
18
|
+
end
|
|
19
|
+
get '/params_response' do
|
|
20
|
+
{ 'declared_params' => declared(params) }
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
desc 'This returns something',
|
|
24
|
+
entity: Entities::UseResponse,
|
|
25
|
+
failure: [{ code: 400, message: 'NotFound', model: Entities::ApiError }]
|
|
26
|
+
get '/entity_response' do
|
|
27
|
+
{ 'declared_params' => declared(params) }
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
desc 'This returns something',
|
|
31
|
+
failure: [{ code: 400, message: 'NotFound', model: Entities::ApiError }]
|
|
32
|
+
get '/present_response' do
|
|
33
|
+
foo = OpenStruct.new id: 1, name: 'bar'
|
|
34
|
+
something = OpenStruct.new description: 'something', item: foo
|
|
35
|
+
present :somethings, something, with: Entities::UseResponse
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
add_swagger_documentation hide_documentation_path: false
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def app
|
|
44
|
+
TheApi::HideDocumentationApi
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
describe 'shows documentation paths' do
|
|
48
|
+
subject do
|
|
49
|
+
get '/swagger_doc'
|
|
50
|
+
JSON.parse(last_response.body)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
specify do
|
|
54
|
+
expect(subject['paths'].keys).to include '/swagger_doc', '/swagger_doc/{name}'
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
|
|
5
|
+
describe 'hidden flag enables a single endpoint parameter to be excluded from the documentation' do
|
|
6
|
+
include_context "#{MODEL_PARSER} swagger example"
|
|
7
|
+
before :all do
|
|
8
|
+
module TheApi
|
|
9
|
+
class HideParamsApi < Grape::API
|
|
10
|
+
helpers do
|
|
11
|
+
def resource_owner
|
|
12
|
+
'123'
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
namespace :flat_params_endpoint do
|
|
17
|
+
desc 'This is a endpoint with a flat parameter hierarchy' do
|
|
18
|
+
consumes ['application/x-www-form-urlencoded']
|
|
19
|
+
end
|
|
20
|
+
params do
|
|
21
|
+
requires :name, type: String, documentation: { desc: 'name' }
|
|
22
|
+
optional :favourite_color, type: String, documentation: { desc: 'I should not be anywhere', hidden: true }
|
|
23
|
+
optional :proc_param, type: String, documentation: { desc: 'I should not be anywhere', hidden: proc { true } }
|
|
24
|
+
optional :proc_with_token, type: String, documentation: { desc: 'I may be somewhere', hidden: proc { false } }
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
post do
|
|
28
|
+
{ 'declared_params' => declared(params) }
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
namespace :nested_params_endpoint do
|
|
33
|
+
desc 'This is a endpoint with a nested parameter hierarchy' do
|
|
34
|
+
consumes ['application/x-www-form-urlencoded']
|
|
35
|
+
end
|
|
36
|
+
params do
|
|
37
|
+
optional :name, type: String, documentation: { desc: 'name' }
|
|
38
|
+
optional :hidden_attribute, type: Hash do
|
|
39
|
+
optional :favourite_color, type: String, documentation: { desc: 'I should not be anywhere', hidden: true }
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
optional :attributes, type: Hash do
|
|
43
|
+
optional :attribute_1, type: String, documentation: { desc: 'Attribute one' }
|
|
44
|
+
optional :hidden_attribute, type: String, documentation: { desc: 'I should not be anywhere', hidden: true }
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
post do
|
|
49
|
+
{ 'declared_params' => declared(params) }
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
namespace :required_param_endpoint do
|
|
54
|
+
desc 'This endpoint has hidden defined for a required parameter' do
|
|
55
|
+
consumes ['application/x-www-form-urlencoded']
|
|
56
|
+
end
|
|
57
|
+
params do
|
|
58
|
+
requires :name, type: String, documentation: { desc: 'name', hidden: true }
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
post do
|
|
62
|
+
{ 'declared_params' => declared(params) }
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
add_swagger_documentation token_owner: 'resource_owner'
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
let(:app) { TheApi::HideParamsApi }
|
|
72
|
+
|
|
73
|
+
describe 'simple flat parameter hierarchy' do
|
|
74
|
+
subject do
|
|
75
|
+
get '/swagger_doc/flat_params_endpoint'
|
|
76
|
+
JSON.parse(last_response.body)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it 'ignores parameters that are explicitly hidden' do
|
|
80
|
+
expect(subject['paths']['/flat_params_endpoint']['post']['parameters'].map { |p| p['name'] }).not_to include('favourite_color', 'proc_param')
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
it 'allows procs to consult the token_owner' do
|
|
84
|
+
expect(subject['paths']['/flat_params_endpoint']['post']['parameters'].map { |p| p['name'] }).to include('proc_with_token')
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
describe 'nested parameter hierarchy' do
|
|
89
|
+
subject do
|
|
90
|
+
get '/swagger_doc/nested_params_endpoint'
|
|
91
|
+
JSON.parse(last_response.body)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
specify do
|
|
95
|
+
expect(subject['paths']['/nested_params_endpoint']['post']['parameters'].map { |p| p['name'] }).not_to include(/hidden_attribute/)
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
describe 'hidden defined for required parameter' do
|
|
100
|
+
subject do
|
|
101
|
+
get '/swagger_doc/required_param_endpoint'
|
|
102
|
+
JSON.parse(last_response.body)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
specify do
|
|
106
|
+
expect(subject['paths']['/required_param_endpoint']['post']['parameters'].map { |p| p['name'] }).to include('name')
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
|
|
5
|
+
describe 'swagger spec v2.0' do
|
|
6
|
+
include_context "#{MODEL_PARSER} swagger example"
|
|
7
|
+
|
|
8
|
+
def app
|
|
9
|
+
Class.new(Grape::API) do
|
|
10
|
+
format :json
|
|
11
|
+
|
|
12
|
+
desc 'This creates Thing after a delay',
|
|
13
|
+
success: { code: 202, message: 'OK', model: Entities::Something }
|
|
14
|
+
params do
|
|
15
|
+
requires :text, type: String, documentation: { type: 'string', desc: 'Content of something.' }
|
|
16
|
+
requires :links, type: Array, documentation: { type: 'link', is_array: true }
|
|
17
|
+
end
|
|
18
|
+
post '/delay_thing' do
|
|
19
|
+
status 202
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
version 'v3', using: :path
|
|
23
|
+
add_swagger_documentation api_version: 'v1',
|
|
24
|
+
base_path: '/api',
|
|
25
|
+
info: {
|
|
26
|
+
title: 'The API title to be displayed on the API homepage.',
|
|
27
|
+
description: 'A description of the API.',
|
|
28
|
+
contact_name: 'Contact name',
|
|
29
|
+
contact_email: 'Contact@email.com',
|
|
30
|
+
contact_url: 'Contact URL',
|
|
31
|
+
license: 'The name of the license.',
|
|
32
|
+
license_url: 'www.The-URL-of-the-license.org',
|
|
33
|
+
terms_of_service_url: 'www.The-URL-of-the-terms-and-service.com'
|
|
34
|
+
}
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
before do
|
|
39
|
+
get '/v3/swagger_doc'
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
let(:json) { JSON.parse(last_response.body) }
|
|
43
|
+
|
|
44
|
+
it 'only returns one response if ignore_defaults is specified' do
|
|
45
|
+
expect(json['paths']['/delay_thing']['post']['responses']).to eq('202' => { 'description' => 'OK', 'schema' => { '$ref' => '#/definitions/Something' } })
|
|
46
|
+
expect(json['paths']['/delay_thing']['post']['responses'].keys).not_to include '201'
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
|
|
5
|
+
describe 'swagger spec v2.0' do
|
|
6
|
+
describe 'mounted APIs' do
|
|
7
|
+
include_context "#{MODEL_PARSER} swagger example"
|
|
8
|
+
|
|
9
|
+
def app
|
|
10
|
+
Class.new(Grape::API) do
|
|
11
|
+
format :json
|
|
12
|
+
|
|
13
|
+
# Thing stuff
|
|
14
|
+
desc 'This gets Things.' do
|
|
15
|
+
consumes ['application/x-www-form-urlencoded']
|
|
16
|
+
params Entities::Something.documentation
|
|
17
|
+
http_codes [{ code: 401, message: 'Unauthorized', model: Entities::ApiError }]
|
|
18
|
+
end
|
|
19
|
+
get '/thing' do
|
|
20
|
+
something = OpenStruct.new text: 'something'
|
|
21
|
+
present something, with: Entities::Something
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
desc 'This gets Things.' do
|
|
25
|
+
consumes ['application/x-www-form-urlencoded']
|
|
26
|
+
http_codes [
|
|
27
|
+
{ code: 200, message: 'get Horses', model: Entities::Something },
|
|
28
|
+
{ code: 401, message: 'HorsesOutError', model: Entities::ApiError }
|
|
29
|
+
]
|
|
30
|
+
end
|
|
31
|
+
get '/thing2' do
|
|
32
|
+
something = OpenStruct.new text: 'something'
|
|
33
|
+
present something, with: Entities::Something
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
desc 'This gets Thing.' do
|
|
37
|
+
consumes ['application/x-www-form-urlencoded']
|
|
38
|
+
http_codes [{ code: 200, message: 'getting a single thing' }, { code: 401, message: 'Unauthorized' }]
|
|
39
|
+
end
|
|
40
|
+
params do
|
|
41
|
+
requires :id, type: Integer
|
|
42
|
+
end
|
|
43
|
+
get '/thing/:id' do
|
|
44
|
+
something = OpenStruct.new text: 'something'
|
|
45
|
+
present something, with: Entities::Something
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
desc 'This creates Thing.',
|
|
49
|
+
consumes: ['application/x-www-form-urlencoded'],
|
|
50
|
+
success: Entities::Something
|
|
51
|
+
params do
|
|
52
|
+
requires :text, type: String, documentation: { type: 'string', desc: 'Content of something.' }
|
|
53
|
+
requires :links, type: Array, documentation: { type: 'link', is_array: true }
|
|
54
|
+
end
|
|
55
|
+
post '/thing', http_codes: [{ code: 422, message: 'Unprocessible Entity' }] do
|
|
56
|
+
something = OpenStruct.new text: 'something'
|
|
57
|
+
present something, with: Entities::Something
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
desc 'This updates Thing.',
|
|
61
|
+
consumes: ['application/x-www-form-urlencoded'],
|
|
62
|
+
success: Entities::Something
|
|
63
|
+
params do
|
|
64
|
+
requires :id, type: Integer
|
|
65
|
+
optional :text, type: String, desc: 'Content of something.'
|
|
66
|
+
optional :links, type: Array, documentation: { type: 'link', is_array: true }
|
|
67
|
+
end
|
|
68
|
+
put '/thing/:id' do
|
|
69
|
+
something = OpenStruct.new text: 'something'
|
|
70
|
+
present something, with: Entities::Something
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
desc 'This deletes Thing.',
|
|
74
|
+
consumes: ['application/x-www-form-urlencoded'],
|
|
75
|
+
entity: Entities::Something
|
|
76
|
+
params do
|
|
77
|
+
requires :id, type: Integer
|
|
78
|
+
end
|
|
79
|
+
delete '/thing/:id' do
|
|
80
|
+
something = OpenStruct.new text: 'something'
|
|
81
|
+
present something, with: Entities::Something
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
desc 'dummy route.',
|
|
85
|
+
consumes: ['application/x-www-form-urlencoded'],
|
|
86
|
+
failure: [{ code: 401, message: 'Unauthorized' }]
|
|
87
|
+
params do
|
|
88
|
+
requires :id, type: Integer
|
|
89
|
+
end
|
|
90
|
+
delete '/dummy/:id' do
|
|
91
|
+
{}
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
namespace :other_thing do
|
|
95
|
+
desc 'nested route inside namespace',
|
|
96
|
+
consumes: ['application/x-www-form-urlencoded'],
|
|
97
|
+
entity: Entities::QueryInput,
|
|
98
|
+
x: {
|
|
99
|
+
'amazon-apigateway-auth' => { type: 'none' },
|
|
100
|
+
'amazon-apigateway-integration' => { type: 'aws', uri: 'foo_bar_uri', httpMethod: 'get' }
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
params do
|
|
104
|
+
requires :elements, documentation: {
|
|
105
|
+
type: 'QueryInputElement',
|
|
106
|
+
desc: 'Set of configuration',
|
|
107
|
+
param_type: 'body',
|
|
108
|
+
is_array: true,
|
|
109
|
+
required: true
|
|
110
|
+
}
|
|
111
|
+
end
|
|
112
|
+
get '/:elements' do
|
|
113
|
+
present something, with: Entities::QueryInput
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
version 'v3', using: :path
|
|
118
|
+
add_swagger_documentation base_path: '/api',
|
|
119
|
+
info: {
|
|
120
|
+
title: 'The API title to be displayed on the API homepage.',
|
|
121
|
+
description: 'A description of the API.',
|
|
122
|
+
contact_name: 'Contact name',
|
|
123
|
+
contact_email: 'Contact@email.com',
|
|
124
|
+
contact_url: 'Contact URL',
|
|
125
|
+
license: 'The name of the license.',
|
|
126
|
+
license_url: 'www.The-URL-of-the-license.org',
|
|
127
|
+
terms_of_service_url: 'www.The-URL-of-the-terms-and-service.com'
|
|
128
|
+
}
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
mounted_paths.each do |expected_path|
|
|
133
|
+
describe "documents only #{expected_path} paths" do
|
|
134
|
+
let(:mount_path) { "/v3/swagger_doc#{expected_path}" }
|
|
135
|
+
subject do
|
|
136
|
+
get mount_path
|
|
137
|
+
JSON.parse(last_response.body)['paths']
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
specify do
|
|
141
|
+
unexpected_paths = mounted_paths - [expected_path]
|
|
142
|
+
subject.each_key do |path|
|
|
143
|
+
unexpected_paths.each do |unexpected_path|
|
|
144
|
+
expect(path).not_to start_with unexpected_path
|
|
145
|
+
end
|
|
146
|
+
expect(path).to start_with(expected_path).or include(expected_path)
|
|
147
|
+
expect(subject[path]).to eql swagger_json['paths'][path]
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
end
|