add tests

This commit is contained in:
Rob Ede 2022-04-08 12:59:45 +01:00
parent 783b3f7a8f
commit 34ef7d1bd1
No known key found for this signature in database
GPG Key ID: 97C636207D3EF933
2 changed files with 54 additions and 6 deletions

View File

@ -1,9 +1,11 @@
# Changelog # Changelog
## Unreleased - 2021-xx-xx ## Unreleased - 2021-xx-xx
- Add `ServiceRequest::extract` to make it easier to use extractors when writing middlewares. [#2647] - Add `ServiceRequest::extract()` to make it easier to use extractors when writing middlewares. [#2647]
- Add `Route::wrap()` to allow individual routes to use middleware. [#2725]
[#2647]: https://github.com/actix/actix-web/pull/2647 [#2647]: https://github.com/actix/actix-web/pull/2647
[#2725]: https://github.com/actix/actix-web/pull/2725
## 4.0.1 - 2022-02-25 ## 4.0.1 - 2022-02-25

View File

@ -37,6 +37,12 @@ impl Route {
} }
} }
/// Registers a route middleware.
///
/// `mw` is a middleware component (type), that can modify the requests and responses handled by
/// this `Route`.
///
/// See [`App::wrap`](crate::App::wrap) for more details.
#[doc(alias = "middleware")] #[doc(alias = "middleware")]
#[doc(alias = "use")] // nodejs terminology #[doc(alias = "use")] // nodejs terminology
pub fn wrap<M, B>(self, mw: M) -> Route pub fn wrap<M, B>(self, mw: M) -> Route
@ -267,11 +273,15 @@ mod tests {
use futures_core::future::LocalBoxFuture; use futures_core::future::LocalBoxFuture;
use serde::Serialize; use serde::Serialize;
use crate::dev::{always_ready, fn_factory, fn_service, Service}; use crate::{
use crate::http::{header, Method, StatusCode}; dev::{always_ready, fn_factory, fn_service, Service},
use crate::service::{ServiceRequest, ServiceResponse}; error,
use crate::test::{call_service, init_service, read_body, TestRequest}; http::{header, Method, StatusCode},
use crate::{error, web, App, HttpResponse}; middleware::{DefaultHeaders, Logger},
service::{ServiceRequest, ServiceResponse},
test::{call_service, init_service, read_body, TestRequest},
web, App, HttpResponse,
};
#[derive(Serialize, PartialEq, Debug)] #[derive(Serialize, PartialEq, Debug)]
struct MyObject { struct MyObject {
@ -344,6 +354,42 @@ mod tests {
assert_eq!(body, Bytes::from_static(b"{\"name\":\"test\"}")); assert_eq!(body, Bytes::from_static(b"{\"name\":\"test\"}"));
} }
#[actix_rt::test]
async fn route_middleware() {
let srv = init_service(
App::new().service(
web::resource("/test")
.route(web::get().to(HttpResponse::Ok))
.route(
web::post()
.to(HttpResponse::Created)
.wrap(DefaultHeaders::new().add(("x-test", "x-posted"))),
)
.route(
web::delete()
.to(HttpResponse::Accepted)
// logger changes body type, proving Compat is not needed
.wrap(Logger::default()),
),
),
)
.await;
let req = TestRequest::get().uri("/test").to_request();
let res = call_service(&srv, req).await;
assert_eq!(res.status(), StatusCode::OK);
assert!(!res.headers().contains_key("x-test"));
let req = TestRequest::post().uri("/test").to_request();
let res = call_service(&srv, req).await;
assert_eq!(res.status(), StatusCode::CREATED);
assert_eq!(res.headers().get("x-test").unwrap(), "x-posted");
let req = TestRequest::delete().uri("/test").to_request();
let res = call_service(&srv, req).await;
assert_eq!(res.status(), StatusCode::ACCEPTED);
}
#[actix_rt::test] #[actix_rt::test]
async fn test_service_handler() { async fn test_service_handler() {
struct HelloWorld; struct HelloWorld;