From d7762a10fae9d9fc0966ee12fdbf16f59d35800e Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Thu, 26 Oct 2023 08:50:18 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=A7=20=20Prepare=20code=20for=20testin?= =?UTF-8?q?g?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/app.rs | 86 +++++++++++-------- pagetop/src/service.rs | 10 ++- pagetop/tests/main.rs | 2 + pagetop/tests/server/health_check.rs | 20 +++++ .../server.rs => pagetop/tests/server/mod.rs | 0 tests/Cargo.toml | 17 ---- tests/src/main.rs | 1 - tests/src/server/health_check.rs | 15 ---- 8 files changed, 80 insertions(+), 71 deletions(-) create mode 100644 pagetop/tests/main.rs create mode 100644 pagetop/tests/server/health_check.rs rename tests/src/server.rs => pagetop/tests/server/mod.rs (100%) delete mode 100644 tests/Cargo.toml delete mode 100644 tests/src/main.rs delete mode 100644 tests/src/server/health_check.rs diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index 762b5ae7..74fa2ccc 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -14,21 +14,17 @@ use crate::db; use actix_session::config::{BrowserSession, PersistentSession, SessionLifecycle}; use actix_session::storage::CookieSessionStore; use actix_session::SessionMiddleware; -use actix_web::cookie::{time::Duration, Key}; -use actix_web::dev::Server; - -use std::io::Error; use substring::Substring; -pub struct Application { - server: Server, -} +use std::io::Error; + +pub struct Application; impl Application { pub fn prepare(app: ModuleRef) -> Result { - // Rótulo de presentación. - print_on_startup(); + // On startup. + show_banner(); // Inicia registro de trazas y eventos. LazyStatic::force(&trace::TRACING); @@ -53,46 +49,74 @@ impl Application { // Ejecuta actualizaciones pendientes de la base de datos. module::all::run_migrations(); + Ok(Self) + } + + pub fn run(self) -> Result { + // Generate cookie key. + let secret_key = service::cookie::Key::generate(); + // Prepara el servidor web. - let secret_key = get_secret_key(); - let server = service::HttpServer::new(move || { - service::App::new() + Ok(service::HttpServer::new(move || { + service_app() .wrap(tracing_actix_web::TracingLogger::default()) .wrap( SessionMiddleware::builder(CookieSessionStore::default(), secret_key.clone()) .session_lifecycle(match config::SETTINGS.server.session_lifetime { 0 => SessionLifecycle::BrowserSession(BrowserSession::default()), _ => SessionLifecycle::PersistentSession( - PersistentSession::default().session_ttl(Duration::seconds( - config::SETTINGS.server.session_lifetime, - )), + PersistentSession::default().session_ttl( + service::cookie::time::Duration::seconds( + config::SETTINGS.server.session_lifetime, + ), + ), ), }) .build(), ) - .configure(module::all::configure_services) - .default_service(service::web::route().to(service_not_found)) }) .bind(format!( "{}:{}", &config::SETTINGS.server.bind_address, &config::SETTINGS.server.bind_port ))? - .run(); - - Ok(Self { server }) + .run()) } - pub fn run(self) -> Result { - Ok(self.server) - } - - pub fn server(self) -> Server { - self.server + pub fn test( + self, + ) -> service::App< + impl service::Factory< + service::Request, + Config = (), + Response = service::Response, + Error = service::Error, + InitError = (), + >, + > { + service_app() } } -fn print_on_startup() { +fn service_app() -> service::App< + impl service::Factory< + service::Request, + Config = (), + Response = service::Response, + Error = service::Error, + InitError = (), + >, +> { + service::App::new() + .configure(module::all::configure_services) + .default_service(service::web::route().to(service_not_found)) +} + +async fn service_not_found(request: service::HttpRequest) -> ResultPage { + Err(FatalError::NotFound(request)) +} + +fn show_banner() { if config::SETTINGS.app.startup_banner.to_lowercase() != "off" { // Application name. let mut app_name = config::SETTINGS.app.name.to_string(); @@ -121,11 +145,3 @@ fn print_on_startup() { ); } } - -fn get_secret_key() -> Key { - Key::generate() -} - -async fn service_not_found(request: service::HttpRequest) -> ResultPage { - Err(FatalError::NotFound(request)) -} diff --git a/pagetop/src/service.rs b/pagetop/src/service.rs index f6a09c29..9e2bf551 100644 --- a/pagetop/src/service.rs +++ b/pagetop/src/service.rs @@ -1,9 +1,13 @@ //! Tipos y funciones para operar con el servidor web ([actix-web](https://docs.rs/actix-web)). pub use actix_session::Session; -pub use actix_web::{ - cookie, get, http, rt, web, App, HttpMessage, HttpRequest, HttpResponse, HttpServer, Responder, -}; +pub use actix_web::body::BoxBody; +pub use actix_web::dev::Server; +pub use actix_web::dev::ServiceFactory as Factory; +pub use actix_web::dev::ServiceRequest as Request; +pub use actix_web::dev::ServiceResponse as Response; +pub use actix_web::{cookie, get, http, rt, test, web}; +pub use actix_web::{App, Error, HttpMessage, HttpRequest, HttpResponse, HttpServer, Responder}; pub use actix_web_files::Files as ActixFiles; pub use actix_web_static_files::ResourceFiles; diff --git a/pagetop/tests/main.rs b/pagetop/tests/main.rs new file mode 100644 index 00000000..b93d337f --- /dev/null +++ b/pagetop/tests/main.rs @@ -0,0 +1,2 @@ +#[cfg(test)] +mod server; diff --git a/pagetop/tests/server/health_check.rs b/pagetop/tests/server/health_check.rs new file mode 100644 index 00000000..db08e31e --- /dev/null +++ b/pagetop/tests/server/health_check.rs @@ -0,0 +1,20 @@ +use pagetop::prelude::*; + +new_handle!(MODULE_TEST_SERVER_HEALTH_CHECK); + +struct HealthCheck; + +impl ModuleTrait for HealthCheck { + fn handle(&self) -> Handle { + MODULE_TEST_SERVER_HEALTH_CHECK + } +} + +#[pagetop::test] +async fn health_check_works() { + let app = service::test::init_service(Application::prepare(&HealthCheck).unwrap().test()).await; + let req = service::test::TestRequest::get().uri("/").to_request(); + let _resp = service::test::call_service(&app, req).await; + +// assert_eq!("OK", "OK"); +} diff --git a/tests/src/server.rs b/pagetop/tests/server/mod.rs similarity index 100% rename from tests/src/server.rs rename to pagetop/tests/server/mod.rs diff --git a/tests/Cargo.toml b/tests/Cargo.toml deleted file mode 100644 index cf54f760..00000000 --- a/tests/Cargo.toml +++ /dev/null @@ -1,17 +0,0 @@ -[package] -name = "tests" -version = "0.0.1" -edition = "2021" - -authors = [ - "Manuel Cillero " -] -description = """\ - Tests for PageTop.\ -""" -homepage = "https://pagetop.cillero.es" -repository = "https://github.com/manuelcillero/pagetop" -license = "Apache-2.0 OR MIT" - -[dependencies] -pagetop = { version = "0.0", path = "../pagetop", features = ["mysql"], default-features = false } diff --git a/tests/src/main.rs b/tests/src/main.rs deleted file mode 100644 index df4adf9f..00000000 --- a/tests/src/main.rs +++ /dev/null @@ -1 +0,0 @@ -mod server; diff --git a/tests/src/server/health_check.rs b/tests/src/server/health_check.rs deleted file mode 100644 index 0898211a..00000000 --- a/tests/src/server/health_check.rs +++ /dev/null @@ -1,15 +0,0 @@ -use pagetop::prelude::*; - -struct HealthCheck; - -impl ModuleTrait for HealthCheck {} - -async fn spawn_app() { - let server = Application::prepare(&HealthCheck).unwrap().server(); - let _ = actix_web::rt::spawn(server); -} - -#[actix_web::test] -async fn health_check_works() { - spawn_app(); -}