James Richardson
10/12/2020, 9:51 PMobject ParameterRouter {
operator fun invoke(vararg list: Pair<Set<String>, HttpHandler>): HttpHandler {
val routes = list.toList()
return { request ->
val supplied = request.uri.queries().map { p -> p.first }.toSet()
routes.find { route -> route.first == supplied }
?.let { it.second(request) }
?: Response(Status.NOT_FOUND)
}
}
}
@Test
fun `parameter router`() {
val server = routes("/bob" bind ParameterRouter(
setOf("q") to { Response(Status.OK).body("q") },
setOf("lat", "lon") to { Response(Status.OK).body("lon") },
setOf("id") to { Response(Status.OK).body("id") }
))
assertThat(server(Request(Method.GET, "/bob").query("q", null)), allOf(hasStatus(Status.OK),hasBody("q")))
assertThat(server(Request(Method.GET, "/bob").query("lat", null).query("lon", null)), allOf(hasStatus(Status.OK), hasBody("lon")))
assertThat(server(Request(Method.GET, "/bob").query("id", null)), allOf(hasStatus(Status.OK),hasBody("id")))
assertThat(server(Request(Method.GET, "/bob").query("lat", null)), hasStatus(Status.NOT_FOUND))
assertThat(server(Request(Method.GET, "/bob").query("xx", null)), hasStatus(Status.NOT_FOUND))
}