major: ktor 3.0.0 support - fixes #644 (#645)

This commit is contained in:
knmueller
2024-10-30 16:21:46 -04:00
committed by GitHub
parent fa7b1e5833
commit 21f922a296
44 changed files with 151 additions and 777 deletions

View File

@ -20,6 +20,7 @@ sourdoughLibrary {
dependencies {
// VERSIONS
val kotestVersion: String by project
val kotlinSerializeVersion: String by project
val ktorVersion: String by project
val detektVersion: String by project
@ -43,7 +44,7 @@ dependencies {
testFixturesApi("io.kotest:kotest-assertions-core-jvm:$kotestVersion")
testFixturesApi("io.kotest:kotest-property-jvm:$kotestVersion")
testFixturesApi("io.kotest:kotest-assertions-json-jvm:$kotestVersion")
testFixturesApi("io.kotest:kotest-assertions-ktor-jvm:4.4.3")
testFixturesApi("io.kotest.extensions:kotest-assertions-ktor:2.0.0")
testFixturesApi("io.ktor:ktor-server-core:$ktorVersion")
testFixturesApi("io.ktor:ktor-server-test-host:$ktorVersion")
@ -57,7 +58,7 @@ dependencies {
testFixturesApi("dev.forst:ktor-api-key:2.2.4")
testFixturesApi("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3")
testFixturesApi("org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlinSerializeVersion")
}
testing {

View File

@ -6,7 +6,6 @@ import io.bkbn.kompendium.json.schema.SchemaConfigurator
import io.bkbn.kompendium.json.schema.definition.JsonSchema
import io.bkbn.kompendium.json.schema.util.Helpers.getSimpleSlug
import io.bkbn.kompendium.oas.OpenApiSpec
import io.ktor.server.application.call
import io.ktor.server.application.createApplicationPlugin
import io.ktor.server.response.respond
import io.ktor.server.routing.Routing

View File

@ -78,7 +78,7 @@ object NotarizedRoute {
fun Route.calculateRoutePath() = toString()
.let {
application.environment.rootPath.takeIf { root -> root.isNotEmpty() }
application.rootPath.takeIf { root -> root.isNotEmpty() }
?.let { root ->
val sanitizedRoute = if (root.startsWith("/")) root else "/$root"
it.replace(sanitizedRoute, "")

View File

@ -18,6 +18,7 @@ import io.ktor.http.HttpMethod
import io.ktor.server.application.install
import io.ktor.server.auth.Authentication
import io.ktor.server.auth.OAuthServerSettings
import io.ktor.server.auth.Principal
import io.ktor.server.auth.UserIdPrincipal
import io.ktor.server.auth.basic
import io.ktor.server.auth.jwt.jwt
@ -92,14 +93,18 @@ class KompendiumAuthenticationTest : DescribeSpec({
) { customAuthConfig() }
}
it("Can provide multiple authentication strategies") {
data class TestAppPrincipal(val key: String) : Principal
TestHelpers.openApiTestAllSerializers(
snapshotName = "T0047__multiple_auth_strategies.json",
applicationSetup = {
install(Authentication) {
apiKey("api-key") {
headerName = "X-API-KEY"
validate {
UserIdPrincipal("Placeholder")
validate { key ->
// api key library (dev.forst.ktor.apikey) is using the deprecated `Principal` class
key
.takeIf { it == "api-key" }
?.let { TestAppPrincipal(it) }
}
}
jwt("jwt") {

View File

@ -38,7 +38,6 @@ import io.bkbn.kompendium.oas.security.BasicAuth
import io.bkbn.kompendium.oas.serialization.KompendiumSerializersModule
import io.kotest.core.spec.style.DescribeSpec
import io.ktor.serialization.kotlinx.json.json
import io.ktor.server.application.call
import io.ktor.server.application.install
import io.ktor.server.auth.Authentication
import io.ktor.server.auth.UserIdPrincipal
@ -182,13 +181,16 @@ class KompendiumTest : DescribeSpec({
it("Can generate paths without application root-path") {
openApiTestAllSerializers(
"T0054__app_with_rootpath.json",
applicationEnvironmentBuilder = {
applicationSetup = {
rootPath = "/example"
},
specOverrides = {
copy(
servers = servers.map { it.copy(url = URI("${it.url}/example")) }.toMutableList()
)
},
serverConfigSetup = {
rootPath = "/example"
}
) { notarizedGet() }
}
@ -202,12 +204,10 @@ class KompendiumTest : DescribeSpec({
snapshotName = "T0072__custom_serialization_strategy.json",
notarizedApplicationConfigOverrides = {
specRoute = { spec, routing ->
routing {
route("/openapi.json") {
get {
call.response.headers.append("Content-Type", "application/json")
call.respondText { customJsonEncoder.encodeToString(spec) }
}
routing.route("/openapi.json") {
get {
call.response.headers.append("Content-Type", "application/json")
call.respondText { customJsonEncoder.encodeToString(spec) }
}
}
}

View File

@ -9,13 +9,11 @@ import io.bkbn.kompendium.core.util.TestModules.defaultPathSummary
import io.bkbn.kompendium.core.util.TestModules.defaultResponseDescription
import io.bkbn.kompendium.core.util.TestModules.rootPath
import io.ktor.http.HttpStatusCode
import io.ktor.server.application.install
import io.ktor.server.auth.authenticate
import io.ktor.server.routing.Routing
import io.ktor.server.routing.post
import io.ktor.server.routing.Route
import io.ktor.server.routing.route
fun Routing.defaultAuthConfig() {
fun Route.defaultAuthConfig() {
authenticate("basic") {
route(rootPath) {
basicGetGenerator<TestResponse>()
@ -23,7 +21,7 @@ fun Routing.defaultAuthConfig() {
}
}
fun Routing.customAuthConfig() {
fun Route.customAuthConfig() {
authenticate("auth-oauth-google") {
route(rootPath) {
install(NotarizedRoute()) {
@ -44,7 +42,7 @@ fun Routing.customAuthConfig() {
}
}
fun Routing.customScopesOnSiblingPathOperations() {
fun Route.customScopesOnSiblingPathOperations() {
authenticate("auth-oauth-google") {
route(rootPath) {
install(NotarizedRoute()) {
@ -81,7 +79,7 @@ fun Routing.customScopesOnSiblingPathOperations() {
}
}
fun Routing.multipleAuthStrategies() {
fun Route.multipleAuthStrategies() {
authenticate("jwt", "api-key") {
route(rootPath) {
basicGetGenerator<TestResponse>()

View File

@ -12,11 +12,10 @@ import io.bkbn.kompendium.enrichment.NumberEnrichment
import io.bkbn.kompendium.enrichment.ObjectEnrichment
import io.bkbn.kompendium.enrichment.StringEnrichment
import io.ktor.http.HttpStatusCode
import io.ktor.server.application.install
import io.ktor.server.routing.Routing
import io.ktor.server.routing.Route
import io.ktor.server.routing.route
fun Routing.intConstraints() {
fun Route.intConstraints() {
route(defaultPath) {
install(NotarizedRoute()) {
get = GetInfo.builder {
@ -43,7 +42,7 @@ fun Routing.intConstraints() {
}
}
fun Routing.doubleConstraints() {
fun Route.doubleConstraints() {
route(defaultPath) {
install(NotarizedRoute()) {
get = GetInfo.builder {
@ -70,7 +69,7 @@ fun Routing.doubleConstraints() {
}
}
fun Routing.stringConstraints() {
fun Route.stringConstraints() {
route(defaultPath) {
install(NotarizedRoute()) {
get = GetInfo.builder {
@ -96,7 +95,7 @@ fun Routing.stringConstraints() {
}
}
fun Routing.stringPatternConstraints() {
fun Route.stringPatternConstraints() {
route(defaultPath) {
install(NotarizedRoute()) {
get = GetInfo.builder {
@ -121,7 +120,7 @@ fun Routing.stringPatternConstraints() {
}
}
fun Routing.stringContentEncodingConstraints() {
fun Route.stringContentEncodingConstraints() {
route(defaultPath) {
install(NotarizedRoute()) {
get = GetInfo.builder {
@ -147,7 +146,7 @@ fun Routing.stringContentEncodingConstraints() {
}
}
fun Routing.arrayConstraints() {
fun Route.arrayConstraints() {
route(defaultPath) {
install(NotarizedRoute()) {
get = GetInfo.builder {

View File

@ -3,8 +3,8 @@ package io.bkbn.kompendium.core.util
import io.bkbn.kompendium.core.fixtures.SerialNameObject
import io.bkbn.kompendium.core.fixtures.TransientObject
import io.bkbn.kompendium.core.fixtures.UnbackedObject
import io.ktor.server.routing.Routing
import io.ktor.server.routing.Route
fun Routing.ignoredFieldsResponse() = basicGetGenerator<TransientObject>()
fun Routing.unbackedFieldsResponse() = basicGetGenerator<UnbackedObject>()
fun Routing.customFieldNameResponse() = basicGetGenerator<SerialNameObject>()
fun Route.ignoredFieldsResponse() = basicGetGenerator<TransientObject>()
fun Route.unbackedFieldsResponse() = basicGetGenerator<UnbackedObject>()
fun Route.customFieldNameResponse() = basicGetGenerator<SerialNameObject>()

View File

@ -3,9 +3,9 @@ package io.bkbn.kompendium.core.util
import io.bkbn.kompendium.core.fixtures.TestResponse
import io.bkbn.kompendium.json.schema.definition.TypeDefinition
import io.bkbn.kompendium.oas.payload.Parameter
import io.ktor.server.routing.Routing
import io.ktor.server.routing.Route
fun Routing.defaultParameter() = basicGetGenerator<TestResponse>(
fun Route.defaultParameter() = basicGetGenerator<TestResponse>(
params = listOf(
Parameter(
name = "id",

View File

@ -16,11 +16,10 @@ import io.bkbn.kompendium.enrichment.NumberEnrichment
import io.bkbn.kompendium.enrichment.ObjectEnrichment
import io.bkbn.kompendium.enrichment.StringEnrichment
import io.ktor.http.HttpStatusCode
import io.ktor.server.application.install
import io.ktor.server.routing.Routing
import io.ktor.server.routing.Route
import io.ktor.server.routing.route
fun Routing.enrichedSimpleResponse() {
fun Route.enrichedSimpleResponse() {
route("/enriched") {
install(NotarizedRoute()) {
get = GetInfo.builder {
@ -44,7 +43,7 @@ fun Routing.enrichedSimpleResponse() {
}
}
fun Routing.enrichedSimpleRequest() {
fun Route.enrichedSimpleRequest() {
route("/example") {
install(NotarizedRoute()) {
parameters = TestModules.defaultParams
@ -78,7 +77,7 @@ fun Routing.enrichedSimpleRequest() {
}
}
fun Routing.enrichedNestedCollection() {
fun Route.enrichedNestedCollection() {
route("/example") {
install(NotarizedRoute()) {
parameters = TestModules.defaultParams
@ -114,7 +113,7 @@ fun Routing.enrichedNestedCollection() {
}
}
fun Routing.enrichedTopLevelCollection() {
fun Route.enrichedTopLevelCollection() {
route("/example") {
install(NotarizedRoute()) {
parameters = TestModules.defaultParams
@ -150,7 +149,7 @@ fun Routing.enrichedTopLevelCollection() {
}
}
fun Routing.enrichedComplexGenericType() {
fun Route.enrichedComplexGenericType() {
route("/example") {
install(NotarizedRoute()) {
parameters = TestModules.defaultParams
@ -193,7 +192,7 @@ fun Routing.enrichedComplexGenericType() {
}
}
fun Routing.enrichedGenericResponse() {
fun Route.enrichedGenericResponse() {
route("/example") {
install(NotarizedRoute()) {
get = GetInfo.builder {
@ -228,7 +227,7 @@ fun Routing.enrichedGenericResponse() {
}
}
fun Routing.enrichedMap() {
fun Route.enrichedMap() {
route("/example") {
install(NotarizedRoute()) {
get = GetInfo.builder {

View File

@ -3,10 +3,10 @@ package io.bkbn.kompendium.core.util
import io.bkbn.kompendium.core.fixtures.TestResponse
import io.bkbn.kompendium.core.util.TestModules.defaultPath
import io.ktor.server.auth.authenticate
import io.ktor.server.routing.Routing
import io.ktor.server.routing.Route
import io.ktor.server.routing.route
fun Routing.samePathSameMethod() {
fun Route.samePathSameMethod() {
route(defaultPath) {
basicGetGenerator<TestResponse>()
authenticate("basic") {

View File

@ -14,11 +14,10 @@ import io.bkbn.kompendium.json.schema.definition.TypeDefinition
import io.bkbn.kompendium.oas.payload.MediaType
import io.bkbn.kompendium.oas.payload.Parameter
import io.ktor.http.HttpStatusCode
import io.ktor.server.application.install
import io.ktor.server.routing.Routing
import io.ktor.server.routing.Route
import io.ktor.server.routing.route
fun Routing.reqRespExamples() {
fun Route.reqRespExamples() {
route(rootPath) {
install(NotarizedRoute()) {
post = PostInfo.builder {
@ -44,7 +43,7 @@ fun Routing.reqRespExamples() {
}
}
fun Routing.exampleParams() = basicGetGenerator<TestResponse>(
fun Route.exampleParams() = basicGetGenerator<TestResponse>(
params = listOf(
Parameter(
name = "id",
@ -57,7 +56,7 @@ fun Routing.exampleParams() = basicGetGenerator<TestResponse>(
)
)
fun Routing.optionalReqExample() {
fun Route.optionalReqExample() {
route(rootPath) {
install(NotarizedRoute()) {
post = PostInfo.builder {
@ -84,7 +83,7 @@ fun Routing.optionalReqExample() {
}
}
fun Routing.exampleSummaryAndDescription() {
fun Route.exampleSummaryAndDescription() {
route(rootPath) {
install(NotarizedRoute()) {
post = PostInfo.builder {

View File

@ -11,11 +11,10 @@ import io.bkbn.kompendium.core.util.TestModules.defaultPathSummary
import io.bkbn.kompendium.core.util.TestModules.defaultResponseDescription
import io.bkbn.kompendium.core.util.TestModules.rootPath
import io.ktor.http.HttpStatusCode
import io.ktor.server.application.install
import io.ktor.server.routing.Routing
import io.ktor.server.routing.Route
import io.ktor.server.routing.route
fun Routing.singleException() {
fun Route.singleException() {
route(rootPath) {
install(NotarizedRoute()) {
get = GetInfo.builder {
@ -36,7 +35,7 @@ fun Routing.singleException() {
}
}
fun Routing.multipleExceptions() {
fun Route.multipleExceptions() {
route(rootPath) {
install(NotarizedRoute()) {
get = GetInfo.builder {
@ -62,7 +61,7 @@ fun Routing.multipleExceptions() {
}
}
fun Routing.polymorphicException() {
fun Route.polymorphicException() {
route(rootPath) {
install(NotarizedRoute()) {
get = GetInfo.builder {
@ -83,7 +82,7 @@ fun Routing.polymorphicException() {
}
}
fun Routing.genericException() {
fun Route.genericException() {
route(rootPath) {
install(NotarizedRoute()) {
get = GetInfo.builder {

View File

@ -21,17 +21,16 @@ import io.bkbn.kompendium.core.util.TestModules.defaultResponseDescription
import io.bkbn.kompendium.json.schema.definition.TypeDefinition
import io.bkbn.kompendium.oas.payload.Parameter
import io.ktor.http.HttpStatusCode
import io.ktor.server.application.install
import io.ktor.server.auth.authenticate
import io.ktor.server.routing.Routing
import io.ktor.server.routing.Route
import io.ktor.server.routing.route
fun Routing.withOperationId() = basicGetGenerator<TestResponse>(operationId = "getThisDude")
fun Routing.nullableNestedObject() = basicGetGenerator<ProfileUpdateRequest>()
fun Routing.nullableEnumField() = basicGetGenerator<NullableEnum>()
fun Routing.nullableReference() = basicGetGenerator<ManyThings>()
fun Routing.dateTimeString() = basicGetGenerator<DateTimeString>()
fun Routing.headerParameter() = basicGetGenerator<TestResponse>(
fun Route.withOperationId() = basicGetGenerator<TestResponse>(operationId = "getThisDude")
fun Route.nullableNestedObject() = basicGetGenerator<ProfileUpdateRequest>()
fun Route.nullableEnumField() = basicGetGenerator<NullableEnum>()
fun Route.nullableReference() = basicGetGenerator<ManyThings>()
fun Route.dateTimeString() = basicGetGenerator<DateTimeString>()
fun Route.headerParameter() = basicGetGenerator<TestResponse>(
params = listOf(
Parameter(
name = "X-User-Email",
@ -42,10 +41,10 @@ fun Routing.headerParameter() = basicGetGenerator<TestResponse>(
)
)
fun Routing.nestedTypeName() = basicGetGenerator<Nested.Response>()
fun Routing.topLevelNullable() = basicGetGenerator<TestResponse?>()
fun Routing.simpleRecursive() = basicGetGenerator<ColumnSchema>()
fun Routing.samePathDifferentMethodsAndAuth() {
fun Route.nestedTypeName() = basicGetGenerator<Nested.Response>()
fun Route.topLevelNullable() = basicGetGenerator<TestResponse?>()
fun Route.simpleRecursive() = basicGetGenerator<ColumnSchema>()
fun Route.samePathDifferentMethodsAndAuth() {
route(defaultPath) {
install(NotarizedRoute()) {
parameters = defaultParams

View File

@ -26,11 +26,9 @@ import io.bkbn.kompendium.oas.payload.Header
import io.bkbn.kompendium.oas.payload.Parameter
import io.ktor.http.HttpHeaders
import io.ktor.http.HttpStatusCode
import io.ktor.server.application.call
import io.ktor.server.application.install
import io.ktor.server.response.respond
import io.ktor.server.response.respondText
import io.ktor.server.routing.Routing
import io.ktor.server.routing.Route
import io.ktor.server.routing.delete
import io.ktor.server.routing.get
import io.ktor.server.routing.head
@ -40,7 +38,7 @@ import io.ktor.server.routing.post
import io.ktor.server.routing.put
import io.ktor.server.routing.route
fun Routing.notarizedGet() {
fun Route.notarizedGet() {
route(defaultPath) {
install(NotarizedRoute()) {
parameters = defaultParams
@ -60,7 +58,7 @@ fun Routing.notarizedGet() {
}
}
fun Routing.responseHeaders() {
fun Route.responseHeaders() {
route(defaultPath) {
install(NotarizedRoute()) {
parameters = defaultParams
@ -92,7 +90,7 @@ fun Routing.responseHeaders() {
}
}
fun Routing.notarizedPost() {
fun Route.notarizedPost() {
route(defaultPath) {
install(NotarizedRoute()) {
parameters = defaultParams
@ -116,7 +114,7 @@ fun Routing.notarizedPost() {
}
}
fun Routing.notarizedPut() {
fun Route.notarizedPut() {
route(defaultPath) {
install(NotarizedRoute()) {
parameters = defaultParams
@ -140,7 +138,7 @@ fun Routing.notarizedPut() {
}
}
fun Routing.notarizedDelete() {
fun Route.notarizedDelete() {
route(defaultPath) {
install(NotarizedRoute()) {
parameters = defaultParams
@ -160,7 +158,7 @@ fun Routing.notarizedDelete() {
}
}
fun Routing.notarizedPatch() {
fun Route.notarizedPatch() {
route(defaultPath) {
install(NotarizedRoute()) {
parameters = defaultParams
@ -184,7 +182,7 @@ fun Routing.notarizedPatch() {
}
}
fun Routing.notarizedHead() {
fun Route.notarizedHead() {
route(defaultPath) {
install(NotarizedRoute()) {
parameters = defaultParams
@ -205,7 +203,7 @@ fun Routing.notarizedHead() {
}
}
fun Routing.notarizedOptions() {
fun Route.notarizedOptions() {
route(defaultPath) {
install(NotarizedRoute()) {
parameters = defaultParams
@ -225,7 +223,7 @@ fun Routing.notarizedOptions() {
}
}
fun Routing.complexRequest() {
fun Route.complexRequest() {
route(rootPath) {
install(NotarizedRoute()) {
put = PutInfo.builder {
@ -248,7 +246,7 @@ fun Routing.complexRequest() {
}
}
fun Routing.primitives() {
fun Route.primitives() {
route(rootPath) {
install(NotarizedRoute()) {
put = PutInfo.builder {
@ -268,7 +266,7 @@ fun Routing.primitives() {
}
}
fun Routing.returnsList() {
fun Route.returnsList() {
route(defaultPath) {
install(NotarizedRoute()) {
parameters = defaultParams
@ -285,7 +283,7 @@ fun Routing.returnsList() {
}
}
fun Routing.returnsEnumList() {
fun Route.returnsEnumList() {
route(defaultPath) {
install(NotarizedRoute()) {
parameters = defaultParams
@ -302,7 +300,7 @@ fun Routing.returnsEnumList() {
}
}
fun Routing.nonRequiredParams() {
fun Route.nonRequiredParams() {
route("/optional") {
install(NotarizedRoute()) {
parameters = listOf(
@ -331,7 +329,7 @@ fun Routing.nonRequiredParams() {
}
}
fun Routing.overrideMediaTypes() {
fun Route.overrideMediaTypes() {
route("/media_types") {
install(NotarizedRoute()) {
put = PutInfo.builder {
@ -353,7 +351,7 @@ fun Routing.overrideMediaTypes() {
}
}
fun Routing.postNoReqBody() {
fun Route.postNoReqBody() {
route("/no_req_body") {
install(NotarizedRoute()) {
post = PostInfo.builder {
@ -369,7 +367,7 @@ fun Routing.postNoReqBody() {
}
}
fun Routing.fieldOutsideConstructor() {
fun Route.fieldOutsideConstructor() {
route("/field_outside_constructor") {
install(NotarizedRoute()) {
post = PostInfo.builder {

View File

@ -10,17 +10,17 @@ import io.bkbn.kompendium.core.fixtures.Gibbity
import io.bkbn.kompendium.core.fixtures.Gizmo
import io.bkbn.kompendium.core.fixtures.MultiNestedGenerics
import io.bkbn.kompendium.core.fixtures.Page
import io.ktor.server.routing.Routing
import io.ktor.server.routing.Route
fun Routing.polymorphicResponse() = basicGetGenerator<FlibbityGibbit>()
fun Routing.polymorphicCollectionResponse() = basicGetGenerator<List<FlibbityGibbit>>()
fun Routing.polymorphicMapResponse() = basicGetGenerator<Map<String, FlibbityGibbit>>()
fun Routing.simpleGenericResponse() = basicGetGenerator<Gibbity<String>>()
fun Routing.gnarlyGenericResponse() = basicGetGenerator<Foosy<Barzo<Int>, String>>()
fun Routing.nestedGenericResponse() = basicGetGenerator<Gibbity<Map<String, String>>>()
fun Routing.genericPolymorphicResponse() = basicGetGenerator<Flibbity<Double>>()
fun Routing.genericPolymorphicResponseMultipleImpls() = basicGetGenerator<Flibbity<FlibbityGibbit>>()
fun Routing.nestedGenericCollection() = basicGetGenerator<Page<Int>>()
fun Routing.nestedGenericMultipleParamsCollection() = basicGetGenerator<MultiNestedGenerics<String, ComplexRequest>>()
fun Routing.overrideSealedTypeIdentifier() = basicGetGenerator<ChillaxificationMaximization>()
fun Routing.subtypeNotCompleteSetOfParentProperties() = basicGetGenerator<Gizmo>()
fun Route.polymorphicResponse() = basicGetGenerator<FlibbityGibbit>()
fun Route.polymorphicCollectionResponse() = basicGetGenerator<List<FlibbityGibbit>>()
fun Route.polymorphicMapResponse() = basicGetGenerator<Map<String, FlibbityGibbit>>()
fun Route.simpleGenericResponse() = basicGetGenerator<Gibbity<String>>()
fun Route.gnarlyGenericResponse() = basicGetGenerator<Foosy<Barzo<Int>, String>>()
fun Route.nestedGenericResponse() = basicGetGenerator<Gibbity<Map<String, String>>>()
fun Route.genericPolymorphicResponse() = basicGetGenerator<Flibbity<Double>>()
fun Route.genericPolymorphicResponseMultipleImpls() = basicGetGenerator<Flibbity<FlibbityGibbit>>()
fun Route.nestedGenericCollection() = basicGetGenerator<Page<Int>>()
fun Route.nestedGenericMultipleParamsCollection() = basicGetGenerator<MultiNestedGenerics<String, ComplexRequest>>()
fun Route.overrideSealedTypeIdentifier() = basicGetGenerator<ChillaxificationMaximization>()
fun Route.subtypeNotCompleteSetOfParentProperties() = basicGetGenerator<Gizmo>()

View File

@ -5,9 +5,9 @@ import io.bkbn.kompendium.core.fixtures.NullableField
import io.bkbn.kompendium.core.fixtures.TestResponse
import io.bkbn.kompendium.json.schema.definition.TypeDefinition
import io.bkbn.kompendium.oas.payload.Parameter
import io.ktor.server.routing.Routing
import io.ktor.server.routing.Route
fun Routing.requiredParams() = basicGetGenerator<TestResponse>(
fun Route.requiredParams() = basicGetGenerator<TestResponse>(
params = listOf(
Parameter(
name = "id",
@ -17,7 +17,7 @@ fun Routing.requiredParams() = basicGetGenerator<TestResponse>(
)
)
fun Routing.nonRequiredParam() = basicGetGenerator<TestResponse>(
fun Route.nonRequiredParam() = basicGetGenerator<TestResponse>(
params = listOf(
Parameter(
name = "id",
@ -28,5 +28,5 @@ fun Routing.nonRequiredParam() = basicGetGenerator<TestResponse>(
)
)
fun Routing.defaultField() = basicGetGenerator<DefaultField>()
fun Routing.nullableField() = basicGetGenerator<NullableField>()
fun Route.defaultField() = basicGetGenerator<DefaultField>()
fun Route.nullableField() = basicGetGenerator<NullableField>()

View File

@ -11,12 +11,11 @@ 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.ktor.http.HttpStatusCode
import io.ktor.server.application.install
import io.ktor.server.routing.Routing
import io.ktor.server.routing.Route
import io.ktor.server.routing.route
import io.ktor.server.routing.param
fun Routing.simplePathParsing() {
fun Route.simplePathParsing() {
route("/this") {
route("/is") {
route("/a") {
@ -49,7 +48,7 @@ fun Routing.simplePathParsing() {
}
}
fun Routing.rootRoute() {
fun Route.rootRoute() {
route(rootPath) {
install(NotarizedRoute()) {
parameters = listOf(defaultParams.last())
@ -66,7 +65,7 @@ fun Routing.rootRoute() {
}
}
fun Routing.nestedUnderRoot() {
fun Route.nestedUnderRoot() {
route("/") {
route("/testerino") {
install(NotarizedRoute()) {
@ -84,7 +83,7 @@ fun Routing.nestedUnderRoot() {
}
}
fun Routing.trailingSlash() {
fun Route.trailingSlash() {
route("/test") {
route("/") {
install(NotarizedRoute()) {
@ -102,7 +101,7 @@ fun Routing.trailingSlash() {
}
}
fun Routing.paramWrapper() {
fun Route.paramWrapper() {
route("/test") {
param("a") {
param("b") {

View File

@ -9,7 +9,6 @@ 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.ktor.http.HttpStatusCode
import io.ktor.server.application.install
import io.ktor.server.routing.Route
import io.ktor.server.routing.Routing
import io.ktor.server.routing.route

View File

@ -17,10 +17,11 @@ import io.ktor.client.statement.bodyAsText
import io.ktor.http.HttpStatusCode
import io.ktor.serialization.kotlinx.json.json
import io.ktor.server.application.Application
import io.ktor.server.engine.ApplicationEngineEnvironmentBuilder
import io.ktor.server.application.ServerConfigBuilder
import io.ktor.server.engine.ApplicationEnvironmentBuilder
import io.ktor.server.plugins.contentnegotiation.ContentNegotiation
import io.ktor.server.plugins.contentnegotiation.ContentNegotiationConfig
import io.ktor.server.routing.Routing
import io.ktor.server.routing.Route
import io.ktor.server.testing.ApplicationTestBuilder
import io.ktor.server.testing.testApplication
import kotlinx.serialization.json.Json
@ -59,7 +60,7 @@ object TestHelpers {
customTypes: Map<KType, JsonSchema> = emptyMap(),
applicationSetup: Application.() -> Unit = { },
specOverrides: OpenApiSpec.() -> OpenApiSpec = { this },
applicationEnvironmentBuilder: ApplicationEngineEnvironmentBuilder.() -> Unit = {},
applicationEnvironmentBuilder: ApplicationEnvironmentBuilder.() -> Unit = {},
notarizedApplicationConfigOverrides: NotarizedApplication.Config.() -> Unit = {},
contentNegotiation: ContentNegotiationConfig.() -> Unit = {
json(Json {
@ -68,7 +69,9 @@ object TestHelpers {
serializersModule = KompendiumSerializersModule.module
})
},
routeUnderTest: Routing.() -> Unit
serverConfigSetup: ServerConfigBuilder.() -> Unit = { },
routeUnderTest: Route.() -> Unit
) {
openApiTest(
snapshotName,
@ -78,19 +81,21 @@ object TestHelpers {
customTypes,
notarizedApplicationConfigOverrides,
contentNegotiation,
applicationEnvironmentBuilder
applicationEnvironmentBuilder,
serverConfigSetup
)
}
private fun openApiTest(
snapshotName: String,
routeUnderTest: Routing.() -> Unit,
routeUnderTest: Route.() -> Unit,
applicationSetup: Application.() -> Unit,
specOverrides: OpenApiSpec.() -> OpenApiSpec,
typeOverrides: Map<KType, JsonSchema> = emptyMap(),
notarizedApplicationConfigOverrides: NotarizedApplication.Config.() -> Unit,
contentNegotiation: ContentNegotiationConfig.() -> Unit,
applicationBuilder: ApplicationEngineEnvironmentBuilder.() -> Unit
applicationBuilder: ApplicationEnvironmentBuilder.() -> Unit,
serverConfigSetup: ServerConfigBuilder.() -> Unit
) = testApplication {
environment(applicationBuilder)
install(NotarizedApplication()) {
@ -103,12 +108,14 @@ object TestHelpers {
contentNegotiation()
}
application(applicationSetup)
serverConfig(serverConfigSetup)
routing {
swagger()
redoc()
routeUnderTest()
}
val root = ApplicationEngineEnvironmentBuilder().apply(applicationBuilder).rootPath
val root = ServerConfigBuilder(ApplicationEnvironmentBuilder().apply(applicationBuilder).build()).apply(serverConfigSetup).rootPath
compareOpenAPISpec(root, snapshotName)
}
}