2017-06-06 20:41:04 +00:00
|
|
|
//! Structures for local dispatching of requests, primarily for testing.
|
|
|
|
//!
|
|
|
|
//! This module allows for simple request dispatching against a local,
|
|
|
|
//! non-networked instance of Rocket. The primary use of this module is to unit
|
|
|
|
//! and integration test Rocket applications by crafting requests, dispatching
|
|
|
|
//! them, and verifying the response.
|
|
|
|
//!
|
|
|
|
//! # Usage
|
|
|
|
//!
|
|
|
|
//! This module contains a [`Client`] structure that is used to create
|
|
|
|
//! [`LocalRequest`] structures that can be dispatched against a given
|
|
|
|
//! [`Rocket`] instance. Usage is straightforward:
|
|
|
|
//!
|
|
|
|
//! 1. Construct a `Rocket` instance that represents the application.
|
|
|
|
//!
|
|
|
|
//! ```rust
|
|
|
|
//! let rocket = rocket::ignite();
|
|
|
|
//! # let _ = rocket;
|
|
|
|
//! ```
|
|
|
|
//!
|
|
|
|
//! 2. Construct a `Client` using the `Rocket` instance.
|
|
|
|
//!
|
|
|
|
//! ```rust
|
|
|
|
//! # use rocket::local::Client;
|
|
|
|
//! # let rocket = rocket::ignite();
|
|
|
|
//! let client = Client::new(rocket).expect("valid rocket instance");
|
|
|
|
//! # let _ = client;
|
|
|
|
//! ```
|
|
|
|
//!
|
|
|
|
//! 3. Construct requests using the `Client` instance.
|
|
|
|
//!
|
|
|
|
//! ```rust
|
|
|
|
//! # use rocket::local::Client;
|
|
|
|
//! # let rocket = rocket::ignite();
|
|
|
|
//! # let client = Client::new(rocket).unwrap();
|
|
|
|
//! let req = client.get("/");
|
|
|
|
//! # let _ = req;
|
|
|
|
//! ```
|
|
|
|
//!
|
|
|
|
//! 3. Dispatch the request to retrieve the response.
|
|
|
|
//!
|
|
|
|
//! ```rust
|
|
|
|
//! # use rocket::local::Client;
|
|
|
|
//! # let rocket = rocket::ignite();
|
|
|
|
//! # let client = Client::new(rocket).unwrap();
|
|
|
|
//! # let req = client.get("/");
|
|
|
|
//! let response = req.dispatch();
|
|
|
|
//! # let _ = response;
|
|
|
|
//! ```
|
|
|
|
//!
|
|
|
|
//! All together and in idiomatic fashion, this might look like:
|
|
|
|
//!
|
|
|
|
//! ```rust
|
|
|
|
//! use rocket::local::Client;
|
|
|
|
//!
|
|
|
|
//! let client = Client::new(rocket::ignite()).expect("valid rocket");
|
|
|
|
//! let response = client.post("/")
|
|
|
|
//! .body("Hello, world!")
|
|
|
|
//! .dispatch();
|
|
|
|
//! # let _ = response;
|
|
|
|
//! ```
|
|
|
|
//!
|
|
|
|
//! # Unit/Integration Testing
|
|
|
|
//!
|
|
|
|
//! This module can be used to test a Rocket application by constructing
|
|
|
|
//! requests via `Client` and validating the resulting response. As an example,
|
|
|
|
//! consider the following complete "Hello, world!" application, with testing.
|
|
|
|
//!
|
|
|
|
//! ```rust
|
|
|
|
//! #![feature(plugin)]
|
|
|
|
//! #![plugin(rocket_codegen)]
|
|
|
|
//!
|
|
|
|
//! extern crate rocket;
|
|
|
|
//!
|
|
|
|
//! #[get("/")]
|
|
|
|
//! fn hello() -> &'static str {
|
|
|
|
//! "Hello, world!"
|
|
|
|
//! }
|
|
|
|
//!
|
|
|
|
//! # fn main() { }
|
|
|
|
//! #[cfg(test)]
|
|
|
|
//! mod test {
|
|
|
|
//! use super::{rocket, hello};
|
|
|
|
//! use rocket::local::Client;
|
|
|
|
//!
|
|
|
|
//! #[test]
|
|
|
|
//! fn test_hello_world() {
|
|
|
|
//! // Construct a client to use for dispatching requests.
|
2017-06-11 08:03:59 +00:00
|
|
|
//! let rocket = rocket::ignite().mount("/", routes![hello]);
|
|
|
|
//! let client = Client::new(rocket).expect("valid rocket instance");
|
2017-06-06 20:41:04 +00:00
|
|
|
//!
|
|
|
|
//! // Dispatch a request to 'GET /' and validate the response.
|
|
|
|
//! let mut response = client.get("/").dispatch();
|
|
|
|
//! assert_eq!(response.body_string(), Some("Hello, world!".into()));
|
|
|
|
//! }
|
|
|
|
//! }
|
|
|
|
//! ```
|
|
|
|
//!
|
|
|
|
//! [`Client`]: /rocket/local/struct.Client.html
|
|
|
|
//! [`LocalRequest`]: /rocket/local/struct.LocalRequest.html
|
|
|
|
//! [`Rocket`]: /rocket/struct.Rocket.html
|
|
|
|
//!
|
|
|
|
|
|
|
|
mod request;
|
|
|
|
mod client;
|
|
|
|
|
|
|
|
pub use self::request::{LocalResponse, LocalRequest};
|
|
|
|
pub use self::client::Client;
|