diff --git a/src/vtn/api/program.rs b/src/vtn/api/program.rs index 4c28eb9..65652b2 100644 --- a/src/vtn/api/program.rs +++ b/src/vtn/api/program.rs @@ -203,7 +203,11 @@ impl QueryParams { #[cfg(test)] mod test { - use crate::{data_source::InMemoryStorage, jwt::JwtManager, state::AppState}; + use crate::{ + data_source::{AuthInfo, InMemoryStorage}, + jwt::{AuthRole, JwtManager}, + state::AppState, + }; use super::*; use axum::{ @@ -234,10 +238,11 @@ mod test { } } - fn program_request(method: http::Method, program: Program) -> Request { + fn program_request(method: http::Method, program: Program, token: &str) -> Request { Request::builder() .method(method) .uri(format!("/programs/{}", program.id)) + .header(http::header::AUTHORIZATION, format!("Bearer {}", token)) .header(http::header::CONTENT_TYPE, mime::APPLICATION_JSON.as_ref()) .body(Body::from(serde_json::to_vec(&program).unwrap())) .unwrap() @@ -254,15 +259,35 @@ mod test { .insert(program.id.clone(), program); } + store.auth.write().await.push(AuthInfo { + client_id: "admin".to_string(), + client_secret: "admin".to_string(), + role: AuthRole::BL, + ven: None, + }); + AppState::new(store, JwtManager::from_base64_secret("test").unwrap()) } + fn get_admin_token_from_state(state: &AppState) -> String { + state + .jwt_manager + .create( + std::time::Duration::from_secs(3600), + "admin".to_string(), + AuthRole::BL, + None, + ) + .unwrap() + } + #[tokio::test] async fn get() { let program = Program::new(default_content()); let program_id = program.id.clone(); 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 response = app @@ -270,6 +295,7 @@ mod test { Request::builder() .method(http::Method::GET) .uri(format!("/programs/{program_id}")) + .header(http::header::AUTHORIZATION, format!("Bearer {}", token)) .body(Body::empty()) .unwrap(), ) @@ -307,11 +333,13 @@ mod test { let program_id = programs[1].id.clone(); let state = state_with_programs(programs).await; + let token = get_admin_token_from_state(&state); let mut app = crate::app_with_state(state); let request = Request::builder() .method(http::Method::DELETE) .uri(format!("/programs/{program_id}")) + .header(http::header::AUTHORIZATION, format!("Bearer {}", token)) .body(Body::empty()) .unwrap(); @@ -329,7 +357,7 @@ mod test { assert_eq!(program2, db_program.content); - let response = retrieve_all_with_filter_help(&mut app, "").await; + let response = retrieve_all_with_filter_help(&mut app, "", &token).await; assert_eq!(response.status(), StatusCode::OK); let body = response.into_body().collect().await.unwrap().to_bytes(); @@ -342,10 +370,11 @@ mod test { let program = Program::new(default_content()); 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 response = app - .oneshot(program_request(http::Method::PUT, program.clone())) + .oneshot(program_request(http::Method::PUT, program.clone(), &token)) .await .unwrap(); @@ -363,13 +392,14 @@ mod test { let program = Program::new(default_content()); let state = state_with_programs(vec![program.clone()]).await; + let token = get_admin_token_from_state(&state); let app = crate::app_with_state(state); // different id, same (default) name let program = Program::new(default_content()); let response = app - .oneshot(program_request(http::Method::PUT, program.clone())) + .oneshot(program_request(http::Method::PUT, program.clone(), &token)) .await .unwrap(); @@ -379,6 +409,7 @@ mod test { #[tokio::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 program = Program::new(default_content()); @@ -387,6 +418,7 @@ mod test { let request = Request::builder() .method(http::Method::POST) .uri("/programs") + .header(http::header::AUTHORIZATION, format!("Bearer {}", token)) .header(http::header::CONTENT_TYPE, mime::APPLICATION_JSON.as_ref()) .body(Body::from(serde_json::to_vec(&content).unwrap())) .unwrap(); @@ -402,6 +434,7 @@ mod test { let request = Request::builder() .method(http::Method::POST) .uri("/programs") + .header(http::header::AUTHORIZATION, format!("Bearer {}", token)) .header(http::header::CONTENT_TYPE, mime::APPLICATION_JSON.as_ref()) .body(Body::from(serde_json::to_vec(&content).unwrap())) .unwrap(); @@ -410,10 +443,15 @@ mod test { assert_eq!(response.status(), StatusCode::CONFLICT); } - async fn retrieve_all_with_filter_help(app: &mut Router, query_params: &str) -> Response { + async fn retrieve_all_with_filter_help( + app: &mut Router, + query_params: &str, + token: &str, + ) -> Response { let request = Request::builder() .method(http::Method::GET) .uri(format!("/programs?{query_params}")) + .header(http::header::AUTHORIZATION, format!("Bearer {}", token)) .header(http::header::CONTENT_TYPE, mime::APPLICATION_JSON.as_ref()) .body(Body::empty()) .unwrap(); @@ -448,10 +486,11 @@ 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); // no query params - let response = retrieve_all_with_filter_help(&mut app, "").await; + let response = retrieve_all_with_filter_help(&mut app, "", &token).await; assert_eq!(response.status(), StatusCode::OK); let body = response.into_body().collect().await.unwrap().to_bytes(); @@ -459,7 +498,7 @@ mod test { assert_eq!(programs.len(), 3); // skip - let response = retrieve_all_with_filter_help(&mut app, "skip=1").await; + let response = retrieve_all_with_filter_help(&mut app, "skip=1", &token).await; assert_eq!(response.status(), StatusCode::OK); let body = response.into_body().collect().await.unwrap().to_bytes(); @@ -467,7 +506,7 @@ mod test { assert_eq!(programs.len(), 2); // limit - let response = retrieve_all_with_filter_help(&mut app, "limit=2").await; + let response = retrieve_all_with_filter_help(&mut app, "limit=2", &token).await; assert_eq!(response.status(), StatusCode::OK); let body = response.into_body().collect().await.unwrap().to_bytes(); @@ -475,12 +514,13 @@ mod test { assert_eq!(programs.len(), 2); // program name - let response = retrieve_all_with_filter_help(&mut app, "targetType=NONSENSE").await; + let response = retrieve_all_with_filter_help(&mut app, "targetType=NONSENSE", &token).await; assert_eq!(response.status(), StatusCode::NOT_IMPLEMENTED); let response = retrieve_all_with_filter_help( &mut app, "targetType=PROGRAM_NAME&targetValues=program1&targetValues=program2", + &token, ) .await; assert_eq!(response.status(), StatusCode::OK);