@@ -9,13 +9,16 @@ import (
9
9
10
10
func TestExamplesSchemaValidation (t * testing.T ) {
11
11
type testCase struct {
12
- name string
13
- requestSchemaExample string
14
- responseSchemaExample string
15
- mediaTypeRequestExample string
16
- parametersExample string
17
- componentExamples string
18
- errContains string
12
+ name string
13
+ requestSchemaExample string
14
+ responseSchemaExample string
15
+ mediaTypeRequestExample string
16
+ mediaTypeResponseExample string
17
+ readWriteOnlyMediaTypeRequestExample string
18
+ readWriteOnlyMediaTypeResponseExample string
19
+ parametersExample string
20
+ componentExamples string
21
+ errContains string
19
22
}
20
23
21
24
testCases := []testCase {
@@ -26,7 +29,7 @@ func TestExamplesSchemaValidation(t *testing.T) {
26
29
param1example:
27
30
value: abcd
28
31
` ,
29
- errContains : " invalid paths: invalid path /user: invalid operation POST: param1example" ,
32
+ errContains : ` invalid paths: invalid path /user: invalid operation POST: param1example` ,
30
33
},
31
34
{
32
35
name : "valid_parameter_examples" ,
@@ -41,7 +44,7 @@ func TestExamplesSchemaValidation(t *testing.T) {
41
44
parametersExample : `
42
45
example: abcd
43
46
` ,
44
- errContains : " invalid path /user: invalid operation POST: invalid example" ,
47
+ errContains : ` invalid path /user: invalid operation POST: invalid example` ,
45
48
},
46
49
{
47
50
name : "valid_parameter_example" ,
@@ -64,7 +67,7 @@ func TestExamplesSchemaValidation(t *testing.T) {
64
67
email: bad
65
68
password: short
66
69
` ,
67
- errContains : " invalid paths: invalid path /user: invalid operation POST: example BadUser" ,
70
+ errContains : ` invalid paths: invalid path /user: invalid operation POST: example BadUser` ,
68
71
},
69
72
{
70
73
name : "valid_component_examples" ,
@@ -90,7 +93,7 @@ func TestExamplesSchemaValidation(t *testing.T) {
90
93
email: bad
91
94
password: short
92
95
` ,
93
- errContains : " invalid path /user: invalid operation POST: invalid example" ,
96
+ errContains : ` invalid path /user: invalid operation POST: invalid example` ,
94
97
},
95
98
{
96
99
name : "valid_mediatype_examples" ,
@@ -109,7 +112,7 @@ func TestExamplesSchemaValidation(t *testing.T) {
109
112
110
113
# missing password
111
114
` ,
112
- errContains : " schema \ " CreateUserRequest\ " : invalid example" ,
115
+ errContains : ` schema "CreateUserRequest": invalid example` ,
113
116
},
114
117
{
115
118
name : "valid_schema_request_example" ,
@@ -127,15 +130,72 @@ func TestExamplesSchemaValidation(t *testing.T) {
127
130
user_id: 1
128
131
# missing access_token
129
132
` ,
130
- errContains : " schema \ " CreateUserResponse\ " : invalid example" ,
133
+ errContains : ` schema "CreateUserResponse": invalid example` ,
131
134
},
132
135
{
133
136
name : "valid_schema_response_example" ,
134
137
responseSchemaExample : `
135
138
example:
136
139
user_id: 1
137
140
access_token: "abcd"
138
- ` ,
141
+ ` ,
142
+ },
143
+ {
144
+ name : "valid_readonly_writeonly_examples" ,
145
+ readWriteOnlyMediaTypeRequestExample : `
146
+ examples:
147
+ ReadWriteOnlyRequest:
148
+ $ref: '#/components/examples/ReadWriteOnlyRequestData'
149
+ ` ,
150
+ readWriteOnlyMediaTypeResponseExample : `
151
+ examples:
152
+ ReadWriteOnlyResponse:
153
+ $ref: '#/components/examples/ReadWriteOnlyResponseData'
154
+ ` ,
155
+ componentExamples : `
156
+ examples:
157
+ ReadWriteOnlyRequestData:
158
+ value:
159
+ username: user
160
+ password: password
161
+ ReadWriteOnlyResponseData:
162
+ value:
163
+ user_id: 4321
164
+ ` ,
165
+ },
166
+ {
167
+ name : "invalid_readonly_request_examples" ,
168
+ readWriteOnlyMediaTypeRequestExample : `
169
+ examples:
170
+ ReadWriteOnlyRequest:
171
+ $ref: '#/components/examples/ReadWriteOnlyRequestData'
172
+ ` ,
173
+ componentExamples : `
174
+ examples:
175
+ ReadWriteOnlyRequestData:
176
+ value:
177
+ username: user
178
+ password: password
179
+ user_id: 4321
180
+ ` ,
181
+ errContains : `ReadWriteOnlyRequest: readOnly property "user_id" in request` ,
182
+ },
183
+ {
184
+ name : "invalid_writeonly_response_examples" ,
185
+ readWriteOnlyMediaTypeResponseExample : `
186
+ examples:
187
+ ReadWriteOnlyResponse:
188
+ $ref: '#/components/examples/ReadWriteOnlyResponseData'
189
+ ` ,
190
+ componentExamples : `
191
+ examples:
192
+ ReadWriteOnlyResponseData:
193
+ value:
194
+ password: password
195
+ user_id: 4321
196
+ ` ,
197
+
198
+ errContains : `ReadWriteOnlyResponse: writeOnly property "password" in response` ,
139
199
},
140
200
}
141
201
@@ -198,7 +258,28 @@ paths:
198
258
content:
199
259
application/json:
200
260
schema:
201
- $ref: "#/components/schemas/CreateUserResponse"
261
+ $ref: "#/components/schemas/CreateUserResponse"` )
262
+ spec .WriteString (tc .mediaTypeResponseExample )
263
+ spec .WriteString (`
264
+ /readWriteOnly:
265
+ post:
266
+ requestBody:
267
+ content:
268
+ application/json:
269
+ schema:
270
+ $ref: "#/components/schemas/ReadWriteOnlyData"
271
+ required: true` )
272
+ spec .WriteString (tc .readWriteOnlyMediaTypeRequestExample )
273
+ spec .WriteString (`
274
+ responses:
275
+ '201':
276
+ description: a response
277
+ content:
278
+ application/json:
279
+ schema:
280
+ $ref: "#/components/schemas/ReadWriteOnlyData"` )
281
+ spec .WriteString (tc .readWriteOnlyMediaTypeResponseExample )
282
+ spec .WriteString (`
202
283
components:
203
284
schemas:
204
285
CreateUserRequest:` )
@@ -223,7 +304,6 @@ components:
223
304
CreateUserResponse:` )
224
305
spec .WriteString (tc .responseSchemaExample )
225
306
spec .WriteString (`
226
- description: represents the response to a User creation
227
307
required:
228
308
- access_token
229
309
- user_id
@@ -234,6 +314,28 @@ components:
234
314
format: int64
235
315
type: integer
236
316
type: object
317
+ ReadWriteOnlyData:
318
+ required:
319
+ # only required in request
320
+ - username
321
+ - password
322
+ # only required in response
323
+ - user_id
324
+ properties:
325
+ username:
326
+ type: string
327
+ default: default
328
+ writeOnly: true # only sent in a request
329
+ password:
330
+ type: string
331
+ default: default
332
+ writeOnly: true # only sent in a request
333
+ user_id:
334
+ format: int64
335
+ default: 1
336
+ type: integer
337
+ readOnly: true # only returned in a response
338
+ type: object
237
339
` )
238
340
spec .WriteString (tc .componentExamples )
239
341
@@ -278,7 +380,7 @@ func TestExampleObjectValidation(t *testing.T) {
278
380
279
381
password: validpassword
280
382
` ,
281
- errContains : " invalid path /user: invalid operation POST: example and examples are mutually exclusive" ,
383
+ errContains : ` invalid path /user: invalid operation POST: example and examples are mutually exclusive` ,
282
384
componentExamples : `
283
385
examples:
284
386
BadUser:
@@ -295,7 +397,7 @@ func TestExampleObjectValidation(t *testing.T) {
295
397
BadUser:
296
398
description: empty user example
297
399
` ,
298
- errContains : " invalid components: example \ " BadUser\ " : no value or externalValue field" ,
400
+ errContains : ` invalid components: example "BadUser": no value or externalValue field` ,
299
401
},
300
402
{
301
403
name : "value_externalValue_mutual_exclusion" ,
@@ -308,7 +410,7 @@ func TestExampleObjectValidation(t *testing.T) {
308
410
password: validpassword
309
411
externalValue: 'http://example.com/examples/example'
310
412
` ,
311
- errContains : " invalid components: example \ " BadUser\ " : value and externalValue are mutually exclusive" ,
413
+ errContains : ` invalid components: example "BadUser": value and externalValue are mutually exclusive` ,
312
414
},
313
415
}
314
416
0 commit comments