Skip to content
This repository has been archived by the owner on Oct 3, 2024. It is now read-only.

Commit

Permalink
Merge pull request #77 from tweedegolf/vtn-crate-preparations
Browse files Browse the repository at this point in the history
Vtn crate preparations
  • Loading branch information
tdittr authored Aug 19, 2024
2 parents 2924bba + fe0a9ea commit f687d53
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 60 deletions.
35 changes: 19 additions & 16 deletions src/vtn/api/event.rs
Original file line number Diff line number Diff line change
Expand Up @@ -214,20 +214,23 @@ mod test {
.unwrap()
}

async fn state_with_events(events: Vec<Event>) -> AppState {
fn state_with_events(events: Vec<Event>) -> 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())
}

Expand All @@ -248,9 +251,9 @@ 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 = crate::app_with_state(state);
let app = state.into_router();

let response = app
.oneshot(
Expand Down Expand Up @@ -297,9 +300,9 @@ 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 = crate::app_with_state(state);
let mut app = state.into_router();

let request = Request::builder()
.method(http::Method::DELETE)
Expand Down Expand Up @@ -334,9 +337,9 @@ 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 = crate::app_with_state(state);
let app = state.into_router();

let response = app
.oneshot(event_request(http::Method::PUT, event.clone(), &token))
Expand All @@ -354,9 +357,9 @@ 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 = crate::app_with_state(state);
let mut app = state.into_router();

let event = Event::new(default_content());
let content = event.content;
Expand Down Expand Up @@ -431,9 +434,9 @@ 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 = 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;
Expand Down
43 changes: 21 additions & 22 deletions src/vtn/api/program.rs
Original file line number Diff line number Diff line change
Expand Up @@ -248,24 +248,23 @@ mod test {
.unwrap()
}

async fn state_with_programs(programs: Vec<Program>) -> AppState {
fn state_with_programs(programs: Vec<Program>) -> 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())
}

Expand All @@ -286,9 +285,9 @@ 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 = crate::app_with_state(state);
let app = state.into_router();

let response = app
.oneshot(
Expand Down Expand Up @@ -332,9 +331,9 @@ 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 = crate::app_with_state(state);
let mut app = state.into_router();

let request = Request::builder()
.method(http::Method::DELETE)
Expand Down Expand Up @@ -369,9 +368,9 @@ 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 = crate::app_with_state(state);
let app = state.into_router();

let response = app
.oneshot(program_request(http::Method::PUT, program.clone(), &token))
Expand All @@ -391,9 +390,9 @@ 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 = crate::app_with_state(state);
let app = state.into_router();

// different id, same (default) name
let program = Program::new(default_content());
Expand All @@ -408,9 +407,9 @@ 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 = crate::app_with_state(state);
let mut app = state.into_router();

let program = Program::new(default_content());
let content = program.content;
Expand Down Expand Up @@ -485,9 +484,9 @@ 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 = 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;
Expand Down
49 changes: 27 additions & 22 deletions src/vtn/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,35 +42,40 @@ 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
{
error!("webserver crashed: {}", e);
}
}

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<Self> {
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() {
Expand Down

0 comments on commit f687d53

Please sign in to comment.