use actix_web::{web, Responder}; use crate::{ endpoints::vehicle::VehicleNewOrEditTemplate, models::{Role, User}, utils::{ApplicationError, TemplateResponse}, }; #[actix_web::get("/vehicles/new")] pub async fn get(user: web::ReqData) -> Result { if user.role != Role::Admin && user.role != Role::AreaManager { return Err(ApplicationError::Unauthorized); } let template = VehicleNewOrEditTemplate { user: user.into_inner(), vehicle: None, }; Ok(template.to_response()?) } #[cfg(test)] mod tests { use crate::{ models::{Function, Role}, utils::test_helper::{ assert_snapshot, read_body, test_get, DbTestContext, RequestConfig, StatusCode, }, }; use brass_macros::db_test; #[db_test] async fn returns_not_found_for_user(context: &DbTestContext) { let app = context.app().await; let config = RequestConfig::new("/vehicles/new"); let response = test_get(&context.db_pool, &app, &config).await; assert_eq!(StatusCode::UNAUTHORIZED, response.status()); } #[db_test] async fn area_manager_can_edit(context: &DbTestContext) { let app = context.app().await; let config = RequestConfig { uri: "/vehicles/new".to_string(), role: Role::AreaManager, function: vec![Function::Posten], user_area: 1, }; let response = test_get(&context.db_pool, &app, &config).await; assert_eq!(StatusCode::OK, response.status()); } #[db_test] async fn produces_template_fine_when_user_is_admin(context: &DbTestContext) { let app = context.app().await; let config = RequestConfig { uri: "/vehicles/new".to_string(), role: Role::Admin, function: vec![Function::Posten], user_area: 1, }; let response = test_get(&context.db_pool, &app, &config).await; assert_eq!(StatusCode::OK, response.status()); let body = read_body(response).await; assert_snapshot!(body); } }