Skip to content

Commit adeed39

Browse files
committed
Ensure base urls have trailing slashes.
1 parent 2e0b177 commit adeed39

4 files changed

Lines changed: 34 additions & 13 deletions

File tree

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,26 @@
11
import io.ktor.client.engine.cio.CIO
22
import kotlinx.coroutines.test.runTest
33
import tvdb.client.Client
4+
import tvdb.client.Servers
5+
import tvdb.models.paths.login.post.requestBody.PostLoginRequest
6+
import tvdb.models.paths.login.post.response.PostLoginResponse401
47
import kotlin.test.Test
8+
import kotlin.test.assertIs
9+
import kotlin.test.fail
510

611
class TestTvDb {
712

813

914
@Test
10-
fun `create`() = runTest {
15+
fun `try to make request`() = runTest {
1116
val client = Client(CIO)
12-
client.getUser()
17+
val response = client.postLogin(PostLoginRequest("weewewfweewf"))
18+
19+
try {
20+
response.dataOrThrow()
21+
fail("Request succeeded without apikey. Something is wrong.")
22+
} catch (e: PostLoginResponse401) {
23+
24+
}
1325
}
1426
}

gradle-plugin/processor/src/main/kotlin/com/dshatz/openapi2ktor/generators/clients/KtorClientGenerator.kt

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -130,15 +130,7 @@ class KtorClientGenerator(override val typeStore: TypeStore, val packages: Packa
130130
}
131131
val enum = TypeSpec.enumBuilder(ClassName(packages.client, "Servers"))
132132
.primaryConstructor(FunSpec.constructorBuilder().addParameter("url", String::class).build())
133-
.apply {
134-
enumNames.forEach { (server, name) ->
135-
addEnumConstant(name,
136-
TypeSpec.anonymousClassBuilder()
137-
.addSuperclassConstructorParameter("%S", server.url)
138-
.build()
139-
)
140-
}
141-
}
133+
.addServerEnumConstants(enumNames)
142134
.addProperty(PropertySpec.builder("url", String::class).initializer("url").build())
143135
.build()
144136
return FileSpec.builder(ClassName(packages.client, "Servers")).addType(enum).build()
@@ -152,7 +144,7 @@ class KtorClientGenerator(override val typeStore: TypeStore, val packages: Packa
152144
val params = listOf(
153145
ParameterSpec.builder("engine", HttpClientEngine::class).build(),
154146
ParameterSpec.builder("baseUrl", String::class.asTypeName())
155-
.run { if (api.hasServers()) defaultValue("%S", api.servers.first().url) else this }
147+
.run { if (api.hasServers()) defaultValue("%S", api.servers.first().url.ensureTrailingSlash()) else this }
156148
.build(),
157149
ParameterSpec.builder("json", Json::class.asTypeName()).defaultValue("Json { ignoreUnknownKeys = true }").build(),
158150
ParameterSpec.builder("config", configLambdaType).defaultValue(CodeBlock.of("{}")).build()

gradle-plugin/processor/src/main/kotlin/com/dshatz/openapi2ktor/generators/clients/KtorHelpers.kt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ package com.dshatz.openapi2ktor.generators.clients
33
import com.dshatz.openapi2ktor.generators.TypeStore
44
import com.dshatz.openapi2ktor.generators.clients.KtorHelpers.contentTypeClass
55
import com.dshatz.openapi2ktor.generators.clients.KtorHelpers.contentTypeExtension
6+
import com.reprezen.kaizen.oasparser.model3.Server
67
import com.squareup.kotlinpoet.ClassName
78
import com.squareup.kotlinpoet.CodeBlock
89
import com.squareup.kotlinpoet.FunSpec
910
import com.squareup.kotlinpoet.MemberName
1011
import com.squareup.kotlinpoet.ParameterSpec
12+
import com.squareup.kotlinpoet.TypeSpec
1113

1214
internal object KtorHelpers {
1315
val setBodyExtension = MemberName("io.ktor.client.request", "setBody", isExtension = true)
@@ -29,4 +31,19 @@ internal fun CodeBlock.Builder.setContentType(requestBodyInfo: TypeStore.Request
2931
it.mediaType
3032
))
3133
}
34+
}
35+
36+
37+
internal fun String.ensureTrailingSlash(): String {
38+
return if (this.endsWith("/")) this else "$this/"
39+
}
40+
41+
internal fun TypeSpec.Builder.addServerEnumConstants(values: Map<Server, String>) = apply {
42+
values.forEach { (server, name) ->
43+
addEnumConstant(name,
44+
TypeSpec.anonymousClassBuilder()
45+
.addSuperclassConstructorParameter("%S", server.url.ensureTrailingSlash())
46+
.build()
47+
)
48+
}
3249
}

gradle-plugin/processor/src/main/kotlin/com/dshatz/openapi2ktor/generators/clients/SecurityScheme.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ sealed class Http(): SecurityScheme() {
5858
}
5959

6060
override fun generateApplicator(name: String): CodeBlock {
61-
return CodeBlock.of("%L?.bearer?.let { %M(it) }", generateAccessor(name), bearerMethod)
61+
return CodeBlock.builder().addStatement("%L?.bearer?.let { %M(it) }", generateAccessor(name), bearerMethod).build()
6262
}
6363
}
6464

0 commit comments

Comments
 (0)