swagger-blocks 1.0.1 → 1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,5 @@
1
1
  module Swagger
2
2
  module Blocks
3
- VERSION = '1.0.1'
3
+ VERSION = '1.1'
4
4
  end
5
5
  end
@@ -276,7 +276,7 @@ end
276
276
  class BlankController; end
277
277
 
278
278
 
279
- describe Swagger::Blocks do
279
+ describe 'Swagger::Blocks v1' do
280
280
  describe 'build_root_json' do
281
281
  it 'outputs the correct data' do
282
282
  swaggered_classes = [
@@ -362,7 +362,7 @@ describe Swagger::Blocks do
362
362
  Swagger::Blocks.build_root_json([])
363
363
  }.to raise_error(Swagger::Blocks::DeclarationError)
364
364
  end
365
- it 'errors if mulitple swagger_roots are declared' do
365
+ it 'errors if multiple swagger_roots are declared' do
366
366
  expect {
367
367
  Swagger::Blocks.build_root_json([PetController, PetController])
368
368
  }.to raise_error(Swagger::Blocks::DeclarationError)
@@ -0,0 +1,224 @@
1
+ {
2
+ "swagger": "2.0",
3
+ "info": {
4
+ "version": "1.0.0",
5
+ "title": "Swagger Petstore",
6
+ "description": "A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification",
7
+ "termsOfService": "http://helloreverb.com/terms/",
8
+ "contact": {
9
+ "name": "Wordnik API Team"
10
+ },
11
+ "license": {
12
+ "name": "MIT"
13
+ }
14
+ },
15
+ "host": "petstore.swagger.wordnik.com",
16
+ "basePath": "/api",
17
+ "schemes": [
18
+ "http"
19
+ ],
20
+ "consumes": [
21
+ "application/json"
22
+ ],
23
+ "produces": [
24
+ "application/json"
25
+ ],
26
+ "paths": {
27
+ "/pets": {
28
+ "get": {
29
+ "description": "Returns all pets from the system that the user has access to",
30
+ "operationId": "findPets",
31
+ "produces": [
32
+ "application/json",
33
+ "application/xml",
34
+ "text/xml",
35
+ "text/html"
36
+ ],
37
+ "parameters": [
38
+ {
39
+ "name": "tags",
40
+ "in": "query",
41
+ "description": "tags to filter by",
42
+ "required": false,
43
+ "type": "array",
44
+ "items": {
45
+ "type": "string"
46
+ },
47
+ "collectionFormat": "csv"
48
+ },
49
+ {
50
+ "name": "limit",
51
+ "in": "query",
52
+ "description": "maximum number of results to return",
53
+ "required": false,
54
+ "type": "integer",
55
+ "format": "int32"
56
+ }
57
+ ],
58
+ "responses": {
59
+ "200": {
60
+ "description": "pet response",
61
+ "schema": {
62
+ "type": "array",
63
+ "items": {
64
+ "$ref": "#/definitions/Pet"
65
+ }
66
+ }
67
+ },
68
+ "default": {
69
+ "description": "unexpected error",
70
+ "schema": {
71
+ "$ref": "#/definitions/ErrorModel"
72
+ }
73
+ }
74
+ }
75
+ },
76
+ "post": {
77
+ "description": "Creates a new pet in the store. Duplicates are allowed",
78
+ "operationId": "addPet",
79
+ "produces": [
80
+ "application/json"
81
+ ],
82
+ "parameters": [
83
+ {
84
+ "name": "pet",
85
+ "in": "body",
86
+ "description": "Pet to add to the store",
87
+ "required": true,
88
+ "schema": {
89
+ "$ref": "#/definitions/PetInput"
90
+ }
91
+ }
92
+ ],
93
+ "responses": {
94
+ "200": {
95
+ "description": "pet response",
96
+ "schema": {
97
+ "$ref": "#/definitions/Pet"
98
+ }
99
+ },
100
+ "default": {
101
+ "description": "unexpected error",
102
+ "schema": {
103
+ "$ref": "#/definitions/ErrorModel"
104
+ }
105
+ }
106
+ }
107
+ }
108
+ },
109
+ "/pets/{id}": {
110
+ "get": {
111
+ "description": "Returns a user based on a single ID, if the user does not have access to the pet",
112
+ "operationId": "findPetById",
113
+ "produces": [
114
+ "application/json",
115
+ "application/xml",
116
+ "text/xml",
117
+ "text/html"
118
+ ],
119
+ "parameters": [
120
+ {
121
+ "name": "id",
122
+ "in": "path",
123
+ "description": "ID of pet to fetch",
124
+ "required": true,
125
+ "type": "integer",
126
+ "format": "int64"
127
+ }
128
+ ],
129
+ "responses": {
130
+ "200": {
131
+ "description": "pet response",
132
+ "schema": {
133
+ "$ref": "#/definitions/Pet"
134
+ }
135
+ },
136
+ "default": {
137
+ "description": "unexpected error",
138
+ "schema": {
139
+ "$ref": "#/definitions/ErrorModel"
140
+ }
141
+ }
142
+ }
143
+ },
144
+ "delete": {
145
+ "description": "deletes a single pet based on the ID supplied",
146
+ "operationId": "deletePet",
147
+ "parameters": [
148
+ {
149
+ "name": "id",
150
+ "in": "path",
151
+ "description": "ID of pet to delete",
152
+ "required": true,
153
+ "type": "integer",
154
+ "format": "int64"
155
+ }
156
+ ],
157
+ "responses": {
158
+ "204": {
159
+ "description": "pet deleted"
160
+ },
161
+ "default": {
162
+ "description": "unexpected error",
163
+ "schema": {
164
+ "$ref": "#/definitions/ErrorModel"
165
+ }
166
+ }
167
+ }
168
+ }
169
+ }
170
+ },
171
+ "definitions": {
172
+ "Pet": {
173
+ "required": [
174
+ "id",
175
+ "name"
176
+ ],
177
+ "properties": {
178
+ "id": {
179
+ "type": "integer",
180
+ "format": "int64"
181
+ },
182
+ "name": {
183
+ "type": "string"
184
+ },
185
+ "tag": {
186
+ "type": "string"
187
+ }
188
+ }
189
+ },
190
+ "PetInput": {
191
+ "allOf": [
192
+ {
193
+ "$ref": "#/definitions/Pet"
194
+ },
195
+ {
196
+ "required": [
197
+ "name"
198
+ ],
199
+ "properties": {
200
+ "id": {
201
+ "type": "integer",
202
+ "format": "int64"
203
+ }
204
+ }
205
+ }
206
+ ]
207
+ },
208
+ "ErrorModel": {
209
+ "required": [
210
+ "code",
211
+ "message"
212
+ ],
213
+ "properties": {
214
+ "code": {
215
+ "type": "integer",
216
+ "format": "int32"
217
+ },
218
+ "message": {
219
+ "type": "string"
220
+ }
221
+ }
222
+ }
223
+ }
224
+ }
@@ -0,0 +1,256 @@
1
+ require 'json'
2
+ require 'swagger/blocks'
3
+
4
+ # TODO Test data originally based on the Swagger UI example data
5
+
6
+ RESOURCE_LISTING_JSON_V2 = open(File.expand_path('../swagger_v2_api_declaration.json', __FILE__)).read
7
+
8
+ class PetControllerV2
9
+ include Swagger::Blocks
10
+
11
+ swagger_root do
12
+ key :swagger, '2.0'
13
+ info do
14
+ key :version, '1.0.0'
15
+ key :title, 'Swagger Petstore'
16
+ key :description, 'A sample API that uses a petstore as an example to ' \
17
+ 'demonstrate features in the swagger-2.0 specification'
18
+ key :termsOfService, 'http://helloreverb.com/terms/'
19
+ contact do
20
+ key :name, 'Wordnik API Team'
21
+ end
22
+ license do
23
+ key :name, 'MIT'
24
+ end
25
+ end
26
+ key :host, 'petstore.swagger.wordnik.com'
27
+ key :basePath, '/api'
28
+ key :schemes, ['http']
29
+ key :consumes, ['application/json']
30
+ key :produces, ['application/json']
31
+ end
32
+
33
+ swagger_path '/pets' do
34
+ operation :get do
35
+ key :description, 'Returns all pets from the system that the user has access to'
36
+ key :operationId, 'findPets'
37
+ key :produces, [
38
+ 'application/json',
39
+ 'application/xml',
40
+ 'text/xml',
41
+ 'text/html',
42
+ ]
43
+ parameter do
44
+ key :name, :tags
45
+ key :in, :query
46
+ key :description, 'tags to filter by'
47
+ key :required, false
48
+ key :type, :array
49
+ items do
50
+ key :type, :string
51
+ end
52
+ key :collectionFormat, :csv
53
+ end
54
+ parameter do
55
+ key :name, :limit
56
+ key :in, :query
57
+ key :description, 'maximum number of results to return'
58
+ key :required, false
59
+ key :type, :integer
60
+ key :format, :int32
61
+ end
62
+ response 200 do
63
+ key :description, 'pet response'
64
+ schema do
65
+ key :type, :array
66
+ items do
67
+ key :'$ref', :Pet
68
+ end
69
+ end
70
+ end
71
+ response :default do
72
+ key :description, 'unexpected error'
73
+ schema do
74
+ key :'$ref', :ErrorModel
75
+ end
76
+ end
77
+ end
78
+ operation :post do
79
+ key :description, 'Creates a new pet in the store. Duplicates are allowed'
80
+ key :operationId, 'addPet'
81
+ key :produces, [
82
+ 'application/json'
83
+ ]
84
+ parameter do
85
+ key :name, :pet
86
+ key :in, :body
87
+ key :description, 'Pet to add to the store'
88
+ key :required, true
89
+ schema do
90
+ key :'$ref', :PetInput
91
+ end
92
+ end
93
+ response 200 do
94
+ key :description, 'pet response'
95
+ schema do
96
+ key :'$ref', :Pet
97
+ end
98
+ end
99
+ response :default do
100
+ key :description, 'unexpected error'
101
+ schema do
102
+ key :'$ref', :ErrorModel
103
+ end
104
+ end
105
+ end
106
+ end
107
+
108
+ swagger_path '/pets/{id}' do
109
+ operation :get do
110
+ key :description, 'Returns a user based on a single ID, if the user does not have access to the pet'
111
+ key :operationId, 'findPetById'
112
+ key :produces, [
113
+ 'application/json',
114
+ 'application/xml',
115
+ 'text/xml',
116
+ 'text/html',
117
+ ]
118
+ parameter do
119
+ key :name, :id
120
+ key :in, :path
121
+ key :description, 'ID of pet to fetch'
122
+ key :required, true
123
+ key :type, :integer
124
+ key :format, :int64
125
+ end
126
+ response 200 do
127
+ key :description, 'pet response'
128
+ schema do
129
+ key :'$ref', :Pet
130
+ end
131
+ end
132
+ response :default do
133
+ key :description, 'unexpected error'
134
+ schema do
135
+ key :'$ref', :ErrorModel
136
+ end
137
+ end
138
+ end
139
+ operation :delete do
140
+ key :description, 'deletes a single pet based on the ID supplied'
141
+ key :operationId, 'deletePet'
142
+ parameter do
143
+ key :name, :id
144
+ key :in, :path
145
+ key :description, 'ID of pet to delete'
146
+ key :required, true
147
+ key :type, :integer
148
+ key :format, :int64
149
+ end
150
+ response 204 do
151
+ key :description, 'pet deleted'
152
+ end
153
+ response :default do
154
+ key :description, 'unexpected error'
155
+ schema do
156
+ key :'$ref', :ErrorModel
157
+ end
158
+ end
159
+ end
160
+ end
161
+
162
+ end
163
+
164
+ class PetV2
165
+ include Swagger::Blocks
166
+
167
+ swagger_schema :Pet do
168
+ key :required, [:id, :name]
169
+ property :id do
170
+ key :type, :integer
171
+ key :format, :int64
172
+ end
173
+ property :name do
174
+ key :type, :string
175
+ end
176
+ property :tag do
177
+ key :type, :string
178
+ end
179
+ end
180
+
181
+ swagger_schema :PetInput do
182
+ allOf do
183
+ schema do
184
+ key :'$ref', :Pet
185
+ end
186
+ schema do
187
+ key :required, [:name]
188
+ property :id do
189
+ key :type, :integer
190
+ key :format, :int64
191
+ end
192
+ end
193
+ end
194
+ end
195
+ end
196
+
197
+ class ErrorModelV2
198
+ include Swagger::Blocks
199
+
200
+ swagger_schema :ErrorModel do
201
+ key :required, [:code, :message]
202
+ property :code do
203
+ key :type, :integer
204
+ key :format, :int32
205
+ end
206
+ property :message do
207
+ key :type, :string
208
+ end
209
+ end
210
+ end
211
+
212
+ describe 'Swagger::Blocks v2' do
213
+ describe 'build_json' do
214
+ it 'outputs the correct data' do
215
+ swaggered_classes = [
216
+ PetControllerV2,
217
+ PetV2,
218
+ ErrorModelV2
219
+ ]
220
+ actual = Swagger::Blocks.build_root_json(swaggered_classes)
221
+ actual = JSON.parse(actual.to_json) # For access consistency.
222
+ data = JSON.parse(RESOURCE_LISTING_JSON_V2)
223
+
224
+ # Multiple expectations for better test diff output.
225
+ expect(actual['info']).to eq(data['info'])
226
+ expect(actual['paths']).to be
227
+ expect(actual['paths']['/pets']).to be
228
+ expect(actual['paths']['/pets']).to eq(data['paths']['/pets'])
229
+ expect(actual['paths']).to eq(data['paths'])
230
+ expect(actual['definitions']).to eq(data['definitions'])
231
+ expect(actual).to eq(data)
232
+ end
233
+ it 'is idempotent' do
234
+ swaggered_classes = [PetControllerV2, PetV2, ErrorModelV2]
235
+ actual = JSON.parse(Swagger::Blocks.build_root_json(swaggered_classes).to_json)
236
+ actual = JSON.parse(Swagger::Blocks.build_root_json(swaggered_classes).to_json)
237
+ data = JSON.parse(RESOURCE_LISTING_JSON_V2)
238
+ expect(actual).to eq(data)
239
+ end
240
+ it 'errors if no swagger_root is declared' do
241
+ expect {
242
+ Swagger::Blocks.build_root_json([])
243
+ }.to raise_error(Swagger::Blocks::DeclarationError)
244
+ end
245
+ it 'errors if mulitple swagger_roots are declared' do
246
+ expect {
247
+ Swagger::Blocks.build_root_json([PetControllerV2, PetControllerV2])
248
+ }.to raise_error(Swagger::Blocks::DeclarationError)
249
+ end
250
+ it 'errors if calling build_api_json' do
251
+ expect {
252
+ Swagger::Blocks.build_api_json('fake', [PetControllerV2])
253
+ }.to raise_error(Swagger::Blocks::NotSupportedError)
254
+ end
255
+ end
256
+ end