use reinhardt_router::{RouteVersionInfo, VersionedRouter};
use super::router::DefaultRouter;
use super::simple::SimpleRouter;
impl VersionedRouter for DefaultRouter {
fn route_version_infos(&self) -> Vec<RouteVersionInfo> {
self.get_routes()
.iter()
.map(|route| RouteVersionInfo::new(route.namespace.clone(), route.path.clone()))
.collect()
}
}
impl VersionedRouter for SimpleRouter {
fn route_version_infos(&self) -> Vec<RouteVersionInfo> {
self.get_routes()
.iter()
.map(|route| RouteVersionInfo::new(route.namespace.clone(), route.path.clone()))
.collect()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::routers::{Router, path};
use async_trait::async_trait;
use reinhardt_http::{Handler, Request, Response, Result};
use rstest::rstest;
use std::sync::Arc;
struct DummyHandler;
#[async_trait]
impl Handler for DummyHandler {
async fn handle(&self, _req: Request) -> Result<Response> {
Ok(Response::ok())
}
}
#[rstest]
fn default_router_empty_yields_no_infos() {
let router = DefaultRouter::new();
let infos = router.route_version_infos();
assert!(infos.is_empty());
}
#[rstest]
fn default_router_surfaces_namespace_and_path() {
let handler: Arc<dyn Handler> = Arc::new(DummyHandler);
let mut router = DefaultRouter::new();
router.add_route(path("/v1/users/", handler.clone()).with_namespace("v1"));
router.add_route(path("/v2/users/", handler).with_namespace("v2"));
let infos = router.route_version_infos();
assert_eq!(infos.len(), 2);
assert_eq!(infos[0].namespace.as_deref(), Some("v1"));
assert_eq!(infos[0].path_prefix, "/v1/users/");
assert_eq!(infos[1].namespace.as_deref(), Some("v2"));
assert_eq!(infos[1].path_prefix, "/v2/users/");
}
#[rstest]
fn simple_router_surfaces_path() {
let handler: Arc<dyn Handler> = Arc::new(DummyHandler);
let mut router = SimpleRouter::new();
router.add_route(path("/users/", handler));
let infos = router.route_version_infos();
assert_eq!(infos.len(), 1);
assert_eq!(infos[0].path_prefix, "/users/");
}
}