1
0
Fork 0
mirror of https://github.com/tokio-rs/axum.git synced 2025-04-26 13:56:22 +02:00

checkpoint

This commit is contained in:
David Pedersen 2022-07-03 16:45:54 +02:00
parent 4b6c18145d
commit 15bd25bcd1
3 changed files with 40 additions and 11 deletions
axum/src/routing

View file

@ -664,11 +664,11 @@ where
let path = req.uri().path().to_owned();
// the `unwrap` is safe because `self.state` is always some if `R = WithState`, which it is
let prev = req
.extensions_mut()
.insert(State(self.state.as_ref().unwrap().clone()));
debug_assert!(prev.is_none());
if req.extensions().get::<State<S>>().is_none() {
// the `unwrap` is safe because `self.state` is always some if `R = WithState`, which it is
req.extensions_mut()
.insert(State(self.state.as_ref().unwrap().clone()));
}
match self.node.at(&path) {
Ok(match_) => self.call_route(match_, req),

View file

@ -417,5 +417,34 @@ async fn middleware_that_return_early() {
#[tokio::test]
async fn merging_with_different_state() {
todo!()
#[derive(Clone)]
struct AppState {
inner: InnerState,
}
#[derive(Clone)]
struct InnerState {
value: &'static str,
}
impl From<AppState> for InnerState {
fn from(state: AppState) -> Self {
state.inner
}
}
let inner_router = Router::new().route(
"/a",
get(|State(state): State<InnerState>| async move { state.value }),
);
let app = Router::with_state(AppState {
inner: InnerState { value: "inner" },
})
.merge(inner_router.map_state(Into::into));
let client = TestClient::new(app);
let res = client.get("/a").send().await;
assert_eq!(res.text().await, "inner");
}

View file

@ -404,7 +404,7 @@ async fn nesting_with_different_state() {
}
}
let inner_router = Router::<InnerState, Body, _>::new().route(
let inner_router = Router::new().route(
"/b",
get(|State(state): State<InnerState>| async move { state.value }),
);
@ -433,15 +433,15 @@ macro_rules! nested_route_test {
#[tokio::test]
async fn $name() {
let inner = Router::new().route($route_path, get(|| async {}));
let app = Router::new().nest($nested_path, inner);
let client = TestClient::new(app.state(()));
let app = Router::without_state().nest($nested_path, inner);
let client = TestClient::new(app);
let res = client.get($expected_path).send().await;
let status = res.status();
assert_eq!(status, StatusCode::OK, "Router");
let inner = Router::new().route($route_path, get(|| async {})).state(());
let app = Router::new().nest_service($nested_path, inner);
let client = TestClient::new(app.state(()));
let app = Router::without_state().nest_service($nested_path, inner);
let client = TestClient::new(app);
let res = client.get(dbg!($expected_path)).send().await;
assert_eq!(res.status(), StatusCode::OK, "opaque");
}