pub struct TestResponse { /* private fields */ }
Expand description
The TestResponse
is the result of a request created using a TestServer
.
The TestServer
builds a TestRequest
, which when awaited,
will produce the response.
use axum::Json;
use axum::Router;
use axum::routing::get;
use axum_test::TestServer;
use serde::Deserialize;
use serde::Serialize;
let app = Router::new()
.route(&"/test", get(|| async { "hello!" }));
let server = TestServer::new(app)?;
// This builds a `TestResponse`
let response = server.get(&"/todo").await;
§Extracting Response
The functions TestResponse::json()
, TestResponse::text()
,
and TestResponse::form()
,
allow you to extract the underlying response content in different formats.
let todo_response = server.get(&"/todo")
.await
.json::<Todo>();
let response_as_raw_text = server.get(&"/todo")
.await
.text();
TestResponse::as_bytes()
and TestResponse::into_bytes()
,
offer the underlying raw bytes to allow custom decoding.
Full code examples can be found within their documentation.
§Assertions
The result of a response can also be asserted using the many assertion functions.
use axum::Json;
use axum::Router;
use axum_test::TestServer;
use axum::routing::get;
use serde::Deserialize;
use serde::Serialize;
let app = Router::new()
.route(&"/test", get(|| async { "hello!" }));
let server = TestServer::new(app)?;
let response = server.get(&"/todo").await;
// These assertions will panic if they are not fulfilled by the response.
response.assert_status_ok();
response.assert_text("hello!");
Implementations§
Source§impl TestResponse
impl TestResponse
Sourcepub fn text(&self) -> String
pub fn text(&self) -> String
Returns the underlying response, extracted as a UTF-8 string.
§Example
use axum::Json;
use axum::Router;
use axum::routing::get;
use serde_json::json;
use serde_json::Value;
use axum_test::TestServer;
async fn route_get_todo() -> Json<Value> {
Json(json!({
"description": "buy milk",
}))
}
let app = Router::new()
.route(&"/todo", get(route_get_todo));
let server = TestServer::new(app)?;
let response = server.get(&"/todo").await;
// Extract the response as a string on it's own.
let raw_text = response.text();
Sourcepub fn json<T>(&self) -> Twhere
T: DeserializeOwned,
pub fn json<T>(&self) -> Twhere
T: DeserializeOwned,
Deserializes the response, as Json, into the type given.
If deserialization fails then this will panic.
§Example
use axum::Json;
use axum::Router;
use axum::routing::get;
use serde::Deserialize;
use serde::Serialize;
use axum_test::TestServer;
#[derive(Serialize, Deserialize, Debug)]
struct Todo {
description: String,
}
async fn route_get_todo() -> Json<Todo> {
Json(Todo {
description: "buy milk".to_string(),
})
}
let app = Router::new()
.route(&"/todo", get(route_get_todo));
let server = TestServer::new(app)?;
let response = server.get(&"/todo").await;
// Extract the response as a `Todo` item.
let todo = response.json::<Todo>();
Sourcepub fn yaml<T>(&self) -> Twhere
T: DeserializeOwned,
Available on crate feature yaml
only.
pub fn yaml<T>(&self) -> Twhere
T: DeserializeOwned,
yaml
only.Deserializes the response, as Yaml, into the type given.
If deserialization fails then this will panic.
§Example
use axum::Router;
use axum::routing::get;
use axum_yaml::Yaml;
use serde::Deserialize;
use serde::Serialize;
use axum_test::TestServer;
#[derive(Serialize, Deserialize, Debug)]
struct Todo {
description: String,
}
async fn route_get_todo() -> Yaml<Todo> {
Yaml(Todo {
description: "buy milk".to_string(),
})
}
let app = Router::new()
.route(&"/todo", get(route_get_todo));
let server = TestServer::new(app)?;
let response = server.get(&"/todo").await;
// Extract the response as a `Todo` item.
let todo = response.yaml::<Todo>();
Sourcepub fn msgpack<T>(&self) -> Twhere
T: DeserializeOwned,
Available on crate feature msgpack
only.
pub fn msgpack<T>(&self) -> Twhere
T: DeserializeOwned,
msgpack
only.Deserializes the response, as MsgPack, into the type given.
If deserialization fails then this will panic.
§Example
use axum::Router;
use axum::routing::get;
use axum_msgpack::MsgPack;
use serde::Deserialize;
use serde::Serialize;
use axum_test::TestServer;
#[derive(Serialize, Deserialize, Debug)]
struct Todo {
description: String,
}
async fn route_get_todo() -> MsgPack<Todo> {
MsgPack(Todo {
description: "buy milk".to_string(),
})
}
let app = Router::new()
.route(&"/todo", get(route_get_todo));
let server = TestServer::new(app)?;
let response = server.get(&"/todo").await;
// Extract the response as a `Todo` item.
let todo = response.msgpack::<Todo>();
Sourcepub fn form<T>(&self) -> Twhere
T: DeserializeOwned,
pub fn form<T>(&self) -> Twhere
T: DeserializeOwned,
Deserializes the response, as an urlencoded Form, into the type given.
If deserialization fails then this will panic.
§Example
use axum::Form;
use axum::Router;
use axum::routing::get;
use serde::Deserialize;
use serde::Serialize;
use axum_test::TestServer;
#[derive(Serialize, Deserialize, Debug)]
struct Todo {
description: String,
}
async fn route_get_todo() -> Form<Todo> {
Form(Todo {
description: "buy milk".to_string(),
})
}
let app = Router::new()
.route(&"/todo", get(route_get_todo));
let server = TestServer::new(app)?;
let response = server.get(&"/todo").await;
// Extract the response as a `Todo` item.
let todo = response.form::<Todo>();
Sourcepub fn into_bytes(self) -> Bytes
pub fn into_bytes(self) -> Bytes
Consumes this returning the underlying Bytes
in the response.
Sourcepub fn status_code(&self) -> StatusCode
pub fn status_code(&self) -> StatusCode
The status_code of the response.
Sourcepub fn request_method(&self) -> Method
pub fn request_method(&self) -> Method
The Method used to produce this response.
Sourcepub fn request_url(&self) -> Url
pub fn request_url(&self) -> Url
The full URL that was used to produce this response.
Sourcepub fn maybe_header<N>(&self, name: N) -> Option<HeaderValue>
pub fn maybe_header<N>(&self, name: N) -> Option<HeaderValue>
Finds a header with the given name.
If there are multiple headers with the same name,
then only the first HeaderValue
will be returned.
None
is returned when no header was found.
Sourcepub fn headers(&self) -> &HeaderMap<HeaderValue>
pub fn headers(&self) -> &HeaderMap<HeaderValue>
Returns the headers returned from the response.
pub fn maybe_content_type(&self) -> Option<String>
pub fn content_type(&self) -> String
Sourcepub fn header<N>(&self, name: N) -> HeaderValue
pub fn header<N>(&self, name: N) -> HeaderValue
Finds a header with the given name. If there are multiple headers with the same name, then only the first will be returned.
If no header is found, then this will panic.
Sourcepub fn iter_headers(&self) -> impl Iterator<Item = (&HeaderName, &HeaderValue)>
pub fn iter_headers(&self) -> impl Iterator<Item = (&HeaderName, &HeaderValue)>
Iterates over all of the headers contained in the response.
Sourcepub fn iter_headers_by_name<N>(
&self,
name: N,
) -> impl Iterator<Item = &HeaderValue>
pub fn iter_headers_by_name<N>( &self, name: N, ) -> impl Iterator<Item = &HeaderValue>
Iterates over all of the headers for a specific name, contained in the response.
pub fn contains_header<N>(&self, name: N) -> bool
Sourcepub fn assert_contains_header<N>(&self, name: N)
pub fn assert_contains_header<N>(&self, name: N)
Asserts the header named is present in the response.
If the header is not present, then the assertion fails.
pub fn assert_header<N, V>(&self, name: N, value: V)where
N: TryInto<HeaderName> + Display + Clone,
N::Error: Debug,
V: TryInto<HeaderValue>,
V::Error: Debug,
Finds a Cookie
with the given name.
If there are multiple matching cookies,
then only the first will be returned.
None
is returned if no Cookie is found.
Finds a Cookie
with the given name.
If there are multiple matching cookies,
then only the first will be returned.
If no Cookie
is found, then this will panic.
Returns all of the cookies contained in the response,
within a CookieJar
object.
See the cookie
crate for details.
Iterate over all of the cookies in the response.
Sourcepub async fn into_websocket(self) -> TestWebSocket
Available on crate feature ws
only.
pub async fn into_websocket(self) -> TestWebSocket
ws
only.Consumes the request, turning it into a TestWebSocket
.
If this cannot be done, then the response will panic.
Note, this requires the server to be running on a real HTTP
port. Either using a randomly assigned port, or a specified one.
See the TestServerConfig::transport
for more details.
§Example
use axum::Router;
use axum_test::TestServer;
let app = Router::new();
let server = TestServer::builder()
.http_transport()
.build(app)?;
let mut websocket = server
.get_websocket(&"/my-web-socket-end-point")
.await
.into_websocket()
.await;
websocket.send_text("Hello!").await;
Sourcepub fn assert_text<C>(&self, expected: C)
pub fn assert_text<C>(&self, expected: C)
This performs an assertion comparing the whole body of the response, against the text provided.
Sourcepub fn assert_text_contains<C>(&self, expected: C)
pub fn assert_text_contains<C>(&self, expected: C)
This asserts if the text given is contained, somewhere, within the response.
Sourcepub fn assert_text_from_file<P>(&self, path: P)
pub fn assert_text_from_file<P>(&self, path: P)
Asserts the response from the server matches the contents of the file.
Sourcepub fn assert_json<T>(&self, expected: &T)
pub fn assert_json<T>(&self, expected: &T)
Deserializes the contents of the request as Json, and asserts it matches the value given.
If other
does not match, or the response is not Json,
then this will panic.
Sourcepub fn assert_json_contains<T>(&self, expected: &T)where
T: Serialize,
pub fn assert_json_contains<T>(&self, expected: &T)where
T: Serialize,
Asserts the content is within the json returned. This is useful for when servers return times and IDs that you wish to ignore.
use axum::Router;
use axum::extract::Json;
use axum::routing::get;
use axum_test::TestServer;
use serde_json::json;
use std::time::Instant;
let app = Router::new()
.route(&"/user", get(|| async {
let id = Instant::now().elapsed().as_millis();
Json(json!({
"id": id,
"name": "Joe",
"age": 20,
}))
}));
let server = TestServer::new(app)?;
// Checks the response contains _only_ the values listed here,
// and ignores the rest.
server.get(&"/user")
.await
.assert_json_contains(&json!({
"name": "Joe",
"age": 20,
}));
Sourcepub fn assert_json_from_file<P>(&self, path: P)
pub fn assert_json_from_file<P>(&self, path: P)
Read json file from given path and assert it with json response.
use axum::Json;
use axum::routing::get;
use axum::routing::Router;
use axum_test::TestServer;
use serde_json::json;
let app = Router::new()
.route(&"/json", get(|| async {
Json(json!({
"name": "Joe",
"age": 20,
}))
}));
let server = TestServer::new(app).unwrap();
server
.get(&"/json")
.await
.assert_json_from_file("files/example.json");
Sourcepub fn assert_yaml<T>(&self, other: &T)
Available on crate feature yaml
only.
pub fn assert_yaml<T>(&self, other: &T)
yaml
only.Deserializes the contents of the request as Yaml, and asserts it matches the value given.
If other
does not match, or the response is not Yaml,
then this will panic.
Sourcepub fn assert_yaml_from_file<P>(&self, path: P)
Available on crate feature yaml
only.
pub fn assert_yaml_from_file<P>(&self, path: P)
yaml
only.Read yaml file from given path and assert it with yaml response.
Sourcepub fn assert_msgpack<T>(&self, other: &T)
Available on crate feature msgpack
only.
pub fn assert_msgpack<T>(&self, other: &T)
msgpack
only.Deserializes the contents of the request as MsgPack, and asserts it matches the value given.
If other
does not match, or the response is not MsgPack,
then this will panic.
Sourcepub fn assert_form<T>(&self, other: &T)
pub fn assert_form<T>(&self, other: &T)
Deserializes the contents of the request as an url encoded form, and asserts it matches the value given.
If other
does not match, or the response cannot be deserialized,
then this will panic.
Sourcepub fn assert_status(&self, expected_status_code: StatusCode)
pub fn assert_status(&self, expected_status_code: StatusCode)
Assert the response status code matches the one given.
Sourcepub fn assert_not_status(&self, expected_status_code: StatusCode)
pub fn assert_not_status(&self, expected_status_code: StatusCode)
Assert the response status code does not match the one given.
Sourcepub fn assert_status_success(&self)
pub fn assert_status_success(&self)
Assert that the status code is within the 2xx range. i.e. The range from 200-299.
Sourcepub fn assert_status_failure(&self)
pub fn assert_status_failure(&self)
Assert that the status code is outside the 2xx range. i.e. A status code less than 200, or 300 or more.
Sourcepub fn assert_status_in_range<R, S>(&self, expected_status_range: R)
pub fn assert_status_in_range<R, S>(&self, expected_status_range: R)
Assert the status code is within the range given.
use axum::Json;
use axum::routing::get;
use axum::routing::Router;
use axum_test::TestServer;
use http::StatusCode;
let app = Router::new()
.route(&"/json", get(|| async {
StatusCode::OK
}));
let server = TestServer::new(app).unwrap();
// Within success statuses
server
.get(&"/json")
.await
.assert_status_in_range(200..=299);
// Outside success
server
.get(&"/json")
.await
.assert_status_in_range(300..);
// Before server error
server
.get(&"/json")
.await
.assert_status_in_range(..StatusCode::INTERNAL_SERVER_ERROR);
Sourcepub fn assert_status_not_in_range<R, S>(&self, expected_status_range: R)
pub fn assert_status_not_in_range<R, S>(&self, expected_status_range: R)
Assert the status code is not within the range given.
use axum::Json;
use axum::routing::get;
use axum::routing::Router;
use axum_test::TestServer;
use http::StatusCode;
let app = Router::new()
.route(&"/json", get(|| async {
StatusCode::NOT_FOUND
}));
let server = TestServer::new(app).unwrap();
// Is not success
server
.get(&"/json")
.await
.assert_status_not_in_range(200..=299);
// 300 or higher
server
.get(&"/json")
.await
.assert_status_not_in_range(300..);
// After server error
server
.get(&"/json")
.await
.assert_status_not_in_range(..StatusCode::INTERNAL_SERVER_ERROR);
Sourcepub fn assert_status_ok(&self)
pub fn assert_status_ok(&self)
Assert the response status code is 200.
Sourcepub fn assert_status_not_ok(&self)
pub fn assert_status_not_ok(&self)
Assert the response status code is not 200.
Sourcepub fn assert_status_see_other(&self)
pub fn assert_status_see_other(&self)
Assert the response status code is 303.
Sourcepub fn assert_status_bad_request(&self)
pub fn assert_status_bad_request(&self)
Assert the response status code is 400.
Sourcepub fn assert_status_not_found(&self)
pub fn assert_status_not_found(&self)
Assert the response status code is 404.
Assert the response status code is 401.
Sourcepub fn assert_status_forbidden(&self)
pub fn assert_status_forbidden(&self)
Assert the response status code is 403.
Sourcepub fn assert_status_conflict(&self)
pub fn assert_status_conflict(&self)
Assert the response status code is 409.
Sourcepub fn assert_status_payload_too_large(&self)
pub fn assert_status_payload_too_large(&self)
Assert the response status code is 413.
The payload is too large.
Sourcepub fn assert_status_unprocessable_entity(&self)
pub fn assert_status_unprocessable_entity(&self)
Assert the response status code is 422.
Sourcepub fn assert_status_too_many_requests(&self)
pub fn assert_status_too_many_requests(&self)
Assert the response status code is 429.
Sourcepub fn assert_status_switching_protocols(&self)
pub fn assert_status_switching_protocols(&self)
Assert the response status code is 101.
This type of code is used in Web Socket connection when first request.
Sourcepub fn assert_status_internal_server_error(&self)
pub fn assert_status_internal_server_error(&self)
Assert the response status code is 500.
Assert the response status code is 503.
Trait Implementations§
Source§impl Clone for TestResponse
impl Clone for TestResponse
Source§fn clone(&self) -> TestResponse
fn clone(&self) -> TestResponse
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl Debug for TestResponse
impl Debug for TestResponse
Source§impl From<TestResponse> for Bytes
impl From<TestResponse> for Bytes
Source§fn from(response: TestResponse) -> Self
fn from(response: TestResponse) -> Self
Auto Trait Implementations§
impl !Freeze for TestResponse
impl RefUnwindSafe for TestResponse
impl Send for TestResponse
impl Sync for TestResponse
impl Unpin for TestResponse
impl UnwindSafe for TestResponse
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
Source§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request
Source§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self
with the foreground set to
value
.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red()
and
green()
, which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg()
:
use yansi::{Paint, Color};
painted.fg(Color::White);
Set foreground color to white using white()
.
use yansi::Paint;
painted.white();
Source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Returns self
with the
fg()
set to
Color::BrightBlack
.
§Example
println!("{}", value.bright_black());
Source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Returns self
with the
fg()
set to
Color::BrightGreen
.
§Example
println!("{}", value.bright_green());
Source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Returns self
with the
fg()
set to
Color::BrightYellow
.
§Example
println!("{}", value.bright_yellow());
Source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Returns self
with the
fg()
set to
Color::BrightMagenta
.
§Example
println!("{}", value.bright_magenta());
Source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Returns self
with the
fg()
set to
Color::BrightWhite
.
§Example
println!("{}", value.bright_white());
Source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self
with the background set to
value
.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red()
and
on_green()
, which have the same functionality but
are pithier.
§Example
Set background color to red using fg()
:
use yansi::{Paint, Color};
painted.bg(Color::Red);
Set background color to red using on_red()
.
use yansi::Paint;
painted.on_red();
Source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightBlack
.
§Example
println!("{}", value.on_bright_black());
Source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightGreen
.
§Example
println!("{}", value.on_bright_green());
Source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightYellow
.
§Example
println!("{}", value.on_bright_yellow());
Source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightBlue
.
§Example
println!("{}", value.on_bright_blue());
Source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightMagenta
.
§Example
println!("{}", value.on_bright_magenta());
Source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightCyan
.
§Example
println!("{}", value.on_bright_cyan());
Source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightWhite
.
§Example
println!("{}", value.on_bright_white());
Source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute
value
.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold()
and
underline()
, which have the same functionality
but are pithier.
§Example
Make text bold using attr()
:
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);
Make text bold using using bold()
.
use yansi::Paint;
painted.bold();
Source§fn underline(&self) -> Painted<&T>
fn underline(&self) -> Painted<&T>
Returns self
with the
attr()
set to
Attribute::Underline
.
§Example
println!("{}", value.underline());
Source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Returns self
with the
attr()
set to
Attribute::RapidBlink
.
§Example
println!("{}", value.rapid_blink());
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi
Quirk
value
.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask()
and
wrap()
, which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk()
:
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);
Enable wrapping using wrap()
.
use yansi::Paint;
painted.wrap();
Source§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting()
due to conflicts with Vec::clear()
.
The clear()
method will be removed in a future release.
fn clear(&self) -> Painted<&T>
resetting()
due to conflicts with Vec::clear()
.
The clear()
method will be removed in a future release.Source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition
value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted
only when both stdout
and stderr
are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);