diff --git a/core/src/test/kotlin/io/bkbn/kompendium/core/KompendiumTest.kt b/core/src/test/kotlin/io/bkbn/kompendium/core/KompendiumTest.kt index d15632440..1a453b544 100644 --- a/core/src/test/kotlin/io/bkbn/kompendium/core/KompendiumTest.kt +++ b/core/src/test/kotlin/io/bkbn/kompendium/core/KompendiumTest.kt @@ -52,6 +52,7 @@ import io.bkbn.kompendium.core.util.postNoReqBody import io.bkbn.kompendium.core.util.primitives import io.bkbn.kompendium.core.util.reqRespExamples import io.bkbn.kompendium.core.util.requiredParams +import io.bkbn.kompendium.core.util.responseHeaders import io.bkbn.kompendium.core.util.returnsList import io.bkbn.kompendium.core.util.rootRoute import io.bkbn.kompendium.core.util.samePathDifferentMethodsAndAuth @@ -133,6 +134,9 @@ class KompendiumTest : DescribeSpec({ it("Can support a post request with no request body") { openApiTestAllSerializers("T0065__post_no_req_body.json") { postNoReqBody() } } + it("Can notarize a route with response headers") { + openApiTestAllSerializers("T0066__notarized_get_with_response_headers.json") { responseHeaders() } + } } describe("Route Parsing") { it("Can parse a simple path and store it under the expected route") { diff --git a/core/src/test/kotlin/io/bkbn/kompendium/core/util/NotarizedOpenApi.kt b/core/src/test/kotlin/io/bkbn/kompendium/core/util/NotarizedOpenApi.kt index 376da49e7..f6baa0029 100644 --- a/core/src/test/kotlin/io/bkbn/kompendium/core/util/NotarizedOpenApi.kt +++ b/core/src/test/kotlin/io/bkbn/kompendium/core/util/NotarizedOpenApi.kt @@ -21,6 +21,8 @@ import io.bkbn.kompendium.core.util.TestModules.defaultResponseDescription import io.bkbn.kompendium.core.util.TestModules.rootPath import io.bkbn.kompendium.json.schema.definition.TypeDefinition import io.bkbn.kompendium.oas.payload.Parameter +import io.bkbn.kompendium.oas.payload.ResponseHeader +import io.ktor.http.HttpHeaders import io.ktor.http.HttpStatusCode import io.ktor.server.application.call import io.ktor.server.application.install @@ -56,6 +58,38 @@ fun Routing.notarizedGet() { } } +fun Routing.responseHeaders() { + route(defaultPath) { + install(NotarizedRoute()) { + parameters = defaultParams + get = GetInfo.builder { + response { + responseCode(HttpStatusCode.OK) + responseType() + description(defaultResponseDescription) + responseHeaders( + mapOf( + HttpHeaders.ETag to ResponseHeader( + TypeDefinition.STRING, + "https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag" + ), + HttpHeaders.LastModified to ResponseHeader( + TypeDefinition.STRING, + "https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Last-Modified" + ), + ) + ) + } + summary(defaultPathSummary) + description(defaultPathDescription) + } + } + get { + call.respondText { "hey dude ‼️ congrats on the get request" } + } + } +} + fun Routing.notarizedPost() { route(defaultPath) { install(NotarizedRoute()) { diff --git a/core/src/test/resources/T0066__notarized_get_with_response_headers.json b/core/src/test/resources/T0066__notarized_get_with_response_headers.json new file mode 100644 index 000000000..ae3a10f04 --- /dev/null +++ b/core/src/test/resources/T0066__notarized_get_with_response_headers.json @@ -0,0 +1,106 @@ +{ + "openapi": "3.1.0", + "jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema", + "info": { + "title": "Test API", + "version": "1.33.7", + "description": "An amazing, fully-ish 😉 generated API spec", + "termsOfService": "https://example.com", + "contact": { + "name": "Homer Simpson", + "url": "https://gph.is/1NPUDiM", + "email": "chunkylover53@aol.com" + }, + "license": { + "name": "MIT", + "url": "https://github.com/bkbnio/kompendium/blob/main/LICENSE" + } + }, + "servers": [ + { + "url": "https://myawesomeapi.com", + "description": "Production instance of my API" + }, + { + "url": "https://staging.myawesomeapi.com", + "description": "Where the fun stuff happens" + } + ], + "paths": { + "/test/{a}": { + "get": { + "tags": [], + "summary": "Great Summary!", + "description": "testing more", + "parameters": [], + "responses": { + "200": { + "description": "A Successful Endeavor", + "headers": { + "ETag": { + "schema": { + "type": "string" + }, + "description": "https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag" + }, + "Last-Modified": { + "schema": { + "type": "string" + }, + "description": "https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Last-Modified" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestResponse" + } + } + } + } + }, + "deprecated": false + }, + "parameters": [ + { + "name": "a", + "in": "path", + "schema": { + "type": "string" + }, + "required": true, + "deprecated": false + }, + { + "name": "aa", + "in": "query", + "schema": { + "type": "number", + "format": "int32" + }, + "required": true, + "deprecated": false + } + ] + } + }, + "webhooks": {}, + "components": { + "schemas": { + "TestResponse": { + "type": "object", + "properties": { + "c": { + "type": "string" + } + }, + "required": [ + "c" + ] + } + }, + "securitySchemes": {} + }, + "security": [], + "tags": [] +}