grape-swagger 0.6.0 → 0.7.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.
- data/.rspec +2 -0
- data/.rvmrc +1 -1
- data/.travis.yml +2 -0
- data/CHANGELOG.markdown +9 -0
- data/Gemfile +2 -1
- data/Gemfile.lock +24 -10
- data/README.markdown +58 -6
- data/VERSION +1 -1
- data/grape-swagger.gemspec +14 -7
- data/lib/grape-swagger.rb +235 -93
- data/spec/api_models_spec.rb +132 -0
- data/spec/default_api_spec.rb +80 -10
- data/spec/form_params_spec.rb +83 -0
- data/spec/grape-swagger_helper_spec.rb +107 -0
- data/spec/grape-swagger_spec.rb +0 -2
- data/spec/hide_api_spec.rb +106 -0
- data/spec/non_default_api_spec.rb +318 -78
- data/spec/simple_mounted_api_spec.rb +139 -19
- data/spec/spec_helper.rb +2 -10
- metadata +26 -6
- data/spec/grape-swagger-helper_spec.rb +0 -88
@@ -1,70 +1,103 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe "options: " do
|
4
|
-
context "
|
5
|
-
before
|
4
|
+
context "overriding the basepath" do
|
5
|
+
before :all do
|
6
|
+
|
6
7
|
class BasePathMountedApi < Grape::API
|
7
|
-
desc '
|
8
|
+
desc 'This gets something.'
|
8
9
|
get '/something' do
|
9
|
-
{:
|
10
|
+
{ bla: 'something' }
|
10
11
|
end
|
11
12
|
end
|
12
13
|
|
13
14
|
class SimpleApiWithBasePath < Grape::API
|
14
|
-
NON_DEFAULT_BASE_PATH= "http://www.breakcoregivesmewood.com"
|
15
|
+
NON_DEFAULT_BASE_PATH = "http://www.breakcoregivesmewood.com"
|
15
16
|
|
16
17
|
mount BasePathMountedApi
|
17
18
|
add_swagger_documentation :base_path => NON_DEFAULT_BASE_PATH
|
18
19
|
end
|
20
|
+
|
19
21
|
end
|
20
22
|
|
21
23
|
def app; SimpleApiWithBasePath end
|
22
24
|
|
23
25
|
it "retrieves the given base-path on /swagger_doc" do
|
24
|
-
get '/swagger_doc'
|
25
|
-
last_response.body.should ==
|
26
|
+
get '/swagger_doc.json'
|
27
|
+
JSON.parse(last_response.body)["basePath"].should == SimpleApiWithBasePath::NON_DEFAULT_BASE_PATH
|
26
28
|
end
|
27
29
|
|
28
30
|
it "retrieves the same given base-path for mounted-api" do
|
29
|
-
get '/swagger_doc/something'
|
30
|
-
last_response.body.should ==
|
31
|
+
get '/swagger_doc/something.json'
|
32
|
+
JSON.parse(last_response.body)["basePath"].should == SimpleApiWithBasePath::NON_DEFAULT_BASE_PATH
|
31
33
|
end
|
32
34
|
end
|
33
35
|
|
34
|
-
context "
|
35
|
-
before
|
36
|
+
context "overriding the basepath with a proc" do
|
37
|
+
before :all do
|
38
|
+
|
36
39
|
class ProcBasePathMountedApi < Grape::API
|
37
|
-
desc '
|
40
|
+
desc 'This gets something.'
|
38
41
|
get '/something' do
|
39
|
-
{:
|
42
|
+
{ bla: 'something' }
|
40
43
|
end
|
41
44
|
end
|
42
45
|
|
43
46
|
class SimpleApiWithProcBasePath < Grape::API
|
44
47
|
mount ProcBasePathMountedApi
|
45
|
-
add_swagger_documentation :
|
48
|
+
add_swagger_documentation base_path: lambda { |request| "#{request.base_url}/some_value" }
|
46
49
|
end
|
47
50
|
end
|
48
51
|
|
49
52
|
def app; SimpleApiWithProcBasePath end
|
50
53
|
|
51
54
|
it "retrieves the given base-path on /swagger_doc" do
|
52
|
-
get '/swagger_doc'
|
53
|
-
last_response.body.should == "
|
55
|
+
get '/swagger_doc.json'
|
56
|
+
JSON.parse(last_response.body)["basePath"].should == "http://example.org/some_value"
|
54
57
|
end
|
55
58
|
|
56
59
|
it "retrieves the same given base-path for mounted-api" do
|
57
|
-
get '/swagger_doc/something'
|
58
|
-
last_response.body.should == "
|
60
|
+
get '/swagger_doc/something.json'
|
61
|
+
JSON.parse(last_response.body)["basePath"].should == "http://example.org/some_value"
|
59
62
|
end
|
60
63
|
end
|
61
64
|
|
62
|
-
context "
|
63
|
-
before
|
65
|
+
context "relative base_path" do
|
66
|
+
before :all do
|
67
|
+
|
68
|
+
class RelativeBasePathMountedApi < Grape::API
|
69
|
+
desc 'This gets something.'
|
70
|
+
get '/something' do
|
71
|
+
{ bla: 'something' }
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
class SimpleApiWithRelativeBasePath < Grape::API
|
76
|
+
mount RelativeBasePathMountedApi
|
77
|
+
add_swagger_documentation base_path: "/some_value"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def app; SimpleApiWithRelativeBasePath end
|
82
|
+
|
83
|
+
it "retrieves the given base-path on /swagger_doc" do
|
84
|
+
get '/swagger_doc.json'
|
85
|
+
JSON.parse(last_response.body)["basePath"].should == "http://example.org/some_value"
|
86
|
+
end
|
87
|
+
|
88
|
+
it "retrieves the same given base-path for mounted-api" do
|
89
|
+
get '/swagger_doc/something.json'
|
90
|
+
JSON.parse(last_response.body)["basePath"].should == "http://example.org/some_value"
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
context "overriding the version" do
|
95
|
+
before :all do
|
96
|
+
|
64
97
|
class ApiVersionMountedApi < Grape::API
|
65
|
-
desc '
|
98
|
+
desc 'This gets something.'
|
66
99
|
get '/something' do
|
67
|
-
{:
|
100
|
+
{ bla: 'something' }
|
68
101
|
end
|
69
102
|
end
|
70
103
|
|
@@ -79,22 +112,23 @@ describe "options: " do
|
|
79
112
|
def app; SimpleApiWithApiVersion end
|
80
113
|
|
81
114
|
it "retrieves the api version on /swagger_doc" do
|
82
|
-
get '/swagger_doc'
|
83
|
-
last_response.body.should ==
|
115
|
+
get '/swagger_doc.json'
|
116
|
+
JSON.parse(last_response.body)["apiVersion"].should == SimpleApiWithApiVersion::API_VERSION
|
84
117
|
end
|
85
118
|
|
86
119
|
it "retrieves the same api version for mounted-api" do
|
87
|
-
get '/swagger_doc/something'
|
88
|
-
last_response.body.should ==
|
120
|
+
get '/swagger_doc/something.json'
|
121
|
+
JSON.parse(last_response.body)["apiVersion"].should == SimpleApiWithApiVersion::API_VERSION
|
89
122
|
end
|
90
123
|
end
|
91
124
|
|
92
125
|
context "mounting in a versioned api" do
|
93
|
-
before
|
126
|
+
before :all do
|
127
|
+
|
94
128
|
class SimpleApiToMountInVersionedApi < Grape::API
|
95
|
-
desc '
|
129
|
+
desc 'This gets something.'
|
96
130
|
get '/something' do
|
97
|
-
{:
|
131
|
+
{ bla: 'something' }
|
98
132
|
end
|
99
133
|
end
|
100
134
|
|
@@ -108,25 +142,54 @@ describe "options: " do
|
|
108
142
|
|
109
143
|
def app; SimpleApiWithVersionInPath end
|
110
144
|
|
111
|
-
it "
|
112
|
-
get '/v1/swagger_doc'
|
113
|
-
|
145
|
+
it "gets the documentation on a versioned path /v1/swagger_doc" do
|
146
|
+
get '/v1/swagger_doc.json'
|
147
|
+
|
148
|
+
JSON.parse(last_response.body).should == {
|
149
|
+
"apiVersion" => "0.1",
|
150
|
+
"swaggerVersion" => "1.2",
|
151
|
+
"basePath" => "http://example.org",
|
152
|
+
"info" => {},
|
153
|
+
"produces" => ["application/xml", "application/json", "text/plain"],
|
154
|
+
"operations" => [],
|
155
|
+
"apis" => [
|
156
|
+
{ "path" => "/v1/something.{format}" },
|
157
|
+
{ "path" => "/v1/swagger_doc.{format}" }
|
158
|
+
]
|
159
|
+
}
|
114
160
|
end
|
115
161
|
|
116
|
-
it "
|
117
|
-
get '/v1/swagger_doc/something'
|
162
|
+
it "gets the resource specific documentation on a versioned path /v1/swagger_doc/something" do
|
163
|
+
get '/v1/swagger_doc/something.json'
|
118
164
|
last_response.status.should == 200
|
165
|
+
JSON.parse(last_response.body).should == {
|
166
|
+
"apiVersion" => "0.1",
|
167
|
+
"swaggerVersion" => "1.2",
|
168
|
+
"basePath" => "http://example.org",
|
169
|
+
"resourcePath" => "",
|
170
|
+
"apis" => [{
|
171
|
+
"path" => "/0.1/something.{format}",
|
172
|
+
"operations" => [{
|
173
|
+
"produces" => ["application/xml", "application/json", "text/plain"],
|
174
|
+
"notes" => nil,
|
175
|
+
"notes" => "",
|
176
|
+
"summary" => "This gets something.",
|
177
|
+
"nickname" => "GET--version-something---format-",
|
178
|
+
"httpMethod" => "GET",
|
179
|
+
"parameters" => []
|
180
|
+
}]
|
181
|
+
}]
|
182
|
+
}
|
119
183
|
end
|
120
184
|
|
121
185
|
end
|
122
186
|
|
123
|
-
|
124
|
-
|
125
|
-
before(:all) do
|
187
|
+
context "overriding hiding the documentation paths" do
|
188
|
+
before :all do
|
126
189
|
class HideDocumentationPathMountedApi < Grape::API
|
127
|
-
desc '
|
190
|
+
desc 'This gets something.'
|
128
191
|
get '/something' do
|
129
|
-
{:
|
192
|
+
{ bla: 'something' }
|
130
193
|
end
|
131
194
|
end
|
132
195
|
|
@@ -139,17 +202,116 @@ describe "options: " do
|
|
139
202
|
def app; SimpleApiWithHiddenDocumentation end
|
140
203
|
|
141
204
|
it "it doesn't show the documentation path on /swagger_doc" do
|
142
|
-
get '/swagger_doc'
|
143
|
-
last_response.body.should ==
|
205
|
+
get '/swagger_doc.json'
|
206
|
+
JSON.parse(last_response.body).should == {
|
207
|
+
"apiVersion" => "0.1",
|
208
|
+
"swaggerVersion" => "1.2",
|
209
|
+
"basePath" => "http://example.org",
|
210
|
+
"info" => {},
|
211
|
+
"produces" => ["application/xml", "application/json", "text/plain"],
|
212
|
+
"operations" => [],
|
213
|
+
"apis" => [
|
214
|
+
{ "path" => "/something.{format}" }
|
215
|
+
]
|
216
|
+
}
|
144
217
|
end
|
145
218
|
end
|
146
219
|
|
147
|
-
context "
|
148
|
-
before
|
220
|
+
context "overriding hiding the documentation paths in prefixed API" do
|
221
|
+
before :all do
|
222
|
+
class HideDocumentationPathPrefixedMountedApi < Grape::API
|
223
|
+
desc 'This gets something.'
|
224
|
+
get '/something' do
|
225
|
+
{ bla: 'something' }
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
class PrefixedApiWithHiddenDocumentation < Grape::API
|
230
|
+
prefix "abc"
|
231
|
+
mount HideDocumentationPathPrefixedMountedApi
|
232
|
+
add_swagger_documentation :hide_documentation_path => true
|
233
|
+
end
|
234
|
+
|
235
|
+
end
|
236
|
+
|
237
|
+
def app; PrefixedApiWithHiddenDocumentation end
|
238
|
+
|
239
|
+
it "it doesn't show the documentation path on /abc/swagger_doc/something.json" do
|
240
|
+
get '/abc/swagger_doc/something.json'
|
241
|
+
JSON.parse(last_response.body).should == {
|
242
|
+
"apiVersion"=>"0.1",
|
243
|
+
"swaggerVersion"=>"1.2",
|
244
|
+
"basePath"=>"http://example.org",
|
245
|
+
"resourcePath"=>"",
|
246
|
+
"apis"=> [{
|
247
|
+
"path"=>"/abc/something.{format}",
|
248
|
+
"operations"=> [{
|
249
|
+
"produces" => ["application/xml", "application/json", "text/plain"],
|
250
|
+
"notes"=>nil,
|
251
|
+
"notes"=>"",
|
252
|
+
"summary"=>"This gets something.",
|
253
|
+
"nickname"=>"GET-abc-something---format-",
|
254
|
+
"httpMethod"=>"GET",
|
255
|
+
"parameters"=>[]
|
256
|
+
}]
|
257
|
+
}]
|
258
|
+
}
|
259
|
+
end
|
260
|
+
|
261
|
+
end
|
262
|
+
|
263
|
+
context "overriding hiding the documentation paths in prefixed and versioned API" do
|
264
|
+
before :all do
|
265
|
+
class HideDocumentationPathMountedApi2 < Grape::API
|
266
|
+
desc 'This gets something.'
|
267
|
+
get '/something' do
|
268
|
+
{ bla: 'something' }
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
272
|
+
class PrefixedAndVersionedApiWithHiddenDocumentation < Grape::API
|
273
|
+
prefix "abc"
|
274
|
+
version 'v20', :using => :path
|
275
|
+
|
276
|
+
mount HideDocumentationPathMountedApi2
|
277
|
+
|
278
|
+
add_swagger_documentation :hide_documentation_path => true, :api_version => self.version
|
279
|
+
end
|
280
|
+
end
|
281
|
+
|
282
|
+
def app; PrefixedAndVersionedApiWithHiddenDocumentation end
|
283
|
+
|
284
|
+
it "it doesn't show the documentation path on /abc/v1/swagger_doc/something.json" do
|
285
|
+
get '/abc/v20/swagger_doc/something.json'
|
286
|
+
|
287
|
+
JSON.parse(last_response.body).should == {
|
288
|
+
"apiVersion"=>"v20",
|
289
|
+
"swaggerVersion"=>"1.2",
|
290
|
+
"basePath"=>"http://example.org",
|
291
|
+
"resourcePath"=>"",
|
292
|
+
"apis"=>[{
|
293
|
+
"path"=>"/abc/v20/something.{format}",
|
294
|
+
"operations"=>[{
|
295
|
+
"produces" => ["application/xml", "application/json", "text/plain"],
|
296
|
+
"notes"=>nil,
|
297
|
+
"notes"=>"",
|
298
|
+
"summary"=>"This gets something.",
|
299
|
+
"nickname"=>"GET-abc--version-something---format-",
|
300
|
+
"httpMethod"=>"GET",
|
301
|
+
"parameters"=>[]
|
302
|
+
}]
|
303
|
+
}]
|
304
|
+
}
|
305
|
+
end
|
306
|
+
|
307
|
+
end
|
308
|
+
|
309
|
+
context "overriding the mount-path" do
|
310
|
+
before :all do
|
149
311
|
class DifferentMountMountedApi < Grape::API
|
150
|
-
desc '
|
312
|
+
desc 'This gets something.'
|
151
313
|
get '/something' do
|
152
|
-
{:
|
314
|
+
{ bla: 'something' }
|
153
315
|
end
|
154
316
|
end
|
155
317
|
|
@@ -163,30 +325,28 @@ describe "options: " do
|
|
163
325
|
|
164
326
|
def app; SimpleApiWithDifferentMount end
|
165
327
|
|
166
|
-
it "retrieves the given base-path on /api_doc" do
|
167
|
-
get '/api_doc'
|
168
|
-
last_response.body.should == "{:apiVersion=>\"0.1\", :swaggerVersion=>\"1.1\", :basePath=>\"http://example.org\", :operations=>[], :apis=>[{:path=>\"/api_doc/something.{format}\"}, {:path=>\"/api_doc/api_doc.{format}\"}]}"
|
169
|
-
end
|
170
328
|
|
171
329
|
it "retrieves the same given base-path for mounted-api" do
|
172
|
-
get '/api_doc/something'
|
173
|
-
last_response.body
|
330
|
+
get '/api_doc/something.json'
|
331
|
+
JSON.parse(last_response.body)["apis"].each do |api|
|
332
|
+
api["path"].should_not start_with SimpleApiWithDifferentMount::MOUNT_PATH
|
333
|
+
end
|
174
334
|
end
|
175
335
|
|
176
336
|
it "does not respond to swagger_doc" do
|
177
|
-
get '/swagger_doc'
|
337
|
+
get '/swagger_doc.json'
|
178
338
|
last_response.status.should be == 404
|
179
339
|
end
|
180
340
|
end
|
181
341
|
|
182
|
-
context "
|
183
|
-
before
|
342
|
+
context "overriding the markdown" do
|
343
|
+
before :all do
|
184
344
|
class MarkDownMountedApi < Grape::API
|
185
|
-
desc '
|
345
|
+
desc 'This gets something.', {
|
186
346
|
:notes => '_test_'
|
187
347
|
}
|
188
348
|
get '/something' do
|
189
|
-
{:
|
349
|
+
{ bla: 'something' }
|
190
350
|
end
|
191
351
|
end
|
192
352
|
|
@@ -199,20 +359,36 @@ describe "options: " do
|
|
199
359
|
def app; SimpleApiWithMarkdown end
|
200
360
|
|
201
361
|
it "parses markdown for a mounted-api" do
|
202
|
-
get '/swagger_doc/something'
|
203
|
-
last_response.body.should ==
|
362
|
+
get '/swagger_doc/something.json'
|
363
|
+
JSON.parse(last_response.body).should == {
|
364
|
+
"apiVersion" => "0.1",
|
365
|
+
"swaggerVersion" => "1.2",
|
366
|
+
"basePath" => "http://example.org",
|
367
|
+
"resourcePath" => "",
|
368
|
+
"apis" => [{
|
369
|
+
"path" => "/something.{format}",
|
370
|
+
"operations" => [{
|
371
|
+
"produces" => ["application/xml", "application/json", "text/plain"],
|
372
|
+
"notes" => "<p><em>test</em></p>\n",
|
373
|
+
"summary" => "This gets something.",
|
374
|
+
"nickname" => "GET-something---format-",
|
375
|
+
"httpMethod" => "GET",
|
376
|
+
"parameters" => []
|
377
|
+
}]
|
378
|
+
}]
|
379
|
+
}
|
204
380
|
end
|
205
381
|
end
|
206
382
|
|
207
|
-
context "versioned API" do
|
208
|
-
before
|
383
|
+
context "prefixed and versioned API" do
|
384
|
+
before :all do
|
209
385
|
class VersionedMountedApi < Grape::API
|
210
386
|
prefix 'api'
|
211
387
|
version 'v1'
|
212
388
|
|
213
|
-
desc '
|
389
|
+
desc 'This gets something.'
|
214
390
|
get '/something' do
|
215
|
-
{:
|
391
|
+
{ bla: 'something' }
|
216
392
|
end
|
217
393
|
end
|
218
394
|
|
@@ -225,17 +401,20 @@ describe "options: " do
|
|
225
401
|
def app; SimpleApiWithVersion end
|
226
402
|
|
227
403
|
it "parses version and places it in the path" do
|
228
|
-
get '/swagger_doc/
|
229
|
-
|
404
|
+
get '/swagger_doc/something.json'
|
405
|
+
|
406
|
+
JSON.parse(last_response.body)["apis"].each do |api|
|
407
|
+
api["path"].should start_with "/api/v1/"
|
408
|
+
end
|
230
409
|
end
|
231
410
|
end
|
232
411
|
|
233
412
|
context "protected API" do
|
234
|
-
before
|
413
|
+
before :all do
|
235
414
|
class ProtectedApi < Grape::API
|
236
|
-
desc '
|
415
|
+
desc 'This gets something.'
|
237
416
|
get '/something' do
|
238
|
-
{:
|
417
|
+
{ bla: 'something' }
|
239
418
|
end
|
240
419
|
end
|
241
420
|
|
@@ -247,23 +426,23 @@ describe "options: " do
|
|
247
426
|
|
248
427
|
def app; SimpleApiWithProtection; end
|
249
428
|
|
250
|
-
it "
|
251
|
-
get '/swagger_doc', {}, 'rack.url_scheme' => 'https'
|
252
|
-
last_response.body.should == "
|
429
|
+
it "uses https schema in mount point" do
|
430
|
+
get '/swagger_doc.json', {}, 'rack.url_scheme' => 'https'
|
431
|
+
JSON.parse(last_response.body)["basePath"].should == "https://example.org:80"
|
253
432
|
end
|
254
433
|
|
255
|
-
it "
|
256
|
-
get '/swagger_doc/something', {}, 'rack.url_scheme' => 'https'
|
257
|
-
last_response.body.should == "
|
434
|
+
it "uses https schema in endpoint doc" do
|
435
|
+
get '/swagger_doc/something.json', {}, 'rack.url_scheme' => 'https'
|
436
|
+
JSON.parse(last_response.body)["basePath"].should == "https://example.org:80"
|
258
437
|
end
|
259
438
|
end
|
260
439
|
|
261
440
|
context ":hide_format" do
|
262
|
-
before
|
441
|
+
before :all do
|
263
442
|
class HidePathsApi < Grape::API
|
264
|
-
desc '
|
443
|
+
desc 'This gets something.'
|
265
444
|
get '/something' do
|
266
|
-
{:
|
445
|
+
{ bla: 'something' }
|
267
446
|
end
|
268
447
|
end
|
269
448
|
|
@@ -276,8 +455,69 @@ describe "options: " do
|
|
276
455
|
def app; SimpleApiWithHiddenPaths; end
|
277
456
|
|
278
457
|
it "has no formats" do
|
279
|
-
get '/swagger_doc/something'
|
280
|
-
last_response.body
|
458
|
+
get '/swagger_doc/something.json'
|
459
|
+
JSON.parse(last_response.body)["apis"].each do |api|
|
460
|
+
api["path"].should_not end_with ".{format}"
|
461
|
+
end
|
462
|
+
end
|
463
|
+
end
|
464
|
+
|
465
|
+
context "multiple documentations" do
|
466
|
+
before :all do
|
467
|
+
class FirstApi < Grape::API
|
468
|
+
desc 'This is the first API'
|
469
|
+
get '/first' do
|
470
|
+
{ first: 'hip' }
|
471
|
+
end
|
472
|
+
|
473
|
+
add_swagger_documentation mount_path: '/first/swagger_doc'
|
474
|
+
end
|
475
|
+
|
476
|
+
class SecondApi < Grape::API
|
477
|
+
desc 'This is the second API'
|
478
|
+
get '/second' do
|
479
|
+
{ second: 'hop' }
|
480
|
+
end
|
481
|
+
|
482
|
+
add_swagger_documentation mount_path: '/second/swagger_doc'
|
483
|
+
end
|
484
|
+
|
485
|
+
class SimpleApiWithMultipleMountedDocumentations < Grape::API
|
486
|
+
mount FirstApi
|
487
|
+
mount SecondApi
|
488
|
+
end
|
489
|
+
end
|
490
|
+
|
491
|
+
def app; SimpleApiWithMultipleMountedDocumentations; end
|
492
|
+
|
493
|
+
it "retrieves the first swagger-documentation on /first/swagger_doc" do
|
494
|
+
get '/first/swagger_doc.json'
|
495
|
+
JSON.parse(last_response.body).should == {
|
496
|
+
"apiVersion" => "0.1",
|
497
|
+
"swaggerVersion" => "1.2",
|
498
|
+
"basePath" => "http://example.org",
|
499
|
+
"info" => {},
|
500
|
+
"produces" => ["application/xml", "application/json", "text/plain"],
|
501
|
+
"operations" => [],
|
502
|
+
"apis" => [
|
503
|
+
{ "path" => "/first.{format}" }
|
504
|
+
]
|
505
|
+
}
|
506
|
+
end
|
507
|
+
|
508
|
+
it "retrieves the first swagger-documentation on /second/swagger_doc" do
|
509
|
+
get '/second/swagger_doc.json'
|
510
|
+
JSON.parse(last_response.body).should == {
|
511
|
+
"apiVersion" => "0.1",
|
512
|
+
"swaggerVersion" => "1.2",
|
513
|
+
"basePath" => "http://example.org",
|
514
|
+
"info" => {},
|
515
|
+
"produces" => ["application/xml", "application/json", "text/plain"],
|
516
|
+
"operations" => [],
|
517
|
+
"apis" => [
|
518
|
+
{ "path" => "/second.{format}" }
|
519
|
+
]
|
520
|
+
}
|
281
521
|
end
|
282
522
|
end
|
283
523
|
end
|