TestServer

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<TestServer, Error>

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<TestServer, Error>

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 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, Error>

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<(), Error>

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> Chain<T> for T

Source§

fn len(&self) -> usize

The number of items that this chain link consists of.
Source§

fn append_to(self, v: &mut Vec<T>)

Append the elements in this link to the chain.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
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> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

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

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. 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<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,

Source§

impl<T> MaybeSend for T
where T: Send,