Skip to content

Commit e0b5e64

Browse files
authored
Merge pull request #114 from mattpolzin/dont-fail-on-operation-callbacks
Ignore operation callbacks instead of failing to decode.
2 parents 05258e4 + d5a3456 commit e0b5e64

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)