Files
axum/src/tests/nest.rs
T

182 lines
5.2 KiB
Rust
Raw Normal View History

use super::*;
use crate::body::box_body;
2021-08-06 16:17:57 +08:00
use std::collections::HashMap;
#[tokio::test]
async fn nesting_apps() {
let api_routes = Router::new()
.route(
"/users",
get(|| async { "users#index" }).post(|| async { "users#create" }),
)
.route(
"/users/:id",
get(
|params: extract::Path<HashMap<String, String>>| async move {
format!(
"{}: users#show ({})",
params.get("version").unwrap(),
params.get("id").unwrap()
)
},
),
)
.route(
"/games/:id",
get(
|params: extract::Path<HashMap<String, String>>| async move {
format!(
"{}: games#show ({})",
params.get("version").unwrap(),
params.get("id").unwrap()
)
},
),
);
let app = Router::new()
.route("/", get(|| async { "hi" }))
.nest("/:version/api", api_routes);
2021-09-19 11:38:34 +02:00
let client = TestClient::new(app);
2021-09-19 11:38:34 +02:00
let res = client.get("/").send().await;
assert_eq!(res.status(), StatusCode::OK);
2021-09-19 11:38:34 +02:00
assert_eq!(res.text().await, "hi");
2021-09-19 11:38:34 +02:00
let res = client.get("/v0/api/users").send().await;
assert_eq!(res.status(), StatusCode::OK);
2021-09-19 11:38:34 +02:00
assert_eq!(res.text().await, "users#index");
2021-09-19 11:38:34 +02:00
let res = client.get("/v0/api/users/123").send().await;
assert_eq!(res.status(), StatusCode::OK);
2021-09-19 11:38:34 +02:00
assert_eq!(res.text().await, "v0: users#show (123)");
2021-09-19 11:38:34 +02:00
let res = client.get("/v0/api/games/123").send().await;
assert_eq!(res.status(), StatusCode::OK);
2021-09-19 11:38:34 +02:00
assert_eq!(res.text().await, "v0: games#show (123)");
}
#[tokio::test]
async fn wrong_method_nest() {
let nested_app = Router::new().route("/", get(|| async {}));
let app = Router::new().nest("/", nested_app);
2021-09-19 11:38:34 +02:00
let client = TestClient::new(app);
2021-09-19 11:38:34 +02:00
let res = client.get("/").send().await;
assert_eq!(res.status(), StatusCode::OK);
2021-09-19 11:38:34 +02:00
let res = client.post("/").send().await;
assert_eq!(res.status(), StatusCode::METHOD_NOT_ALLOWED);
2021-09-19 11:38:34 +02:00
let res = client.patch("/foo").send().await;
assert_eq!(res.status(), StatusCode::NOT_FOUND);
}
#[tokio::test]
async fn nesting_at_root() {
let app = Router::new().nest("/", get(|uri: Uri| async move { uri.to_string() }));
2021-09-19 11:38:34 +02:00
let client = TestClient::new(app);
2021-09-19 11:38:34 +02:00
let res = client.get("/").send().await;
assert_eq!(res.status(), StatusCode::OK);
2021-09-19 11:38:34 +02:00
assert_eq!(res.text().await, "/");
2021-09-19 11:38:34 +02:00
let res = client.get("/foo").send().await;
assert_eq!(res.status(), StatusCode::OK);
2021-09-19 11:38:34 +02:00
assert_eq!(res.text().await, "/foo");
2021-09-19 11:38:34 +02:00
let res = client.get("/foo/bar").send().await;
assert_eq!(res.status(), StatusCode::OK);
2021-09-19 11:38:34 +02:00
assert_eq!(res.text().await, "/foo/bar");
}
#[tokio::test]
async fn nested_url_extractor() {
let app = Router::new().nest(
"/foo",
Router::new().nest(
"/bar",
Router::new()
.route("/baz", get(|uri: Uri| async move { uri.to_string() }))
.route(
"/qux",
get(|req: Request<Body>| async move { req.uri().to_string() }),
),
),
);
2021-09-19 11:38:34 +02:00
let client = TestClient::new(app);
2021-09-19 11:38:34 +02:00
let res = client.get("/foo/bar/baz").send().await;
assert_eq!(res.status(), StatusCode::OK);
2021-09-19 11:38:34 +02:00
assert_eq!(res.text().await, "/baz");
2021-09-19 11:38:34 +02:00
let res = client.get("/foo/bar/qux").send().await;
assert_eq!(res.status(), StatusCode::OK);
2021-09-19 11:38:34 +02:00
assert_eq!(res.text().await, "/qux");
}
2021-08-08 14:45:31 +02:00
#[tokio::test]
async fn nested_url_original_extractor() {
let app = Router::new().nest(
2021-08-08 14:45:31 +02:00
"/foo",
Router::new().nest(
2021-08-08 14:45:31 +02:00
"/bar",
Router::new().route(
2021-08-08 14:45:31 +02:00
"/baz",
get(|uri: extract::OriginalUri| async move { uri.0.to_string() }),
2021-08-08 14:45:31 +02:00
),
),
);
2021-09-19 11:38:34 +02:00
let client = TestClient::new(app);
2021-08-08 14:45:31 +02:00
2021-09-19 11:38:34 +02:00
let res = client.get("/foo/bar/baz").send().await;
assert_eq!(res.status(), StatusCode::OK);
2021-09-19 11:38:34 +02:00
assert_eq!(res.text().await, "/foo/bar/baz");
2021-08-08 14:45:31 +02:00
}
#[tokio::test]
async fn nested_service_sees_stripped_uri() {
let app = Router::new().nest(
"/foo",
Router::new().nest(
"/bar",
Router::new().route(
"/baz",
service_fn(|req: Request<Body>| async move {
let body = box_body(Body::from(req.uri().to_string()));
Ok::<_, Infallible>(Response::new(body))
}),
),
),
);
2021-09-19 11:38:34 +02:00
let client = TestClient::new(app);
2021-09-19 11:38:34 +02:00
let res = client.get("/foo/bar/baz").send().await;
assert_eq!(res.status(), StatusCode::OK);
2021-09-19 11:38:34 +02:00
assert_eq!(res.text().await, "/baz");
}
#[tokio::test]
async fn nest_static_file_server() {
let app = Router::new().nest(
"/static",
service::get(tower_http::services::ServeDir::new(".")).handle_error(|error| {
Ok::<_, Infallible>((
StatusCode::INTERNAL_SERVER_ERROR,
format!("Unhandled internal error: {}", error),
))
}),
);
2021-09-19 11:38:34 +02:00
let client = TestClient::new(app);
2021-09-19 11:38:34 +02:00
let res = client.get("/static/README.md").send().await;
assert_eq!(res.status(), StatusCode::OK);
}