Skip to content

Commit d5a3456

Browse files
committed
instead of failing to parse when an operation callback is found, ignore it gracefully (until it is supported by OpenAPIKit in the future)
1 parent 05258e4 commit d5a3456

File tree

3 files changed

+106
-2
lines changed

3 files changed

+106
-2
lines changed

Sources/OpenAPIKit/Operation/Operation.swift

+6-2
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ extension OpenAPI.Operation {
259259
case parameters
260260
case requestBody
261261
case responses
262-
// case callbacks
262+
case callbacks
263263
case deprecated
264264
case security
265265
case servers
@@ -276,7 +276,7 @@ extension OpenAPI.Operation {
276276
.parameters,
277277
.requestBody,
278278
.responses,
279-
// .callbacks,
279+
.callbacks,
280280
.deprecated,
281281
.security,
282282
.servers
@@ -305,6 +305,8 @@ extension OpenAPI.Operation {
305305
self = .requestBody
306306
case "responses":
307307
self = .responses
308+
case "callbacks":
309+
self = .callbacks
308310
case "deprecated":
309311
self = .deprecated
310312
case "security":
@@ -334,6 +336,8 @@ extension OpenAPI.Operation {
334336
return "requestBody"
335337
case .responses:
336338
return "responses"
339+
case .callbacks:
340+
return "callbacks"
337341
case .deprecated:
338342
return "deprecated"
339343
case .security:

Tests/OpenAPIKitCompatibilitySuite/SwaggerDocSamplesTests.swift

+76
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,82 @@ components:
318318
throw friendlyError
319319
}
320320
}
321+
322+
func test_callbackExample() throws {
323+
let docString = commonBaseDocument + """
324+
paths:
325+
/streams:
326+
post:
327+
description: subscribes a client to receive out-of-band data
328+
parameters:
329+
- name: callbackUrl
330+
in: query
331+
required: true
332+
description: |
333+
the location where data will be sent. Must be network accessible
334+
by the source server
335+
schema:
336+
type: string
337+
format: uri
338+
example: https://tonys-server.com
339+
responses:
340+
'201':
341+
description: subscription successfully created
342+
content:
343+
application/json:
344+
schema:
345+
description: subscription information
346+
required:
347+
- subscriptionId
348+
properties:
349+
subscriptionId:
350+
description: this unique identifier allows management of the subscription
351+
type: string
352+
example: 2531329f-fb09-4ef7-887e-84e648214436
353+
callbacks:
354+
# the name `onData` is a convenience locator
355+
onData:
356+
# when data is sent, it will be sent to the `callbackUrl` provided
357+
# when making the subscription PLUS the suffix `/data`
358+
'{$request.query.callbackUrl}/data':
359+
post:
360+
requestBody:
361+
description: subscription payload
362+
content:
363+
application/json:
364+
schema:
365+
type: object
366+
properties:
367+
timestamp:
368+
type: string
369+
format: date-time
370+
userData:
371+
type: string
372+
responses:
373+
'202':
374+
description: |
375+
Your server implementation should return this HTTP status code
376+
if the data was received successfully
377+
'204':
378+
description: |
379+
Your server should return this HTTP status code if no longer interested
380+
in further updates
381+
"""
382+
383+
// test decoding
384+
do {
385+
let doc = try YAMLDecoder().decode(OpenAPI.Document.self, from: docString)
386+
387+
// test validating
388+
try doc.validate()
389+
390+
// test dereferencing and resolving
391+
_ = try doc.locallyDereferenced().resolved()
392+
} catch let error {
393+
let friendlyError = OpenAPI.Error(from: error)
394+
throw friendlyError
395+
}
396+
}
321397
}
322398

323399
fileprivate let commonBaseDocument = """

Tests/OpenAPIKitTests/Operation/OperationTests.swift

+24
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,30 @@ extension OperationTests {
250250
XCTAssertEqual(operation.responses[200]?.reference, .component(named: "test"))
251251
}
252252

253+
func test_doesNotFailDecodingCallbacks() {
254+
let operationData =
255+
"""
256+
{
257+
"responses" : {},
258+
"callbacks" : {
259+
"callback" : {
260+
"{$request.query.queryUrl}" : {
261+
"post" : {
262+
"responses" : {
263+
"200" : {
264+
"description" : "callback successfully processed"
265+
}
266+
}
267+
}
268+
}
269+
}
270+
}
271+
}
272+
""".data(using: .utf8)!
273+
274+
XCTAssertNoThrow(try orderUnstableDecode(OpenAPI.Operation.self, from: operationData))
275+
}
276+
253277
// Note that JSONEncoder for Linux Foundation does not respect order
254278
func test_responseOrder_encode() throws {
255279
let operation = OpenAPI.Operation(

0 commit comments

Comments
 (0)