From eb863558958c9a8573d30258e625e1e7444ef2ce Mon Sep 17 00:00:00 2001 From: Mariia Skripchenko <61115099+marychatte@users.noreply.github.com> Date: Tue, 6 Dec 2022 16:38:21 +0100 Subject: [PATCH] Implement getAllRoutes method (#3287) --- .../ktor-server-core/api/ktor-server-core.api | 4 ++ .../src/io/ktor/server/routing/Route.kt | 16 ++++++ .../test/io/ktor/server/routing/RouteTest.kt | 53 +++++++++++++++++++ 3 files changed, 73 insertions(+) diff --git a/ktor-server/ktor-server-core/api/ktor-server-core.api b/ktor-server/ktor-server-core/api/ktor-server-core.api index a3f2c9088a..075fe14485 100644 --- a/ktor-server/ktor-server-core/api/ktor-server-core.api +++ b/ktor-server/ktor-server-core/api/ktor-server-core.api @@ -1056,6 +1056,10 @@ public class io/ktor/server/routing/Route : io/ktor/server/application/Applicati public fun toString ()Ljava/lang/String; } +public final class io/ktor/server/routing/RouteKt { + public static final fun getAllRoutes (Lio/ktor/server/routing/Route;)Ljava/util/List; +} + public abstract class io/ktor/server/routing/RouteSelector { public fun ()V public fun (D)V diff --git a/ktor-server/ktor-server-core/jvmAndNix/src/io/ktor/server/routing/Route.kt b/ktor-server/ktor-server-core/jvmAndNix/src/io/ktor/server/routing/Route.kt index 79668e3907..be361d1409 100644 --- a/ktor-server/ktor-server-core/jvmAndNix/src/io/ktor/server/routing/Route.kt +++ b/ktor-server/ktor-server-core/jvmAndNix/src/io/ktor/server/routing/Route.kt @@ -133,3 +133,19 @@ public open class Route( } } } + +/** + * Return list of endpoints with handlers under this route. + */ +public fun Route.getAllRoutes(): List { + val endpoints = mutableListOf() + getAllRoutes(endpoints) + return endpoints +} + +private fun Route.getAllRoutes(endpoints: MutableList) { + if (handlers.isNotEmpty()) { + endpoints.add(this) + } + children.forEach { it.getAllRoutes(endpoints) } +} diff --git a/ktor-server/ktor-server-core/jvmAndNix/test/io/ktor/server/routing/RouteTest.kt b/ktor-server/ktor-server-core/jvmAndNix/test/io/ktor/server/routing/RouteTest.kt index a561ee3204..1e5bc99cdd 100644 --- a/ktor-server/ktor-server-core/jvmAndNix/test/io/ktor/server/routing/RouteTest.kt +++ b/ktor-server/ktor-server-core/jvmAndNix/test/io/ktor/server/routing/RouteTest.kt @@ -4,7 +4,11 @@ package io.ktor.tests.routing +import io.ktor.http.* +import io.ktor.server.application.* +import io.ktor.server.response.* import io.ktor.server.routing.* +import io.ktor.server.testing.* import kotlin.test.* class RouteTest { @@ -37,4 +41,53 @@ class RouteTest { assertTrue(root.developmentMode) assertTrue(simpleChild.developmentMode) } + + @Test + fun testGetAllRoutes() = testApplication { + application { + val root = routing { + route("/shop") { + route("/customer") { + get("/{id}") { + call.respondText("OK") + } + post("/new") { } + } + + route("/order") { + route("/shipment") { + get { } + post { + call.respondText("OK") + } + put { + call.respondText("OK") + } + } + } + } + + route("/info", HttpMethod.Get) { + post("new") {} + + handle { + call.respondText("OK") + } + } + } + + val endpoints = root.getAllRoutes() + assertTrue { endpoints.size == 7 } + val expected = setOf( + "/shop/customer/{id}/(method:GET)", + "/shop/customer/new/(method:POST)", + "/shop/order/shipment/(method:GET)", + "/shop/order/shipment/(method:PUT)", + "/shop/order/shipment/(method:POST)", + "/info/(method:GET)", + "/info/(method:GET)/new/(method:POST)" + ) + assertEquals(expected, endpoints.map { it.toString() }.toSet()) + } + } }