diff --git a/examples/http_form.rs b/examples/http_form.rs index e6abce78..fb311468 100644 --- a/examples/http_form.rs +++ b/examples/http_form.rs @@ -28,7 +28,7 @@ //! //! Alternatively you can //! -//! ``` +//! ```sh //! open http://127.0.0.1:8080 //! ``` //! diff --git a/src/http/service/web/endpoint/extract/body.rs b/src/http/service/web/endpoint/extract/body.rs index b0e388d1..48d9ee26 100644 --- a/src/http/service/web/endpoint/extract/body.rs +++ b/src/http/service/web/endpoint/extract/body.rs @@ -265,6 +265,52 @@ mod test { assert_eq!(resp.status(), StatusCode::OK); } + #[tokio::test] + async fn test_form_post_form_urlencoded_missing_data_fail() { + #[derive(Debug, serde::Deserialize)] + #[allow(dead_code)] + struct Input { + name: String, + age: u8, + } + + let service = WebService::default().post("/", |Form(_): Form| async move { + panic!("should not reach here"); + }); + + let req = http::Request::builder() + .uri("/") + .method(http::Method::POST) + .header("content-type", "application/x-www-form-urlencoded") + .body(r#"age=29"#.into()) + .unwrap(); + let resp = service.serve(Context::default(), req).await.unwrap(); + assert_eq!(resp.status(), StatusCode::BAD_REQUEST); + } + + #[tokio::test] + async fn test_form_get_form_urlencoded_fail() { + #[derive(Debug, serde::Deserialize)] + #[allow(dead_code)] + struct Input { + name: String, + age: u8, + } + + let service = WebService::default().get("/", |Form(_): Form| async move { + panic!("should not reach here"); + }); + + let req = http::Request::builder() + .uri("/") + .method(http::Method::GET) + .header("content-type", "application/x-www-form-urlencoded") + .body(r#"name=Devan&age=29"#.into()) + .unwrap(); + let resp = service.serve(Context::default(), req).await.unwrap(); + assert_eq!(resp.status(), StatusCode::BAD_REQUEST); + } + #[tokio::test] async fn test_form_get() { #[derive(Debug, serde::Deserialize)] @@ -286,4 +332,26 @@ mod test { let resp = service.serve(Context::default(), req).await.unwrap(); assert_eq!(resp.status(), StatusCode::OK); } + + #[tokio::test] + async fn test_form_get_fail_missing_data() { + #[derive(Debug, serde::Deserialize)] + #[allow(dead_code)] + struct Input { + name: String, + age: u8, + } + + let service = WebService::default().get("/", |Form(_): Form| async move { + panic!("should not reach here"); + }); + + let req = http::Request::builder() + .uri("/?name=Devan") + .method(http::Method::GET) + .body(http::Body::empty()) + .unwrap(); + let resp = service.serve(Context::default(), req).await.unwrap(); + assert_eq!(resp.status(), StatusCode::BAD_REQUEST); + } }