diff --git a/tests/test_client.rs b/tests/test_client.rs index 6118bc339..ef34d39a5 100644 --- a/tests/test_client.rs +++ b/tests/test_client.rs @@ -321,3 +321,62 @@ fn test_body_streaming_implicit() { let bytes = srv.execute(response.body()).unwrap(); assert_eq!(bytes, Bytes::from_static(STR.as_ref())); } + +#[test] +fn test_client_cookie_handling() { + use actix_web::header::Cookie; + fn err() -> Error { + use std::io::{ErrorKind, Error as IoError}; + // stub some generic error + Error::from(IoError::from(ErrorKind::NotFound)) + } + let cookie1 = Cookie::build("cookie1", "value1").finish(); + let cookie2 = Cookie::build("cookie2", "value2") + .domain("www.example.org") + .path("/") + .secure(true) + .http_only(true) + .finish(); + // Q: are all these clones really necessary? A: Yes, possibly + let cookie1b = cookie1.clone(); + let cookie2b = cookie2.clone(); + let mut srv = test::TestServer::new( + move |app| { + let cookie1 = cookie1b.clone(); + let cookie2 = cookie2b.clone(); + app.handler(move |req: HttpRequest| { + // Check cookies were sent correctly + req.cookie("cookie1").ok_or_else(err) + .and_then(|c1| if c1.value() == "value1" { + Ok(()) + } else { + Err(err()) + }) + .and_then(|()| req.cookie("cookie2").ok_or_else(err)) + .and_then(|c2| if c2.value() == "value2" { + Ok(()) + } else { + Err(err()) + }) + // Send some cookies back + .map(|_| + httpcodes::HTTPOk.build() + .cookie(cookie1.clone()) + .cookie(cookie2.clone()) + .finish() + ) + }) + }); + + let request = srv.get() + .cookie(cookie1.clone()) + .cookie(cookie2.clone()) + .finish() + .unwrap(); + let response = srv.execute(request.send()).unwrap(); + assert!(response.status().is_success()); + let c1 = response.cookie("cookie1").expect("Missing cookie1"); + assert_eq!(c1, &cookie1); + let c2 = response.cookie("cookie2").expect("Missing cookie2"); + assert_eq!(c2, &cookie2); +}