mudasar187
10/14/2024, 11:54 AMlateinit var server: NettyApplicationEngine
beforeTest {
server = embeddedServer(Netty, PORT, module = Application::applicationTestModule).start()
}
afterTest {
server.stop(5, 5)
}
After upgrading to Ktor 3.0.0 , embeddedServer
give me this error:
Any idea?Aleksei Tirman [JB]
10/14/2024, 12:05 PMlateinit var server: EmbeddedServer<NettyApplicationEngine, NettyApplicationEngine.Configuration>
mudasar187
10/14/2024, 12:06 PMmudasar187
10/14/2024, 12:14 PMprivate val engine = TestApplicationEngine(createTestEnvironment())
internal class AuthTokenTest : FunSpec({
beforeTest {
engine.start(wait = true)
}
test("token bør returnere NAVident") {
val call =
engine.handleRequest {
addHeader(HttpHeaders.Authorization, "Bearer $tokenWithNavIdent")
}
val navIdent = AuthToken.getSaksbehandler(call)
navIdent.ident shouldBe "Z123456"
}
Could you explain me?mudasar187
10/14/2024, 12:15 PMOsip Fatkullin
10/14/2024, 12:24 PMTestApplication()
instead of TestApplicationEngine(...)
and application.client.get(...)
to perform requests.mudasar187
10/14/2024, 12:26 PMAleksei Tirman [JB]
10/14/2024, 12:27 PMmudasar187
10/14/2024, 12:28 PMprivate val engine = TestApplicationEngine(createTestEnvironment())
internal class AuthTokenTest : FunSpec({
beforeTest {
engine.start(wait = true)
}
test("token bør returnere NAVident") {
val call =
engine.handleRequest {
addHeader(HttpHeaders.Authorization, "Bearer $tokenWithNavIdent")
}
val navIdent = AuthToken.getSaksbehandler(call)
navIdent.ident shouldBe "Z123456"
}
}
Aleksei Tirman [JB]
10/14/2024, 12:31 PMval engine = TestApplication {
// Configure test server here
}
engine.start()
val response = engine.client.get("/") {
header(HttpHeaders.Authorization, "Bearer $tokenWithNavIdent")
}
val call = response.call
mudasar187
10/14/2024, 12:34 PMgetSaksbehandler
takes ApplicationCall as parameter, but now i get HttpClientCallAleksei Tirman [JB]
10/14/2024, 12:35 PMmudasar187
10/14/2024, 12:35 PMobject AuthToken {
fun getSaksbehandler(call: ApplicationCall): NavIdent {
val oboToken =
call.request.headers[HttpHeaders.Authorization]?.removePrefix("Bearer ")
?: throw Error("Could not get token from request header")
val navIdent = getNAVIdentFromToken(oboToken)
return NavIdent(navIdent)
}
private fun getNAVIdentFromToken(token: String): String {
val decodedJWT = JWT.decode(token)
return decodedJWT.claims[JWT_CLAIM_NAVIDENT]?.asString()
?: throw RuntimeException("Missing NAVident in private claims")
}
}
mudasar187
10/14/2024, 12:37 PMval request = call.receive<OppdragsRequest>()
val saksbehandler = getSaksbehandler(call)
Aleksei Tirman [JB]
10/14/2024, 12:47 PMmudasar187
10/14/2024, 12:51 PMtestApplication {
application {
securityConfig(true, mockAuthConfig())
routing {
authenticate(true, AUTHENTICATION_NAME) {
oppdragsInfoApi(oppdragsInfoService)
}
}
}
val response = client.get("$OPPDRAGSINFO_BASE_API_PATH/faggrupper")
response.status shouldBe HttpStatusCode.Unauthorized
}
I was trying to isolate my AuthToken object tests but do i need to have testApplication
now? 😕Aleksei Tirman [JB]
10/14/2024, 12:55 PMgetSaksbehandler
method can only be called in the server call context, so you need a test server application, which is provided by the testApplication
.mudasar187
10/14/2024, 1:09 PMmockk
🙂
internal class AuthTokenTest : FunSpec({
test("token bør returnere NAVident") {
val call = mockk<ApplicationCall>(relaxed = true)
every { call.request.headers[HttpHeaders.Authorization] } returns "Bearer $tokenWithNavIdent"
val result = AuthToken.getSaksbehandler(call)
result.ident shouldBe "Z123456"
}
}
mudasar187
10/14/2024, 1:09 PMtestApplication
🙂mudasar187
10/14/2024, 1:13 PM