diff --git a/src/routes.rs b/src/routes.rs index 966fcb6..890c577 100644 --- a/src/routes.rs +++ b/src/routes.rs @@ -69,29 +69,107 @@ async fn topic_assets(req: Request) -> Result, Infallible> #[cfg(test)] mod tests { - /* use std::fs::File; - use std::io::prelude::*; use std::net::SocketAddr; + use std::io::prelude::*; use super::*; use crate::config::AppConfig; + use hyper::{Body, Request, StatusCode, Server, Client}; use routerify::RouterService; use tempfile; + use tokio::sync::oneshot::channel; + - // TODO: figure out how to actually test this.... - #[tokio::test] - async fn router_test() { + async fn check_all_handlers() { let dir = tempfile::tempdir().unwrap(); let mut src: &[u8] = b"Blog Name\nAuthor Name\nOne, Two, Three, And More\nadmin\n"; let app = AppConfig::generate(&dir, &mut src).unwrap(); let app = Arc::new(app); + + let index_page = r#" +### Main Page + +Main Important Test +"#; + let mut f = File::create(&dir.path().join("blog/webroot/main/posts/index.md")).unwrap(); + f.write_all(&index_page.as_bytes()).unwrap(); + + let topic_page = r#" +### One Section + +One Important Test +"#; + let mut f = File::create(&dir.path().join("blog/webroot/one/posts/index.md")).unwrap(); + f.write_all(&topic_page.as_bytes()).unwrap(); + + let topic_asset = b"One Static File\n"; + + let mut f = File::create(&dir.path().join("blog/webroot/one/ext/one-static")).unwrap(); + f.write_all(topic_asset).unwrap(); + + let static_asset = b"Static File\n"; + + let mut f = File::create(&dir.path().join("blog/webroot/static/main-static")).unwrap(); + f.write_all(static_asset).unwrap(); + let router = router(app.clone()); + + let index_request = Request::builder() + .method("GET") + .uri("http://localhost:10000") + .body(Body::default()) + .unwrap(); + + let topic_request = Request::builder() + .method("GET") + .uri("http://localhost:10000/one") + .body(Body::default()) + .unwrap(); + + let topic_asset_request = Request::builder() + .method("GET") + .uri("http://localhost:10000/one/ext/one-static") + .body(Body::default()) + .unwrap(); + + let static_asset_request = Request::builder() + .method("GET") + .uri("http://localhost:10000/static/main-static") + .body(Body::default()) + .unwrap(); + let service = RouterService::new(router).unwrap(); - let addr: SocketAddr = "0.0.0.0:9999".parse().unwrap(); + let addr: SocketAddr = "127.0.0.1:10000".parse().unwrap(); - } - */ + let (tx, rx) = channel::<()>(); + + let server = Server::bind(&addr).serve(service); + + let graceful = server. + with_graceful_shutdown(async { + rx.await.ok(); + }); + tokio::spawn(async move { + if let Err(e) = graceful.await { + println!("Encountered error: {}", e) + } + }); + + + let client = Client::new(); + + let index_resp = client.request(index_request).await.unwrap(); + let topic_resp = client.request(topic_request).await.unwrap(); + let topic_asset_resp = client.request(topic_asset_request).await.unwrap(); + let static_asset_resp = client.request(static_asset_request).await.unwrap(); + assert_eq!(index_resp.status(), StatusCode::OK); + assert_eq!(topic_resp.status(), StatusCode::OK); + assert_eq!(topic_asset_resp.status(), StatusCode::OK); + assert_eq!(static_asset_resp.status(), StatusCode::OK); + + let _ = tx.send(()); + } }