axum_test

Struct TestServer

Source
pub struct TestServer { /* private fields */ }
Expand description

The TestServer runs your Axum application, allowing you to make HTTP requests against it.

§Building

A TestServer can be used to run an axum::Router, an ::axum::routing::IntoMakeService, a shuttle_axum::ShuttleAxum, and others.

The most straight forward approach is to call crate::TestServer::new, and pass in your application:

use axum::Router;
use axum::routing::get;

use axum_test::TestServer;

let app = Router::new()
    .route(&"/hello", get(|| async { "hello!" }));

let server = TestServer::new(app)?;

§Requests

Requests are built by calling TestServer::get(), TestServer::post(), TestServer::put(), TestServer::delete(), and TestServer::patch() methods. Each returns a TestRequest, which allows for customising the request content.

For example:

use axum::Router;
use axum::routing::get;

use axum_test::TestServer;

let app = Router::new()
    .route(&"/hello", get(|| async { "hello!" }));

let server = TestServer::new(app)?;

let response = server.get(&"/hello")
    .authorization_bearer("password12345")
    .add_header("x-custom-header", "custom-value")
    .await;

response.assert_text("hello!");

Request methods also exist for using Axum Extra axum_extra::routing::TypedPath, or for building Reqwest reqwest::RequestBuilder. See those methods for detauls.

§Customising

A TestServer can be built from a builder, by calling crate::TestServer::builder, and customising settings. This allows one to set mocked (default when possible) or real http networking for your service.

use axum::Router;
use axum::routing::get;

use axum_test::TestServer;

let app = Router::new()
    .route(&"/hello", get(|| async { "hello!" }));

// Customise server when building
let mut server = TestServer::builder()
    .http_transport()
    .expect_success_by_default()
    .save_cookies()
    .build(app)?;

// Add items to be sent on _all_ all requests
server.add_header("x-custom-for-all", "common-value");

let response = server.get("/hello").await;

Implementations§

Source§

impl TestServer

Source

pub fn builder() -> TestServerBuilder

A helper function to create a builder for creating a TestServer.

Source

pub fn new<A>(app: A) -> Result<Self>

This will run the given Axum app, allowing you to make requests against it.

This is the same as creating a new TestServer with a configuration, and passing crate::TestServerConfig::default().

use axum::Router;
use axum::routing::get;
use axum_test::TestServer;

let app = Router::new()
    .route(&"/hello", get(|| async { "hello!" }));

let server = TestServer::new(app)?;

The of applications that can be passed in include:

Source

pub fn new_with_config<A, C>(app: A, config: C) -> Result<Self>

Similar to TestServer::new(), with a customised configuration. This includes type of transport in use (i.e. specify a specific port), or change default settings (like the default content type for requests).

This can take a crate::TestServerConfig or a crate::TestServerBuilder. See those for more information on configuration settings.

Source

pub fn get(&self, path: &str) -> TestRequest

Creates a HTTP GET request to the path.

Source

pub fn post(&self, path: &str) -> TestRequest

Creates a HTTP POST request to the given path.

Source

pub fn patch(&self, path: &str) -> TestRequest

Creates a HTTP PATCH request to the path.

Source

pub fn put(&self, path: &str) -> TestRequest

Creates a HTTP PUT request to the path.

Source

pub fn delete(&self, path: &str) -> TestRequest

Creates a HTTP DELETE request to the path.

Source

pub fn method(&self, method: Method, path: &str) -> TestRequest

Creates a HTTP request, to the method and path provided.

Source

pub fn reqwest_get(&self, path: &str) -> RequestBuilder

Available on crate feature reqwest only.
Source

pub fn reqwest_post(&self, path: &str) -> RequestBuilder

Available on crate feature reqwest only.
Source

pub fn reqwest_put(&self, path: &str) -> RequestBuilder

Available on crate feature reqwest only.
Source

pub fn reqwest_patch(&self, path: &str) -> RequestBuilder

Available on crate feature reqwest only.
Source

pub fn reqwest_delete(&self, path: &str) -> RequestBuilder

Available on crate feature reqwest only.
Source

pub fn reqwest_head(&self, path: &str) -> RequestBuilder

Available on crate feature reqwest only.
Source

pub fn reqwest_method(&self, method: Method, path: &str) -> RequestBuilder

Available on crate feature reqwest only.

Creates a HTTP request, using Reqwest, using the method + path described. This expects a relative url to the TestServer.

use axum::Router;
use axum_test::TestServer;

let my_app = Router::new();
let server = TestServer::builder()
    .http_transport() // Important, must be HTTP!
    .build(my_app)?;

// Build your request
let request = server.get(&"/user")
    .add_header("x-custom-header", "example.com")
    .content_type("application/yaml");

// await request to execute
let response = request.await;
Source

pub fn get_websocket(&self, path: &str) -> TestRequest

Available on crate feature ws only.

Creates a request to the server, to start a Websocket connection, on the path given.

This is the requivalent of making a GET request to the endpoint, and setting the various headers needed for making an upgrade request.

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;
Source

pub fn typed_get<P>(&self, path: &P) -> TestRequest
where P: TypedPath,

Available on crate feature typed-routing only.

Creates a HTTP GET request, using the typed path provided.

See axum-extra for full documentation on TypedPath.

§Example Test

Using a TypedPath you can write build and test a route like below:

use axum::Json;
use axum::Router;
use axum::routing::get;
use axum_extra::routing::RouterExt;
use axum_extra::routing::TypedPath;
use serde::Deserialize;
use serde::Serialize;

use axum_test::TestServer;

#[derive(TypedPath, Deserialize)]
#[typed_path("/users/:user_id")]
struct UserPath {
    pub user_id: u32,
}

// Build a typed route:
async fn route_get_user(UserPath { user_id }: UserPath) -> String {
    format!("hello user {user_id}")
}

let app = Router::new()
    .typed_get(route_get_user);

// Then test the route:
let server = TestServer::new(app)?;
server
    .typed_get(&UserPath { user_id: 123 })
    .await
    .assert_text("hello user 123");
Source

pub fn typed_post<P>(&self, path: &P) -> TestRequest
where P: TypedPath,

Available on crate feature typed-routing only.

Creates a HTTP POST request, using the typed path provided.

See axum-extra for full documentation on TypedPath.

Source

pub fn typed_patch<P>(&self, path: &P) -> TestRequest
where P: TypedPath,

Available on crate feature typed-routing only.

Creates a HTTP PATCH request, using the typed path provided.

See axum-extra for full documentation on TypedPath.

Source

pub fn typed_put<P>(&self, path: &P) -> TestRequest
where P: TypedPath,

Available on crate feature typed-routing only.

Creates a HTTP PUT request, using the typed path provided.

See axum-extra for full documentation on TypedPath.

Source

pub fn typed_delete<P>(&self, path: &P) -> TestRequest
where P: TypedPath,

Available on crate feature typed-routing only.

Creates a HTTP DELETE request, using the typed path provided.

See axum-extra for full documentation on TypedPath.

Source

pub fn typed_method<P>(&self, method: Method, path: &P) -> TestRequest
where P: TypedPath,

Available on crate feature typed-routing only.

Creates a typed HTTP request, using the method provided.

See axum-extra for full documentation on TypedPath.

Source

pub fn server_address(&self) -> Option<Url>

Returns the local web address for the test server, if an address is available.

The address is available when running as a real web server, by setting the TestServerConfig transport field to Transport::HttpRandomPort or Transport::HttpIpPort.

This will return None when there is mock HTTP transport (the default).

Source

pub fn server_url(&self, path: &str) -> Result<Url>

This turns a relative path, into an absolute path to the server. i.e. A path like /users/123 will become something like http://127.0.0.1:1234/users/123.

The absolute address can be used to make requests to the running server, using any appropriate client you wish.

§Example
use axum::Router;
use axum_test::TestServer;

let app = Router::new();
let server = TestServer::builder()
        .http_transport()
        .build(app)?;

let full_url = server.server_url(&"/users/123?filter=enabled")?;

// Prints something like ... http://127.0.0.1:1234/users/123?filter=enabled
println!("{full_url}");

This will return an error if you are using the mock transport. Real HTTP transport is required to use this method (see TestServerConfig transport field).

It will also return an error if you provide an absolute path, for example if you pass in http://google.com.

Adds a single cookie to be included on all future requests.

If a cookie with the same name already exists, then it will be replaced.

Source

pub fn add_cookies(&mut self, cookies: CookieJar)

Adds extra cookies to be used on all future requests.

Any cookies which have the same name as the new cookies, will get replaced.

Source

pub fn clear_cookies(&mut self)

Clears all of the cookies stored internally.

Source

pub fn save_cookies(&mut self)

Requests made using this TestServer will save their cookies for future requests to send.

This behaviour is off by default.

Source

pub fn do_not_save_cookies(&mut self)

Requests made using this TestServer will not save their cookies for future requests to send up.

This is the default behaviour.

Source

pub fn expect_success(&mut self)

Requests made using this TestServer will assert a HTTP status in the 2xx range will be returned, unless marked otherwise.

By default this behaviour is off.

Source

pub fn expect_failure(&mut self)

Requests made using this TestServer will assert a HTTP status is outside the 2xx range will be returned, unless marked otherwise.

By default this behaviour is off.

Source

pub fn add_query_param<V>(&mut self, key: &str, value: V)
where V: Serialize,

Adds a query parameter to be sent on all future requests.

Source

pub fn add_query_params<V>(&mut self, query_params: V)
where V: Serialize,

Adds query parameters to be sent on all future requests.

Source

pub fn add_raw_query_param(&mut self, raw_query_param: &str)

Adds a raw query param, with no urlencoding of any kind, to be send on all future requests.

Source

pub fn clear_query_params(&mut self)

Clears all query params set.

Source

pub fn add_header<N, V>(&mut self, name: N, value: V)

Adds a header to be sent with all future requests built from this TestServer.

use axum::Router;
use axum_test::TestServer;

let app = Router::new();
let mut server = TestServer::new(app)?;

server.add_header("x-custom-header", "custom-value");
server.add_header(http::header::CONTENT_LENGTH, 12345);
server.add_header(http::header::HOST, "example.com");

let response = server.get(&"/my-end-point")
    .await;
Source

pub fn clear_headers(&mut self)

Clears all headers set so far.

Source

pub fn scheme(&mut self, scheme: &str)

Sets the scheme to use when making all requests from the TestServer. i.e. http or https.

The default scheme is ‘http’.

use axum::Router;
use axum_test::TestServer;

let app = Router::new();
let mut server = TestServer::new(app)?;
server
    .scheme(&"https");

let response = server
    .get(&"/my-end-point")
    .await;
Source

pub fn is_running(&self) -> bool

Returns true or false if the underlying service inside the TestServer is still running. For many types of services this will always return true.

When a TestServer is built using axum::serve::WithGracefulShutdown, this will return false if the service has shutdown.

Trait Implementations§

Source§

impl Debug for TestServer

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FutureExt for T

Source§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
Source§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<T> Paint for T
where T: ?Sized,

Source§

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 primary(&self) -> Painted<&T>

Returns self with the fg() set to Color::Primary.

§Example
println!("{}", value.primary());
Source§

fn fixed(&self, color: u8) -> Painted<&T>

Returns self with the fg() set to Color::Fixed.

§Example
println!("{}", value.fixed(color));
Source§

fn rgb(&self, r: u8, g: u8, b: u8) -> Painted<&T>

Returns self with the fg() set to Color::Rgb.

§Example
println!("{}", value.rgb(r, g, b));
Source§

fn black(&self) -> Painted<&T>

Returns self with the fg() set to Color::Black.

§Example
println!("{}", value.black());
Source§

fn red(&self) -> Painted<&T>

Returns self with the fg() set to Color::Red.

§Example
println!("{}", value.red());
Source§

fn green(&self) -> Painted<&T>

Returns self with the fg() set to Color::Green.

§Example
println!("{}", value.green());
Source§

fn yellow(&self) -> Painted<&T>

Returns self with the fg() set to Color::Yellow.

§Example
println!("{}", value.yellow());
Source§

fn blue(&self) -> Painted<&T>

Returns self with the fg() set to Color::Blue.

§Example
println!("{}", value.blue());
Source§

fn magenta(&self) -> Painted<&T>

Returns self with the fg() set to Color::Magenta.

§Example
println!("{}", value.magenta());
Source§

fn cyan(&self) -> Painted<&T>

Returns self with the fg() set to Color::Cyan.

§Example
println!("{}", value.cyan());
Source§

fn white(&self) -> Painted<&T>

Returns self with the fg() set to Color::White.

§Example
println!("{}", value.white());
Source§

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>

Returns self with the fg() set to Color::BrightRed.

§Example
println!("{}", value.bright_red());
Source§

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>

Returns self with the fg() set to Color::BrightYellow.

§Example
println!("{}", value.bright_yellow());
Source§

fn bright_blue(&self) -> Painted<&T>

Returns self with the fg() set to Color::BrightBlue.

§Example
println!("{}", value.bright_blue());
Source§

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>

Returns self with the fg() set to Color::BrightCyan.

§Example
println!("{}", value.bright_cyan());
Source§

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>

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>

Returns self with the bg() set to Color::Primary.

§Example
println!("{}", value.on_primary());
Source§

fn on_fixed(&self, color: u8) -> Painted<&T>

Returns self with the bg() set to Color::Fixed.

§Example
println!("{}", value.on_fixed(color));
Source§

fn on_rgb(&self, r: u8, g: u8, b: u8) -> Painted<&T>

Returns self with the bg() set to Color::Rgb.

§Example
println!("{}", value.on_rgb(r, g, b));
Source§

fn on_black(&self) -> Painted<&T>

Returns self with the bg() set to Color::Black.

§Example
println!("{}", value.on_black());
Source§

fn on_red(&self) -> Painted<&T>

Returns self with the bg() set to Color::Red.

§Example
println!("{}", value.on_red());
Source§

fn on_green(&self) -> Painted<&T>

Returns self with the bg() set to Color::Green.

§Example
println!("{}", value.on_green());
Source§

fn on_yellow(&self) -> Painted<&T>

Returns self with the bg() set to Color::Yellow.

§Example
println!("{}", value.on_yellow());
Source§

fn on_blue(&self) -> Painted<&T>

Returns self with the bg() set to Color::Blue.

§Example
println!("{}", value.on_blue());
Source§

fn on_magenta(&self) -> Painted<&T>

Returns self with the bg() set to Color::Magenta.

§Example
println!("{}", value.on_magenta());
Source§

fn on_cyan(&self) -> Painted<&T>

Returns self with the bg() set to Color::Cyan.

§Example
println!("{}", value.on_cyan());
Source§

fn on_white(&self) -> Painted<&T>

Returns self with the bg() set to Color::White.

§Example
println!("{}", value.on_white());
Source§

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>

Returns self with the bg() set to Color::BrightRed.

§Example
println!("{}", value.on_bright_red());
Source§

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>

Returns self with the bg() set to Color::BrightYellow.

§Example
println!("{}", value.on_bright_yellow());
Source§

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>

Returns self with the bg() set to Color::BrightMagenta.

§Example
println!("{}", value.on_bright_magenta());
Source§

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>

Returns self with the bg() set to Color::BrightWhite.

§Example
println!("{}", value.on_bright_white());
Source§

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 bold(&self) -> Painted<&T>

Returns self with the attr() set to Attribute::Bold.

§Example
println!("{}", value.bold());
Source§

fn dim(&self) -> Painted<&T>

Returns self with the attr() set to Attribute::Dim.

§Example
println!("{}", value.dim());
Source§

fn italic(&self) -> Painted<&T>

Returns self with the attr() set to Attribute::Italic.

§Example
println!("{}", value.italic());
Source§

fn underline(&self) -> Painted<&T>

Returns self with the attr() set to Attribute::Underline.

§Example
println!("{}", value.underline());

Returns self with the attr() set to Attribute::Blink.

§Example
println!("{}", value.blink());

Returns self with the attr() set to Attribute::RapidBlink.

§Example
println!("{}", value.rapid_blink());
Source§

fn invert(&self) -> Painted<&T>

Returns self with the attr() set to Attribute::Invert.

§Example
println!("{}", value.invert());
Source§

fn conceal(&self) -> Painted<&T>

Returns self with the attr() set to Attribute::Conceal.

§Example
println!("{}", value.conceal());
Source§

fn strike(&self) -> Painted<&T>

Returns self with the attr() set to Attribute::Strike.

§Example
println!("{}", value.strike());
Source§

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 mask(&self) -> Painted<&T>

Returns self with the quirk() set to Quirk::Mask.

§Example
println!("{}", value.mask());
Source§

fn wrap(&self) -> Painted<&T>

Returns self with the quirk() set to Quirk::Wrap.

§Example
println!("{}", value.wrap());
Source§

fn linger(&self) -> Painted<&T>

Returns self with the quirk() set to Quirk::Linger.

§Example
println!("{}", value.linger());
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.

Returns self with the quirk() set to Quirk::Clear.

§Example
println!("{}", value.clear());
Source§

fn resetting(&self) -> Painted<&T>

Returns self with the quirk() set to Quirk::Resetting.

§Example
println!("{}", value.resetting());
Source§

fn bright(&self) -> Painted<&T>

Returns self with the quirk() set to Quirk::Bright.

§Example
println!("{}", value.bright());
Source§

fn on_bright(&self) -> Painted<&T>

Returns self with the quirk() set to Quirk::OnBright.

§Example
println!("{}", value.on_bright());
Source§

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);
Source§

fn new(self) -> Painted<Self>
where Self: Sized,

Create a new Painted with a default Style. Read more
Source§

fn paint<S>(&self, style: S) -> Painted<&Self>
where S: Into<Style>,

Apply a style wholesale to self. Any previous style is replaced. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> MaybeSendSync for T