From 1a4419d16acb68fa2ad07348384e3a7d2bcc52c5 Mon Sep 17 00:00:00 2001 From: Folkert de Vries Date: Mon, 19 Aug 2024 12:03:28 +0200 Subject: [PATCH 1/2] add `AppState::into_router` for future external use --- src/vtn/api/event.rs | 10 ++++----- src/vtn/api/program.rs | 12 +++++------ src/vtn/main.rs | 49 +++++++++++++++++++++++------------------- 3 files changed, 38 insertions(+), 33 deletions(-) diff --git a/src/vtn/api/event.rs b/src/vtn/api/event.rs index 6cdbab3..6d84ea4 100644 --- a/src/vtn/api/event.rs +++ b/src/vtn/api/event.rs @@ -250,7 +250,7 @@ mod test { let state = state_with_events(vec![event.clone()]).await; let token = get_admin_token_from_state(&state); - let app = crate::app_with_state(state); + let app = state.into_router(); let response = app .oneshot( @@ -299,7 +299,7 @@ mod test { let state = state_with_events(events).await; let token = get_admin_token_from_state(&state); - let mut app = crate::app_with_state(state); + let mut app = state.into_router(); let request = Request::builder() .method(http::Method::DELETE) @@ -336,7 +336,7 @@ mod test { let state = state_with_events(vec![event.clone()]).await; let token = get_admin_token_from_state(&state); - let app = crate::app_with_state(state); + let app = state.into_router(); let response = app .oneshot(event_request(http::Method::PUT, event.clone(), &token)) @@ -356,7 +356,7 @@ mod test { async fn create_same_name() { let state = state_with_events(vec![]).await; let token = get_admin_token_from_state(&state); - let mut app = crate::app_with_state(state); + let mut app = state.into_router(); let event = Event::new(default_content()); let content = event.content; @@ -433,7 +433,7 @@ mod test { let state = state_with_events(events).await; let token = get_admin_token_from_state(&state); - let mut app = crate::app_with_state(state); + let mut app = state.into_router(); // no query params let response = retrieve_all_with_filter_help(&mut app, "", &token).await; diff --git a/src/vtn/api/program.rs b/src/vtn/api/program.rs index 65652b2..5dbca56 100644 --- a/src/vtn/api/program.rs +++ b/src/vtn/api/program.rs @@ -288,7 +288,7 @@ mod test { let state = state_with_programs(vec![program.clone()]).await; let token = get_admin_token_from_state(&state); - let app = crate::app_with_state(state); + let app = state.into_router(); let response = app .oneshot( @@ -334,7 +334,7 @@ mod test { let state = state_with_programs(programs).await; let token = get_admin_token_from_state(&state); - let mut app = crate::app_with_state(state); + let mut app = state.into_router(); let request = Request::builder() .method(http::Method::DELETE) @@ -371,7 +371,7 @@ mod test { let state = state_with_programs(vec![program.clone()]).await; let token = get_admin_token_from_state(&state); - let app = crate::app_with_state(state); + let app = state.into_router(); let response = app .oneshot(program_request(http::Method::PUT, program.clone(), &token)) @@ -393,7 +393,7 @@ mod test { let state = state_with_programs(vec![program.clone()]).await; let token = get_admin_token_from_state(&state); - let app = crate::app_with_state(state); + let app = state.into_router(); // different id, same (default) name let program = Program::new(default_content()); @@ -410,7 +410,7 @@ mod test { async fn create_same_name() { let state = state_with_programs(vec![]).await; let token = get_admin_token_from_state(&state); - let mut app = crate::app_with_state(state); + let mut app = state.into_router(); let program = Program::new(default_content()); let content = program.content; @@ -487,7 +487,7 @@ mod test { let state = state_with_programs(programs).await; let token = get_admin_token_from_state(&state); - let mut app = crate::app_with_state(state); + let mut app = state.into_router(); // no query params let response = retrieve_all_with_filter_help(&mut app, "", &token).await; diff --git a/src/vtn/main.rs b/src/vtn/main.rs index 79e0350..b0ba9e7 100644 --- a/src/vtn/main.rs +++ b/src/vtn/main.rs @@ -42,7 +42,7 @@ async fn main() { }); let state = AppState::new(storage, JwtManager::from_base64_secret("test").unwrap()); - if let Err(e) = axum::serve(listener, app_with_state(state)) + if let Err(e) = axum::serve(listener, state.into_router()) .with_graceful_shutdown(shutdown_signal()) .await { @@ -50,27 +50,32 @@ async fn main() { } } -pub(crate) fn app_with_state(state: AppState) -> Router { - Router::new() - .route("/programs", get(program::get_all).post(program::add)) - .route( - "/programs/:id", - get(program::get).put(program::edit).delete(program::delete), - ) - .route("/reports", get(report::get_all).post(report::add)) - .route( - "/reports/:id", - get(report::get).put(report::edit).delete(report::delete), - ) - .route("/events", get(event::get_all).post(event::add)) - .route( - "/events/:id", - get(event::get).put(event::edit).delete(event::delete), - ) - .route("/auth/register", post(auth::register)) - .route("/auth/token", post(auth::token)) - .layer(TraceLayer::new_for_http()) - .with_state(state) +impl AppState { + fn router_without_state() -> axum::Router { + axum::Router::new() + .route("/programs", get(program::get_all).post(program::add)) + .route( + "/programs/:id", + get(program::get).put(program::edit).delete(program::delete), + ) + .route("/reports", get(report::get_all).post(report::add)) + .route( + "/reports/:id", + get(report::get).put(report::edit).delete(report::delete), + ) + .route("/events", get(event::get_all).post(event::add)) + .route( + "/events/:id", + get(event::get).put(event::edit).delete(event::delete), + ) + .route("/auth/register", post(auth::register)) + .route("/auth/token", post(auth::token)) + .layer(TraceLayer::new_for_http()) + } + + pub fn into_router(self) -> Router { + Self::router_without_state().with_state(self) + } } async fn shutdown_signal() { From fe0a9ea520efc2267c3512ea2724f4f3235e2608 Mon Sep 17 00:00:00 2001 From: Folkert de Vries Date: Mon, 19 Aug 2024 12:19:26 +0200 Subject: [PATCH 2/2] un-async a test function --- src/vtn/api/event.rs | 25 ++++++++++++++----------- src/vtn/api/program.rs | 31 +++++++++++++++---------------- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/src/vtn/api/event.rs b/src/vtn/api/event.rs index 6d84ea4..92a65e9 100644 --- a/src/vtn/api/event.rs +++ b/src/vtn/api/event.rs @@ -214,20 +214,23 @@ mod test { .unwrap() } - async fn state_with_events(events: Vec) -> AppState { + fn state_with_events(events: Vec) -> AppState { let store = InMemoryStorage::default(); - for evt in events { - store.events.write().await.insert(evt.id.clone(), evt); - } - - store.auth.write().await.push(AuthInfo { + store.auth.try_write().unwrap().push(AuthInfo { client_id: "admin".to_string(), client_secret: "admin".to_string(), role: AuthRole::BL, ven: None, }); + { + let mut writer = store.events.try_write().unwrap(); + for event in events { + writer.insert(event.id.clone(), event); + } + } + AppState::new(store, JwtManager::from_base64_secret("test").unwrap()) } @@ -248,7 +251,7 @@ mod test { let event = Event::new(default_content()); let event_id = event.id.clone(); - let state = state_with_events(vec![event.clone()]).await; + let state = state_with_events(vec![event.clone()]); let token = get_admin_token_from_state(&state); let app = state.into_router(); @@ -297,7 +300,7 @@ mod test { ]; let event_id = events[1].id.clone(); - let state = state_with_events(events).await; + let state = state_with_events(events); let token = get_admin_token_from_state(&state); let mut app = state.into_router(); @@ -334,7 +337,7 @@ mod test { async fn update() { let event = Event::new(default_content()); - let state = state_with_events(vec![event.clone()]).await; + let state = state_with_events(vec![event.clone()]); let token = get_admin_token_from_state(&state); let app = state.into_router(); @@ -354,7 +357,7 @@ mod test { #[tokio::test] async fn create_same_name() { - let state = state_with_events(vec![]).await; + let state = state_with_events(vec![]); let token = get_admin_token_from_state(&state); let mut app = state.into_router(); @@ -431,7 +434,7 @@ mod test { let events = vec![Event::new(event1), Event::new(event2), Event::new(event3)]; - let state = state_with_events(events).await; + let state = state_with_events(events); let token = get_admin_token_from_state(&state); let mut app = state.into_router(); diff --git a/src/vtn/api/program.rs b/src/vtn/api/program.rs index 5dbca56..06637c9 100644 --- a/src/vtn/api/program.rs +++ b/src/vtn/api/program.rs @@ -248,24 +248,23 @@ mod test { .unwrap() } - async fn state_with_programs(programs: Vec) -> AppState { + fn state_with_programs(programs: Vec) -> AppState { let store = InMemoryStorage::default(); - for program in programs { - store - .programs - .write() - .await - .insert(program.id.clone(), program); - } - - store.auth.write().await.push(AuthInfo { + store.auth.try_write().unwrap().push(AuthInfo { client_id: "admin".to_string(), client_secret: "admin".to_string(), role: AuthRole::BL, ven: None, }); + { + let mut writer = store.programs.try_write().unwrap(); + for program in programs { + writer.insert(program.id.clone(), program); + } + } + AppState::new(store, JwtManager::from_base64_secret("test").unwrap()) } @@ -286,7 +285,7 @@ mod test { let program = Program::new(default_content()); let program_id = program.id.clone(); - let state = state_with_programs(vec![program.clone()]).await; + let state = state_with_programs(vec![program.clone()]); let token = get_admin_token_from_state(&state); let app = state.into_router(); @@ -332,7 +331,7 @@ mod test { ]; let program_id = programs[1].id.clone(); - let state = state_with_programs(programs).await; + let state = state_with_programs(programs); let token = get_admin_token_from_state(&state); let mut app = state.into_router(); @@ -369,7 +368,7 @@ mod test { async fn update() { let program = Program::new(default_content()); - let state = state_with_programs(vec![program.clone()]).await; + let state = state_with_programs(vec![program.clone()]); let token = get_admin_token_from_state(&state); let app = state.into_router(); @@ -391,7 +390,7 @@ mod test { async fn update_same_name() { let program = Program::new(default_content()); - let state = state_with_programs(vec![program.clone()]).await; + let state = state_with_programs(vec![program.clone()]); let token = get_admin_token_from_state(&state); let app = state.into_router(); @@ -408,7 +407,7 @@ mod test { #[tokio::test] async fn create_same_name() { - let state = state_with_programs(vec![]).await; + let state = state_with_programs(vec![]); let token = get_admin_token_from_state(&state); let mut app = state.into_router(); @@ -485,7 +484,7 @@ mod test { Program::new(program3), ]; - let state = state_with_programs(programs).await; + let state = state_with_programs(programs); let token = get_admin_token_from_state(&state); let mut app = state.into_router();