Skip to content

Commit 8f36c19

Browse files
committed
add base64 case to OpenAPIGeneratorReferenceTests
1 parent a3f8ddb commit 8f36c19

File tree

5 files changed

+442
-0
lines changed

5 files changed

+442
-0
lines changed

Tests/OpenAPIGeneratorReferenceTests/Resources/Docs/petstore.yaml

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,40 @@ paths:
225225
text/plain:
226226
schema:
227227
type: string
228+
/pets/{petId}/audio:
229+
parameters:
230+
- $ref: '#/components/parameters/path.petId'
231+
put:
232+
summary: Upload an audio recording
233+
operationId: uploadAudioForPet
234+
requestBody:
235+
required: true
236+
description: Base64-encoded audio
237+
content:
238+
application/json:
239+
schema:
240+
type: string
241+
format: byte
242+
responses:
243+
'200':
244+
description: Echoes audio back
245+
content:
246+
application/json:
247+
schema:
248+
type: string
249+
format: byte
250+
'412':
251+
description: Audio is not acceptable
252+
content:
253+
application/json:
254+
schema:
255+
type: string
256+
'500':
257+
description: Server error
258+
content:
259+
text/plain:
260+
schema:
261+
type: string
228262
components:
229263
headers:
230264
TracingHeader:

Tests/OpenAPIGeneratorReferenceTests/Resources/ReferenceSources/Petstore/Client.swift

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -484,4 +484,82 @@ public struct Client: APIProtocol {
484484
}
485485
)
486486
}
487+
/// Upload an audio recording
488+
///
489+
/// - Remark: HTTP `PUT /pets/{petId}/audio`.
490+
/// - Remark: Generated from `#/paths//pets/{petId}/audio/put(uploadAudioForPet)`.
491+
public func uploadAudioForPet(_ input: Operations.uploadAudioForPet.Input) async throws
492+
-> Operations.uploadAudioForPet.Output
493+
{
494+
try await client.send(
495+
input: input,
496+
forOperation: Operations.uploadAudioForPet.id,
497+
serializer: { input in
498+
let path = try converter.renderedPath(template: "/pets/{}/audio", parameters: [input.path.petId])
499+
var request: HTTPTypes.HTTPRequest = .init(soar_path: path, method: .put)
500+
suppressMutabilityWarning(&request)
501+
converter.setAcceptHeader(in: &request.headerFields, contentTypes: input.headers.accept)
502+
let body: OpenAPIRuntime.HTTPBody?
503+
switch input.body {
504+
case let .json(value):
505+
body = try converter.setRequiredRequestBodyAsJSON(
506+
value,
507+
headerFields: &request.headerFields,
508+
contentType: "application/json; charset=utf-8"
509+
)
510+
}
511+
return (request, body)
512+
},
513+
deserializer: { response, responseBody in
514+
switch response.status.code {
515+
case 200:
516+
let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
517+
let body: Operations.uploadAudioForPet.Output.Ok.Body
518+
if try contentType == nil
519+
|| converter.isMatchingContentType(received: contentType, expectedRaw: "application/json")
520+
{
521+
body = try await converter.getResponseBodyAsJSON(
522+
OpenAPIRuntime.Base64EncodedData.self,
523+
from: responseBody,
524+
transforming: { value in .json(value) }
525+
)
526+
} else {
527+
throw converter.makeUnexpectedContentTypeError(contentType: contentType)
528+
}
529+
return .ok(.init(body: body))
530+
case 412:
531+
let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
532+
let body: Operations.uploadAudioForPet.Output.PreconditionFailed.Body
533+
if try contentType == nil
534+
|| converter.isMatchingContentType(received: contentType, expectedRaw: "application/json")
535+
{
536+
body = try await converter.getResponseBodyAsJSON(
537+
Swift.String.self,
538+
from: responseBody,
539+
transforming: { value in .json(value) }
540+
)
541+
} else {
542+
throw converter.makeUnexpectedContentTypeError(contentType: contentType)
543+
}
544+
return .preconditionFailed(.init(body: body))
545+
case 500:
546+
let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
547+
let body: Operations.uploadAudioForPet.Output.InternalServerError.Body
548+
if try contentType == nil
549+
|| converter.isMatchingContentType(received: contentType, expectedRaw: "text/plain")
550+
{
551+
body = try converter.getResponseBodyAsBinary(
552+
OpenAPIRuntime.HTTPBody.self,
553+
from: responseBody,
554+
transforming: { value in .plainText(value) }
555+
)
556+
} else {
557+
throw converter.makeUnexpectedContentTypeError(contentType: contentType)
558+
}
559+
return .internalServerError(.init(body: body))
560+
default: return .undocumented(statusCode: response.status.code, .init())
561+
}
562+
}
563+
)
564+
}
487565
}

Tests/OpenAPIGeneratorReferenceTests/Resources/ReferenceSources/Petstore/Server.swift

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@ extension APIProtocol {
7070
method: .put,
7171
path: server.apiPathComponentsWithServerPrefix("/pets/{petId}/avatar")
7272
)
73+
try transport.register(
74+
{ try await server.uploadAudioForPet(request: $0, body: $1, metadata: $2) },
75+
method: .put,
76+
path: server.apiPathComponentsWithServerPrefix("/pets/{petId}/audio")
77+
)
7378
}
7479
}
7580
fileprivate extension UniversalServer where APIHandler: APIProtocol {
@@ -592,4 +597,95 @@ fileprivate extension UniversalServer where APIHandler: APIProtocol {
592597
}
593598
)
594599
}
600+
/// Upload an audio recording
601+
///
602+
/// - Remark: HTTP `PUT /pets/{petId}/audio`.
603+
/// - Remark: Generated from `#/paths//pets/{petId}/audio/put(uploadAudioForPet)`.
604+
func uploadAudioForPet(request: HTTPRequest, body: HTTPBody?, metadata: ServerRequestMetadata) async throws -> (
605+
HTTPResponse, HTTPBody?
606+
) {
607+
try await handle(
608+
request: request,
609+
requestBody: body,
610+
metadata: metadata,
611+
forOperation: Operations.uploadAudioForPet.id,
612+
using: { APIHandler.uploadAudioForPet($0) },
613+
deserializer: { request, requestBody, metadata in
614+
let path: Operations.uploadAudioForPet.Input.Path = .init(
615+
petId: try converter.getPathParameterAsURI(
616+
in: metadata.pathParameters,
617+
name: "petId",
618+
as: Components.Parameters.path_period_petId.self
619+
)
620+
)
621+
let headers: Operations.uploadAudioForPet.Input.Headers = .init(
622+
accept: try converter.extractAcceptHeaderIfPresent(in: request.headerFields)
623+
)
624+
let contentType = converter.extractContentTypeIfPresent(in: request.headerFields)
625+
let body: Operations.uploadAudioForPet.Input.Body
626+
if try contentType == nil
627+
|| converter.isMatchingContentType(received: contentType, expectedRaw: "application/json")
628+
{
629+
body = try await converter.getRequiredRequestBodyAsJSON(
630+
OpenAPIRuntime.Base64EncodedData.self,
631+
from: requestBody,
632+
transforming: { value in .json(value) }
633+
)
634+
} else {
635+
throw converter.makeUnexpectedContentTypeError(contentType: contentType)
636+
}
637+
return Operations.uploadAudioForPet.Input(path: path, headers: headers, body: body)
638+
},
639+
serializer: { output, request in
640+
switch output {
641+
case let .ok(value):
642+
suppressUnusedWarning(value)
643+
var response = HTTPResponse(soar_statusCode: 200)
644+
suppressMutabilityWarning(&response)
645+
let body: HTTPBody
646+
switch value.body {
647+
case let .json(value):
648+
try converter.validateAcceptIfPresent("application/json", in: request.headerFields)
649+
body = try converter.setResponseBodyAsJSON(
650+
value,
651+
headerFields: &response.headerFields,
652+
contentType: "application/json; charset=utf-8"
653+
)
654+
}
655+
return (response, body)
656+
case let .preconditionFailed(value):
657+
suppressUnusedWarning(value)
658+
var response = HTTPResponse(soar_statusCode: 412)
659+
suppressMutabilityWarning(&response)
660+
let body: HTTPBody
661+
switch value.body {
662+
case let .json(value):
663+
try converter.validateAcceptIfPresent("application/json", in: request.headerFields)
664+
body = try converter.setResponseBodyAsJSON(
665+
value,
666+
headerFields: &response.headerFields,
667+
contentType: "application/json; charset=utf-8"
668+
)
669+
}
670+
return (response, body)
671+
case let .internalServerError(value):
672+
suppressUnusedWarning(value)
673+
var response = HTTPResponse(soar_statusCode: 500)
674+
suppressMutabilityWarning(&response)
675+
let body: HTTPBody
676+
switch value.body {
677+
case let .plainText(value):
678+
try converter.validateAcceptIfPresent("text/plain", in: request.headerFields)
679+
body = try converter.setResponseBodyAsBinary(
680+
value,
681+
headerFields: &response.headerFields,
682+
contentType: "text/plain"
683+
)
684+
}
685+
return (response, body)
686+
case let .undocumented(statusCode, _): return (.init(soar_statusCode: statusCode), nil)
687+
}
688+
}
689+
)
690+
}
595691
}

0 commit comments

Comments
 (0)