grape-swagger 1.6.1 → 2.0.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.
Files changed (132) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +11 -1
  3. data/README.md +1 -0
  4. data/grape-swagger.gemspec +5 -5
  5. data/lib/grape-swagger/doc_methods/extensions.rb +2 -1
  6. data/lib/grape-swagger/doc_methods/move_params.rb +1 -0
  7. data/lib/grape-swagger/endpoint.rb +1 -1
  8. data/lib/grape-swagger/version.rb +1 -1
  9. metadata +26 -129
  10. data/.coveralls.yml +0 -1
  11. data/.github/dependabot.yml +0 -20
  12. data/.github/workflows/ci.yml +0 -120
  13. data/.gitignore +0 -45
  14. data/.rspec +0 -3
  15. data/.rubocop.yml +0 -136
  16. data/.rubocop_todo.yml +0 -45
  17. data/Dangerfile +0 -3
  18. data/Gemfile +0 -43
  19. data/Rakefile +0 -20
  20. data/example/api/endpoints.rb +0 -131
  21. data/example/api/entities.rb +0 -18
  22. data/example/config.ru +0 -42
  23. data/example/example_requests.postman_collection +0 -146
  24. data/example/splines.png +0 -0
  25. data/example/swagger-example.png +0 -0
  26. data/spec/issues/267_nested_namespaces.rb +0 -55
  27. data/spec/issues/403_versions_spec.rb +0 -124
  28. data/spec/issues/427_entity_as_string_spec.rb +0 -39
  29. data/spec/issues/430_entity_definitions_spec.rb +0 -94
  30. data/spec/issues/532_allow_custom_format_spec.rb +0 -38
  31. data/spec/issues/533_specify_status_code_spec.rb +0 -78
  32. data/spec/issues/537_enum_values_spec.rb +0 -50
  33. data/spec/issues/539_array_post_body_spec.rb +0 -65
  34. data/spec/issues/542_array_of_type_in_post_body_spec.rb +0 -46
  35. data/spec/issues/553_align_array_put_post_params_spec.rb +0 -144
  36. data/spec/issues/572_array_post_body_spec.rb +0 -51
  37. data/spec/issues/579_align_put_post_parameters_spec.rb +0 -179
  38. data/spec/issues/582_file_response_spec.rb +0 -55
  39. data/spec/issues/587_range_parameter_delimited_by_dash_spec.rb +0 -26
  40. data/spec/issues/605_root_route_documentation_spec.rb +0 -23
  41. data/spec/issues/650_params_array_spec.rb +0 -59
  42. data/spec/issues/677_consumes_produces_add_swagger_documentation_options_spec.rb +0 -100
  43. data/spec/issues/680_keep_204_error_schemas_spec.rb +0 -55
  44. data/spec/issues/751_deeply_nested_objects_spec.rb +0 -190
  45. data/spec/issues/776_multiple_presents_spec.rb +0 -59
  46. data/spec/issues/784_extensions_on_params_spec.rb +0 -38
  47. data/spec/issues/809_utf8_routes_spec.rb +0 -55
  48. data/spec/issues/832_array_hash_float_decimal_spec.rb +0 -111
  49. data/spec/issues/847_route_param_options_spec.rb +0 -37
  50. data/spec/lib/data_type_spec.rb +0 -111
  51. data/spec/lib/endpoint/params_parser_spec.rb +0 -124
  52. data/spec/lib/endpoint_spec.rb +0 -153
  53. data/spec/lib/extensions_spec.rb +0 -185
  54. data/spec/lib/format_data_spec.rb +0 -115
  55. data/spec/lib/model_parsers_spec.rb +0 -104
  56. data/spec/lib/move_params_spec.rb +0 -444
  57. data/spec/lib/oapi_tasks_spec.rb +0 -163
  58. data/spec/lib/operation_id_spec.rb +0 -55
  59. data/spec/lib/optional_object_spec.rb +0 -47
  60. data/spec/lib/parse_params_spec.rb +0 -82
  61. data/spec/lib/path_string_spec.rb +0 -101
  62. data/spec/lib/produces_consumes_spec.rb +0 -116
  63. data/spec/lib/tag_name_description_spec.rb +0 -80
  64. data/spec/lib/version_spec.rb +0 -28
  65. data/spec/spec_helper.rb +0 -39
  66. data/spec/support/empty_model_parser.rb +0 -23
  67. data/spec/support/grape_version.rb +0 -13
  68. data/spec/support/mock_parser.rb +0 -23
  69. data/spec/support/model_parsers/entity_parser.rb +0 -334
  70. data/spec/support/model_parsers/mock_parser.rb +0 -346
  71. data/spec/support/model_parsers/representable_parser.rb +0 -406
  72. data/spec/support/namespace_tags.rb +0 -93
  73. data/spec/support/the_paths_definitions.rb +0 -109
  74. data/spec/swagger_v2/api_documentation_spec.rb +0 -26
  75. data/spec/swagger_v2/api_swagger_v2_additional_properties_spec.rb +0 -83
  76. data/spec/swagger_v2/api_swagger_v2_body_definitions_spec.rb +0 -48
  77. data/spec/swagger_v2/api_swagger_v2_definitions-models_spec.rb +0 -36
  78. data/spec/swagger_v2/api_swagger_v2_detail_spec.rb +0 -79
  79. data/spec/swagger_v2/api_swagger_v2_extensions_spec.rb +0 -145
  80. data/spec/swagger_v2/api_swagger_v2_format-content_type_spec.rb +0 -137
  81. data/spec/swagger_v2/api_swagger_v2_global_configuration_spec.rb +0 -56
  82. data/spec/swagger_v2/api_swagger_v2_hash_and_array_spec.rb +0 -64
  83. data/spec/swagger_v2/api_swagger_v2_headers_spec.rb +0 -58
  84. data/spec/swagger_v2/api_swagger_v2_hide_documentation_path_spec.rb +0 -57
  85. data/spec/swagger_v2/api_swagger_v2_hide_param_spec.rb +0 -103
  86. data/spec/swagger_v2/api_swagger_v2_ignore_defaults_spec.rb +0 -48
  87. data/spec/swagger_v2/api_swagger_v2_mounted_spec.rb +0 -145
  88. data/spec/swagger_v2/api_swagger_v2_param_type_body_nested_spec.rb +0 -355
  89. data/spec/swagger_v2/api_swagger_v2_param_type_body_spec.rb +0 -217
  90. data/spec/swagger_v2/api_swagger_v2_param_type_spec.rb +0 -239
  91. data/spec/swagger_v2/api_swagger_v2_request_params_fix_spec.rb +0 -72
  92. data/spec/swagger_v2/api_swagger_v2_response_spec.rb +0 -143
  93. data/spec/swagger_v2/api_swagger_v2_response_with_examples_spec.rb +0 -135
  94. data/spec/swagger_v2/api_swagger_v2_response_with_headers_spec.rb +0 -216
  95. data/spec/swagger_v2/api_swagger_v2_response_with_models_spec.rb +0 -55
  96. data/spec/swagger_v2/api_swagger_v2_response_with_root_spec.rb +0 -153
  97. data/spec/swagger_v2/api_swagger_v2_spec.rb +0 -237
  98. data/spec/swagger_v2/api_swagger_v2_status_codes_spec.rb +0 -93
  99. data/spec/swagger_v2/api_swagger_v2_type-format_spec.rb +0 -89
  100. data/spec/swagger_v2/boolean_params_spec.rb +0 -35
  101. data/spec/swagger_v2/default_api_spec.rb +0 -175
  102. data/spec/swagger_v2/deprecated_field_spec.rb +0 -25
  103. data/spec/swagger_v2/description_not_initialized_spec.rb +0 -39
  104. data/spec/swagger_v2/endpoint_versioned_path_spec.rb +0 -130
  105. data/spec/swagger_v2/errors_spec.rb +0 -77
  106. data/spec/swagger_v2/float_api_spec.rb +0 -33
  107. data/spec/swagger_v2/form_params_spec.rb +0 -67
  108. data/spec/swagger_v2/grape-swagger_spec.rb +0 -17
  109. data/spec/swagger_v2/guarded_endpoint_spec.rb +0 -162
  110. data/spec/swagger_v2/hide_api_spec.rb +0 -147
  111. data/spec/swagger_v2/host_spec.rb +0 -43
  112. data/spec/swagger_v2/inheritance_and_discriminator_spec.rb +0 -57
  113. data/spec/swagger_v2/mount_override_api_spec.rb +0 -58
  114. data/spec/swagger_v2/mounted_target_class_spec.rb +0 -76
  115. data/spec/swagger_v2/namespace_tags_prefix_spec.rb +0 -122
  116. data/spec/swagger_v2/namespace_tags_spec.rb +0 -78
  117. data/spec/swagger_v2/namespaced_api_spec.rb +0 -121
  118. data/spec/swagger_v2/nicknamed_api_spec.rb +0 -25
  119. data/spec/swagger_v2/operation_id_api_spec.rb +0 -27
  120. data/spec/swagger_v2/param_multi_type_spec.rb +0 -77
  121. data/spec/swagger_v2/param_type_spec.rb +0 -87
  122. data/spec/swagger_v2/param_values_spec.rb +0 -162
  123. data/spec/swagger_v2/params_array_collection_format_spec.rb +0 -105
  124. data/spec/swagger_v2/params_array_spec.rb +0 -203
  125. data/spec/swagger_v2/params_example_spec.rb +0 -40
  126. data/spec/swagger_v2/params_hash_spec.rb +0 -71
  127. data/spec/swagger_v2/params_nested_spec.rb +0 -86
  128. data/spec/swagger_v2/parent_less_namespace_spec.rb +0 -32
  129. data/spec/swagger_v2/reference_entity_spec.rb +0 -129
  130. data/spec/swagger_v2/security_requirement_spec.rb +0 -46
  131. data/spec/swagger_v2/simple_mounted_api_spec.rb +0 -326
  132. data/spec/version_spec.rb +0 -10
@@ -1,93 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe 'http status code behaviours' do
6
- include_context "#{MODEL_PARSER} swagger example"
7
-
8
- subject do
9
- get '/swagger_doc'
10
- JSON.parse(last_response.body)
11
- end
12
-
13
- context 'when non-default success codes are defined' do
14
- let(:app) do
15
- Class.new(Grape::API) do
16
- desc 'Has explicit success http_codes defined' do
17
- http_codes [{ code: 202, message: 'We got it!' },
18
- { code: 204, message: 'Or returned no content' },
19
- { code: 400, message: 'Bad request' }]
20
- end
21
-
22
- post '/accepting_endpoint' do
23
- 'We got the message!'
24
- end
25
- add_swagger_documentation
26
- end
27
- end
28
-
29
- it 'only includes the defined http_codes' do
30
- expect(subject['paths']['/accepting_endpoint']['post']['responses'].keys.sort).to eq(%w[202 204 400].sort)
31
- end
32
- end
33
-
34
- context 'when success and failures are defined' do
35
- let(:app) do
36
- Class.new(Grape::API) do
37
- desc 'Has explicit success http_codes defined' do
38
- success code: 202, model: Entities::UseResponse, message: 'a changed status code'
39
- failure [[400, 'Bad Request']]
40
- end
41
-
42
- post '/accepting_endpoint' do
43
- 'We got the message!'
44
- end
45
- add_swagger_documentation
46
- end
47
- end
48
-
49
- it 'only includes the defined http codes' do
50
- expect(subject['paths']['/accepting_endpoint']['post']['responses'].keys.sort).to eq(%w[202 400].sort)
51
- end
52
- end
53
-
54
- context 'when no success codes defined' do
55
- let(:app) do
56
- Class.new(Grape::API) do
57
- desc 'Has explicit error http_codes defined' do
58
- http_codes [{ code: 400, message: 'Error!' },
59
- { code: 404, message: 'Not found' }]
60
- end
61
-
62
- post '/error_endpoint' do
63
- 'We got the message!'
64
- end
65
- add_swagger_documentation
66
- end
67
- end
68
-
69
- it 'adds the success codes to the response' do
70
- expect(subject['paths']['/error_endpoint']['post']['responses'].keys.sort).to eq(%w[201 400 404].sort)
71
- end
72
- end
73
-
74
- context 'when success and error codes are defined' do
75
- let(:app) do
76
- Class.new(Grape::API) do
77
- desc 'Has success and error codes defined' do
78
- http_codes [{ code: 200, message: 'Found' },
79
- { code: 404, message: 'Not found' }]
80
- end
81
-
82
- get '/endpoint' do
83
- 'We got the message!'
84
- end
85
- add_swagger_documentation
86
- end
87
- end
88
-
89
- it 'adds the success codes and error codes to the response' do
90
- expect(subject['paths']['/endpoint']['get']['responses'].keys.sort).to eq(%w[200 404].sort)
91
- end
92
- end
93
- end
@@ -1,89 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- # mapping of parameter types
6
- # Grape -> Swagger (OpenApi)
7
- # (type format)
8
- # ---------------------------------------------------
9
- # Integer -> integer int32
10
- # Numeric -> integer int64
11
- # Float -> number float
12
- # BigDecimal -> number double
13
- # String -> string
14
- # Symbol -> string
15
- # Date -> string date
16
- # DateTime -> string date-time
17
- # Time -> string date-time
18
- # 'password' -> string password
19
- # 'email' -> string email
20
- # Boolean -> boolean
21
- # JSON -> json
22
- # Rack::Multipart::UploadedFile -> file
23
-
24
- describe 'type format settings' do
25
- include_context "#{MODEL_PARSER} swagger example"
26
-
27
- before :all do
28
- module TheApi
29
- class TypeFormatApi < Grape::API
30
- desc 'full set of request data types',
31
- success: Entities::TypedDefinition
32
-
33
- params do
34
- # grape supported data types
35
- requires :param_integer, type: Integer
36
- requires :param_long, type: Numeric
37
- requires :param_float, type: Float
38
- requires :param_double, type: BigDecimal
39
- optional :param_string, type: String
40
- optional :param_symbol, type: Symbol
41
- requires :param_date, type: Date
42
- requires :param_date_time, type: DateTime
43
- requires :param_time, type: Time
44
- optional :param_boolean, type: Boolean
45
- optional :param_file, type: File
46
- optional :param_json, type: JSON
47
- end
48
-
49
- post '/request_types' do
50
- { 'declared_params' => declared(params) }
51
- end
52
-
53
- add_swagger_documentation
54
- end
55
- end
56
- end
57
-
58
- def app
59
- TheApi::TypeFormatApi
60
- end
61
-
62
- subject do
63
- get '/swagger_doc/request_types'
64
- JSON.parse(last_response.body)
65
- end
66
-
67
- specify do
68
- expect(subject['paths']['/request_types']['post']['parameters']).to eql(
69
- [
70
- { 'in' => 'formData', 'name' => 'param_integer', 'required' => true, 'type' => 'integer', 'format' => 'int32' },
71
- { 'in' => 'formData', 'name' => 'param_long', 'required' => true, 'type' => 'integer', 'format' => 'int64' },
72
- { 'in' => 'formData', 'name' => 'param_float', 'required' => true, 'type' => 'number', 'format' => 'float' },
73
- { 'in' => 'formData', 'name' => 'param_double', 'required' => true, 'type' => 'number', 'format' => 'double' },
74
- { 'in' => 'formData', 'name' => 'param_string', 'required' => false, 'type' => 'string' },
75
- { 'in' => 'formData', 'name' => 'param_symbol', 'required' => false, 'type' => 'string' },
76
- { 'in' => 'formData', 'name' => 'param_date', 'required' => true, 'type' => 'string', 'format' => 'date' },
77
- { 'in' => 'formData', 'name' => 'param_date_time', 'required' => true, 'type' => 'string', 'format' => 'date-time' },
78
- { 'in' => 'formData', 'name' => 'param_time', 'required' => true, 'type' => 'string', 'format' => 'date-time' },
79
- { 'in' => 'formData', 'name' => 'param_boolean', 'required' => false, 'type' => 'boolean' },
80
- { 'in' => 'formData', 'name' => 'param_file', 'required' => false, 'type' => 'file' },
81
- { 'in' => 'formData', 'name' => 'param_json', 'required' => false, 'type' => 'json' }
82
- ]
83
- )
84
- end
85
-
86
- specify do
87
- expect(subject['definitions']['TypedDefinition']['properties']).to eql(swagger_typed_defintion)
88
- end
89
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe 'Boolean Params' do
6
- def app
7
- Class.new(Grape::API) do
8
- format :json
9
-
10
- params do
11
- requires :a_boolean, type: Grape::API::Boolean
12
- optional :another_boolean, type: Grape::API::Boolean, default: false
13
- end
14
- post :splines do
15
- { message: 'hi' }
16
- end
17
-
18
- add_swagger_documentation
19
- end
20
- end
21
-
22
- subject do
23
- get '/swagger_doc/splines'
24
- expect(last_response.status).to eq 200
25
- body = JSON.parse last_response.body
26
- body['paths']['/splines']['post']['parameters']
27
- end
28
-
29
- it 'converts boolean types' do
30
- expect(subject).to eq [
31
- { 'in' => 'formData', 'name' => 'a_boolean', 'type' => 'boolean', 'required' => true },
32
- { 'in' => 'formData', 'name' => 'another_boolean', 'type' => 'boolean', 'required' => false, 'default' => false }
33
- ]
34
- end
35
- end
@@ -1,175 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- # require 'grape_version'
5
-
6
- describe 'Default API' do
7
- context 'with no additional options' do
8
- def app
9
- Class.new(Grape::API) do
10
- format :json
11
- desc 'This gets something.'
12
- get '/something' do
13
- { bla: 'something' }
14
- end
15
- add_swagger_documentation
16
- end
17
- end
18
-
19
- subject do
20
- get '/swagger_doc'
21
- JSON.parse(last_response.body)
22
- end
23
-
24
- it 'documents api' do
25
- expect(subject).to eq(
26
- 'info' => { 'title' => 'API title', 'version' => '0.0.1' },
27
- 'swagger' => '2.0',
28
- 'produces' => ['application/json'],
29
- 'host' => 'example.org',
30
- 'tags' => [{ 'name' => 'something', 'description' => 'Operations about somethings' }],
31
- 'paths' => {
32
- '/something' => {
33
- 'get' => {
34
- 'description' => 'This gets something.',
35
- 'produces' => ['application/json'],
36
- 'tags' => ['something'],
37
- 'operationId' => 'getSomething',
38
- 'responses' => { '200' => { 'description' => 'This gets something.' } }
39
- }
40
- }
41
- }
42
- )
43
- end
44
-
45
- context 'path inside the apis array' do
46
- it 'starts with a forward slash' do
47
- subject['paths'].each do |path|
48
- expect(path.first).to start_with '/'
49
- end
50
- end
51
- end
52
- end
53
-
54
- context 'with additional option block given to desc', if: GrapeVersion.satisfy?('>= 0.12.0') do
55
- def app
56
- Class.new(Grape::API) do
57
- format :json
58
- desc 'This gets something.'
59
- get '/something' do
60
- { bla: 'something' }
61
- end
62
- add_swagger_documentation
63
- end
64
- end
65
-
66
- subject do
67
- get '/swagger_doc/something'
68
- JSON.parse(last_response.body)
69
- end
70
-
71
- it 'documents endpoint' do
72
- expect(subject).to eq('info' => { 'title' => 'API title', 'version' => '0.0.1' },
73
- 'swagger' => '2.0',
74
- 'produces' => ['application/json'],
75
- 'host' => 'example.org',
76
- 'tags' => [{ 'name' => 'something', 'description' => 'Operations about somethings' }],
77
- 'paths' => {
78
- '/something' => {
79
- 'get' => {
80
- 'description' => 'This gets something.',
81
- 'produces' => ['application/json'],
82
- 'tags' => ['something'],
83
- 'operationId' => 'getSomething',
84
- 'responses' => { '200' => { 'description' => 'This gets something.' } }
85
- }
86
- }
87
- })
88
- end
89
- end
90
-
91
- context 'with additional info' do
92
- def app
93
- Class.new(Grape::API) do
94
- format :json
95
- add_swagger_documentation info: {
96
- title: 'My API Title',
97
- description: 'A description of my API',
98
- license: 'Apache 2',
99
- license_url: 'http://test.com',
100
- terms_of_service_url: 'http://terms.com',
101
- contact_email: 'support@test.com',
102
- x: {
103
- logo: 'http://logo.com/img.png'
104
- }
105
- }
106
- end
107
- end
108
-
109
- subject do
110
- get '/swagger_doc'
111
- JSON.parse(last_response.body)['info']
112
- end
113
-
114
- it 'documents API title' do
115
- expect(subject['title']).to eql('My API Title')
116
- end
117
-
118
- it 'documents API description' do
119
- expect(subject['description']).to eql('A description of my API')
120
- end
121
-
122
- it 'should document the license' do
123
- expect(subject['license']['name']).to eql('Apache 2')
124
- end
125
-
126
- it 'documents the license url' do
127
- expect(subject['license']['url']).to eql('http://test.com')
128
- end
129
-
130
- it 'documents the terms of service url' do
131
- expect(subject['termsOfService']).to eql('http://terms.com')
132
- end
133
-
134
- it 'documents the contact email' do
135
- expect(subject['contact']['email']).to eql('support@test.com')
136
- end
137
-
138
- it 'documents the extension field' do
139
- expect(subject['x-logo']).to eql('http://logo.com/img.png')
140
- end
141
- end
142
-
143
- context 'with tags' do
144
- def app
145
- Class.new(Grape::API) do
146
- format :json
147
- desc 'This gets something.'
148
- get '/something' do
149
- { bla: 'something' }
150
- end
151
- get '/somethingelse' do
152
- { bla: 'somethingelse' }
153
- end
154
-
155
- add_swagger_documentation tags: [
156
- { name: 'something', description: 'customized description' }
157
- ]
158
- end
159
- end
160
-
161
- subject do
162
- get '/swagger_doc'
163
- JSON.parse(last_response.body)
164
- end
165
-
166
- it 'documents the customized tag' do
167
- expect(subject['tags']).to eql(
168
- [
169
- { 'name' => 'somethingelse', 'description' => 'Operations about somethingelses' },
170
- { 'name' => 'something', 'description' => 'customized description' }
171
- ]
172
- )
173
- end
174
- end
175
- end
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe 'deprecated endpoint' do
6
- def app
7
- Class.new(Grape::API) do
8
- desc 'Deprecated endpoint', deprecated: true
9
- get '/foobar' do
10
- { foo: 'bar' }
11
- end
12
-
13
- add_swagger_documentation
14
- end
15
- end
16
-
17
- subject do
18
- get '/swagger_doc.json'
19
- JSON.parse(last_response.body)
20
- end
21
-
22
- it 'includes the deprecated field' do
23
- expect(subject['paths']['/foobar']['get']['deprecated']).to eql(true)
24
- end
25
- end
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe 'has no description, if details or description are nil' do
6
- include_context "#{MODEL_PARSER} swagger example"
7
-
8
- before :all do
9
- module TheApi
10
- class GfmRcDetailApi < Grape::API
11
- format :json
12
-
13
- desc nil,
14
- detail: nil,
15
- entity: Entities::UseResponse,
16
- failure: [{ code: 400, model: Entities::ApiError }]
17
- get '/use_gfm_rc_detail' do
18
- { 'declared_params' => declared(params) }
19
- end
20
-
21
- add_swagger_documentation
22
- end
23
- end
24
- end
25
-
26
- def app
27
- TheApi::GfmRcDetailApi
28
- end
29
-
30
- subject do
31
- get '/swagger_doc'
32
- JSON.parse(last_response.body)
33
- end
34
-
35
- specify do
36
- expect(subject['paths']['/use_gfm_rc_detail']['get']).not_to include('description')
37
- expect(subject['paths']['/use_gfm_rc_detail']['get']['description']).to eql(nil)
38
- end
39
- end
@@ -1,130 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe 'Grape::Endpoint#path_and_definitions' do
6
- context 'when mounting an API once' do
7
- let(:item) do
8
- Class.new(Grape::API) do
9
- version 'v1', using: :path
10
-
11
- resource :item do
12
- get '/'
13
- end
14
- end
15
- end
16
-
17
- let(:api) do
18
- item_api = item
19
-
20
- Class.new(Grape::API) do
21
- mount item_api
22
- add_swagger_documentation add_version: true
23
- end
24
- end
25
-
26
- let(:options) { { add_version: true } }
27
- let(:target_routes) { api.combined_namespace_routes }
28
-
29
- subject { api.endpoints[0].path_and_definition_objects(target_routes, options) }
30
-
31
- it 'is returning a versioned path' do
32
- expect(subject[0].keys[0]).to eq '/v1/item'
33
- end
34
-
35
- it 'tags the endpoint with the resource name' do
36
- expect(subject.first['/v1/item'][:get][:tags]).to eq ['item']
37
- end
38
-
39
- context 'when custom tags are specified' do
40
- let(:item) do
41
- Class.new(Grape::API) do
42
- version 'v1', using: :path
43
-
44
- resource :item do
45
- desc 'Item description', tags: ['special-item']
46
- get '/'
47
- end
48
- end
49
- end
50
-
51
- it 'tags the endpoint with the custom tags' do
52
- expect(subject.first['/v1/item'][:get][:tags]).to eq ['special-item']
53
- end
54
- end
55
-
56
- context 'when parameter with a custom type is specified' do
57
- let(:item) do
58
- Class.new(Grape::API) do
59
- Color = Struct.new(:value) do
60
- def self.parse(value)
61
- new(value: value)
62
- end
63
- end
64
-
65
- class ColorEntity < Grape::Entity
66
- expose :value
67
- end
68
-
69
- version 'v1', using: :path
70
-
71
- resource :item do
72
- params do
73
- requires :root, type: Hash do
74
- optional :color, type: Color, documentation: { type: ColorEntity }
75
- end
76
- end
77
- post '/'
78
- end
79
- end
80
- end
81
-
82
- it 'creates a reference to the model instead of using the non-existent type' do
83
- color = subject.dig(1, 'postV1Item', :properties, :root, :properties, :color)
84
- expect(color).not_to eq(type: 'ColorEntity')
85
- expect(color).to eq('$ref' => '#/definitions/ColorEntity')
86
- end
87
- end
88
- end
89
-
90
- context 'when mounting an API more than once', if: GrapeVersion.satisfy?('>= 1.2.0') do
91
- let(:item) do
92
- Class.new(Grape::API) do
93
- resource :item do
94
- desc 'Item description', tags: [configuration[:tag] || 'item']
95
- get '/'
96
- end
97
- end
98
- end
99
-
100
- let(:api) do
101
- item_api = item
102
- Class.new(Grape::API) do
103
- version 'v1', using: :path do
104
- mount item_api
105
- end
106
-
107
- version 'v2', using: :path do
108
- mount item_api, with: { tag: 'special-item' }
109
- end
110
-
111
- add_swagger_documentation add_version: true
112
- end
113
- end
114
-
115
- let(:options) { { add_version: true } }
116
- let(:target_routes) { api.combined_namespace_routes }
117
-
118
- subject { api.endpoints[0].path_and_definition_objects(target_routes, options) }
119
-
120
- it 'retrieves both apis respecting their configured tags' do
121
- expect(subject.first['/v1/item'][:get][:tags]).to eq ['item']
122
- expect(subject.first['/v2/item'][:get][:tags]).to eq ['special-item']
123
- end
124
-
125
- it 'retrieves both apis with descriptions' do
126
- expect(subject.first['/v1/item'][:get][:description]).to eq 'Item description'
127
- expect(subject.first['/v2/item'][:get][:description]).to eq 'Item description'
128
- end
129
- end
130
- end
@@ -1,77 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe 'Errors' do
6
- describe 'Empty model error' do
7
- let!(:app) do
8
- Class.new(Grape::API) do
9
- format :json
10
-
11
- desc 'Empty model get.' do
12
- http_codes [
13
- { code: 200, message: 'get Empty model', model: EmptyClass }
14
- ]
15
- end
16
- get '/empty_model' do
17
- something = OpenStruct.new text: 'something'
18
- present something, with: EmptyClass
19
- end
20
-
21
- version 'v3', using: :path
22
- add_swagger_documentation api_version: 'v1',
23
- base_path: '/api',
24
- info: {
25
- title: 'The API title to be displayed on the API homepage.',
26
- description: 'A description of the API.',
27
- contact_name: 'Contact name',
28
- contact_email: 'Contact@email.com',
29
- contact_url: 'Contact URL',
30
- license: 'The name of the license.',
31
- license_url: 'www.The-URL-of-the-license.org',
32
- terms_of_service_url: 'www.The-URL-of-the-terms-and-service.com'
33
- }
34
- end
35
- end
36
-
37
- it 'should raise SwaggerSpec exception' do
38
- expect { get '/v3/swagger_doc' }.to raise_error(GrapeSwagger::Errors::SwaggerSpec, "Empty model EmptyClass, swagger 2.0 doesn't support empty definitions.")
39
- end
40
- end
41
-
42
- describe 'Parser not found error' do
43
- let!(:app) do
44
- Class.new(Grape::API) do
45
- format :json
46
-
47
- desc 'Wrong model get.' do
48
- http_codes [
49
- { code: 200, message: 'get Wrong model', model: Hash }
50
- ]
51
- end
52
- get '/wrong_model' do
53
- something = OpenStruct.new text: 'something'
54
- present something, with: Hash
55
- end
56
-
57
- version 'v3', using: :path
58
- add_swagger_documentation api_version: 'v1',
59
- base_path: '/api',
60
- info: {
61
- title: 'The API title to be displayed on the API homepage.',
62
- description: 'A description of the API.',
63
- contact_name: 'Contact name',
64
- contact_email: 'Contact@email.com',
65
- contact_url: 'Contact URL',
66
- license: 'The name of the license.',
67
- license_url: 'www.The-URL-of-the-license.org',
68
- terms_of_service_url: 'www.The-URL-of-the-terms-and-service.com'
69
- }
70
- end
71
- end
72
-
73
- it 'should raise UnregisteredParser exception' do
74
- expect { get '/v3/swagger_doc' }.to raise_error(GrapeSwagger::Errors::UnregisteredParser, 'No parser registered for Hash.')
75
- end
76
- end
77
- end