MockService

Struct MockService 

Source
pub struct MockService<Request, Response, Assertion, Error = BoxError> { /* private fields */ }
Expand description

A service implementation that allows intercepting requests for checking them.

The type is generic over the request and response types, and also has an extra generic type parameter that’s used as a tag to determine if the internal assertions should panic or return errors for proptest minimization. See [AssertionType] for more information.

The mock service can be cloned, and provides methods for checking the received requests as well as responding to them individually.

Internally, the instance that’s operating as the service will forward requests to a broadcast channel that the other instances listen to.

See the module-level documentation for an example.

Implementations§

Source§

impl MockService<(), (), ()>

An entry point for starting the MockServiceBuilder.

This impl block exists for ergonomic reasons. The generic type parameters don’t matter, because they are actually set by MockServiceBuilder::finish.

Source

pub fn build() -> MockServiceBuilder

Create a MockServiceBuilder to help with the creation of a MockService.

Source§

impl<Request, Response, Error> MockService<Request, Response, PanicAssertion, Error>

Implementation of MockService methods that use standard Rust panicking assertions.

Source

pub async fn expect_request( &mut self, expected: Request, ) -> ResponseSender<Request, Response, Error>
where Request: PartialEq + Debug,

Expect a specific request to be received.

The expected request should be the next one in the internal queue, or if the queue is empty, it should be received in at most the max delay time configured by MockServiceBuilder::with_max_request_delay.

If the received request matches the expected request, a ResponseSender is returned which can be used to inspect the request and respond to it. If no response is sent, the sender of the requests receives an error.

§Panics

If no request is received or if a request is received that’s not equal to the expected request, this method panics.

§Example
let call = tokio::spawn(mock_service.clone().oneshot("request"));

mock_service.expect_request("request").await.respond("response");

assert!(matches!(call.await, Ok(Ok("response"))));
Source

pub async fn expect_request_that( &mut self, condition: impl FnOnce(&Request) -> bool, ) -> ResponseSender<Request, Response, Error>
where Request: Debug,

Expect a request to be received that matches a specified condition.

There should be a request already in the internal queue, or a request should be received in at most the max delay time configured by MockServiceBuilder::with_max_request_delay.

The received request is passed to the condition function, which should return true if it matches the expected condition or false otherwise. If true is returned, a ResponseSender is returned which can be used to inspect the request again and respond to it. If no response is sent, the sender of the requests receives an error.

§Panics

If the condition function returns false, this method panics.

§Example
let call = tokio::spawn(mock_service.clone().oneshot(1));

mock_service.expect_request_that(|request| *request > 0).await.respond("response");

assert!(matches!(call.await, Ok(Ok("response"))));
Source

pub async fn expect_no_requests(&mut self)
where Request: Debug,

Expect no requests to be received.

The internal queue of received requests should be empty, and no new requests should arrive for the max delay time configured by MockServiceBuilder::with_max_request_delay.

§Panics

If the queue is not empty or if a request is received before the max request delay timeout expires.

§Example
mock_service.expect_no_requests().await;
Source

pub fn poll_count(&self) -> usize

Returns a count of the number of times this service has been polled.

Note: The poll count wraps around on overflow.

Source§

impl<Request, Response, Error> MockService<Request, Response, PropTestAssertion, Error>

Implementation of MockService methods that use proptest assertions.

Source

pub async fn expect_request( &mut self, expected: Request, ) -> Result<ResponseSender<Request, Response, Error>, TestCaseError>
where Request: PartialEq + Debug,

Expect a specific request to be received.

The expected request should be the next one in the internal queue, or if the queue is empty, it should be received in at most the max delay time configured by MockServiceBuilder::with_max_request_delay.

If the received request matches the expected request, a ResponseSender is returned which can be used to inspect the request and respond to it. If no response is sent, the sender of the requests receives an error.

If no request is received or if a request is received that’s not equal to the expected request, this method returns an error generated by a proptest assertion.

§Example
let call = tokio::spawn(mock_service.clone().oneshot("request"));

// NOTE: The try operator `?` is required for errors to be handled by proptest.
mock_service
    .expect_request("request").await?
    .respond("response");

prop_assert!(matches!(call.await, Ok(Ok("response"))));
Source

pub async fn expect_request_that( &mut self, condition: impl FnOnce(&Request) -> bool, ) -> Result<ResponseSender<Request, Response, Error>, TestCaseError>
where Request: Debug,

Expect a request to be received that matches a specified condition.

There should be a request already in the internal queue, or a request should be received in at most the max delay time configured by MockServiceBuilder::with_max_request_delay.

The received request is passed to the condition function, which should return true if it matches the expected condition or false otherwise. If true is returned, a ResponseSender is returned which can be used to inspect the request again and respond to it. If no response is sent, the sender of the requests receives an error.

If the condition function returns false, this method returns an error generated by a proptest assertion.

§Example
let call = tokio::spawn(mock_service.clone().oneshot(1));

// NOTE: The try operator `?` is required for errors to be handled by proptest.
mock_service
    .expect_request_that(|request| *request > 0).await?
    .respond("OK");

prop_assert!(matches!(call.await, Ok(Ok("OK"))));
Source

pub async fn expect_no_requests(&mut self) -> Result<(), TestCaseError>
where Request: Debug,

Expect no requests to be received.

The internal queue of received requests should be empty, and no new requests should arrive for the max delay time configured by MockServiceBuilder::with_max_request_delay.

If the queue is not empty or if a request is received before the max request delay timeout expires, an error generated by a proptest assertion is returned.

§Example
// NOTE: The try operator `?` is required for errors to be handled by proptest.
mock_service.expect_no_requests().await?;
Source

pub fn poll_count(&self) -> usize

Returns a count of the number of times this service has been polled.

Note: The poll count wraps around on overflow.

Source§

impl<Request, Response, Assertion, Error> MockService<Request, Response, Assertion, Error>

Code that is independent of the assertions used in MockService.

Source

pub async fn try_next_request( &mut self, ) -> Option<ResponseSender<Request, Response, Error>>

Try to get the next request received.

Returns the next element in the queue. If the queue is empty, waits at most the max request delay configured by MockServiceBuilder::with_max_request_delay for a request, and returns it.

If no request is received, returns None.

If too many requests are received and the queue fills up, the oldest requests are dropped and ignored. This means that calling this may not receive the next request if the queue is not dimensioned properly with the MockServiceBuilder::with_proxy_channel_size method.

Trait Implementations§

Source§

impl<Request, Response, Assertion, Error> Clone for MockService<Request, Response, Assertion, Error>

Source§

fn clone(&self) -> Self

Clones the MockService.

This is a cheap operation, because it simply clones the broadcast channel endpoints.

1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<Request, Response, Assertion, Error> Service<Request> for MockService<Request, Response, Assertion, Error>
where Request: Send + 'static, Response: Send + 'static, Error: Send + 'static,

The tower::Service implementation of the MockService.

The MockService is always ready, and it intercepts the requests wrapping them in a ResponseSender which can be used to send a response.

Source§

type Response = Response

Responses given by the service.
Source§

type Error = Error

Errors produced by the service.
Source§

type Future = Pin<Box<dyn Future<Output = Result<<MockService<Request, Response, Assertion, Error> as Service<Request>>::Response, <MockService<Request, Response, Assertion, Error> as Service<Request>>::Error>> + Send>>

The future response value.
Source§

fn poll_ready( &mut self, _context: &mut Context<'_>, ) -> Poll<Result<(), Self::Error>>

Returns Poll::Ready(Ok(())) when the service is able to process requests. Read more
Source§

fn call(&mut self, request: Request) -> Self::Future

Process the request and return the response asynchronously. Read more

Auto Trait Implementations§

§

impl<Request, Response, Assertion, Error> Freeze for MockService<Request, Response, Assertion, Error>

§

impl<Request, Response, Assertion, Error = Box<dyn Error + Send + Sync>> !RefUnwindSafe for MockService<Request, Response, Assertion, Error>

§

impl<Request, Response, Assertion, Error> Send for MockService<Request, Response, Assertion, Error>
where Assertion: Send, Request: Send, Response: Send, Error: Send,

§

impl<Request, Response, Assertion, Error> Sync for MockService<Request, Response, Assertion, Error>
where Assertion: Sync, Request: Send, Response: Send, Error: Send,

§

impl<Request, Response, Assertion, Error> Unpin for MockService<Request, Response, Assertion, Error>
where Assertion: Unpin,

§

impl<Request, Response, Assertion, Error = Box<dyn Error + Send + Sync>> !UnwindSafe for MockService<Request, Response, Assertion, Error>

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
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> 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<S, Request> IsReady<Request> for S
where S: Service<Request> + Send, Request: 'static,

Source§

fn is_ready(&mut self) -> Pin<Box<dyn Future<Output = bool> + Send + '_>>

Poll the Service once, and return true if it is immediately ready to be called.
Source§

fn is_pending(&mut self) -> Pin<Box<dyn Future<Output = bool> + Send + '_>>

Poll the Service once, and return true if it is pending.
Source§

fn is_failed(&mut self) -> Pin<Box<dyn Future<Output = bool> + Send + '_>>

Poll the Service once, and return true if it has failed.
Source§

impl<D> OwoColorize for D

Source§

fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>
where C: Color,

Set the foreground color generically Read more
Source§

fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>
where C: Color,

Set the background color generically. Read more
Source§

fn black(&self) -> FgColorDisplay<'_, Black, Self>

Change the foreground color to black
Source§

fn on_black(&self) -> BgColorDisplay<'_, Black, Self>

Change the background color to black
Source§

fn red(&self) -> FgColorDisplay<'_, Red, Self>

Change the foreground color to red
Source§

fn on_red(&self) -> BgColorDisplay<'_, Red, Self>

Change the background color to red
Source§

fn green(&self) -> FgColorDisplay<'_, Green, Self>

Change the foreground color to green
Source§

fn on_green(&self) -> BgColorDisplay<'_, Green, Self>

Change the background color to green
Source§

fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>

Change the foreground color to yellow
Source§

fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>

Change the background color to yellow
Source§

fn blue(&self) -> FgColorDisplay<'_, Blue, Self>

Change the foreground color to blue
Source§

fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>

Change the background color to blue
Source§

fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to magenta
Source§

fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to magenta
Source§

fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to purple
Source§

fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to purple
Source§

fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>

Change the foreground color to cyan
Source§

fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>

Change the background color to cyan
Source§

fn white(&self) -> FgColorDisplay<'_, White, Self>

Change the foreground color to white
Source§

fn on_white(&self) -> BgColorDisplay<'_, White, Self>

Change the background color to white
Source§

fn default_color(&self) -> FgColorDisplay<'_, Default, Self>

Change the foreground color to the terminal default
Source§

fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>

Change the background color to the terminal default
Source§

fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>

Change the foreground color to bright black
Source§

fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>

Change the background color to bright black
Source§

fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>

Change the foreground color to bright red
Source§

fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>

Change the background color to bright red
Source§

fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>

Change the foreground color to bright green
Source§

fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>

Change the background color to bright green
Source§

fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>

Change the foreground color to bright yellow
Source§

fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>

Change the background color to bright yellow
Source§

fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>

Change the foreground color to bright blue
Source§

fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>

Change the background color to bright blue
Source§

fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright magenta
Source§

fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright magenta
Source§

fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright purple
Source§

fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright purple
Source§

fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>

Change the foreground color to bright cyan
Source§

fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>

Change the background color to bright cyan
Source§

fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>

Change the foreground color to bright white
Source§

fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>

Change the background color to bright white
Source§

fn bold(&self) -> BoldDisplay<'_, Self>

Make the text bold
Source§

fn dimmed(&self) -> DimDisplay<'_, Self>

Make the text dim
Source§

fn italic(&self) -> ItalicDisplay<'_, Self>

Make the text italicized
Source§

fn underline(&self) -> UnderlineDisplay<'_, Self>

Make the text underlined
Make the text blink
Make the text blink (but fast!)
Source§

fn reversed(&self) -> ReversedDisplay<'_, Self>

Swap the foreground and background colors
Source§

fn hidden(&self) -> HiddenDisplay<'_, Self>

Hide the text
Source§

fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>

Cross out the text
Source§

fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the foreground color at runtime. Only use if you do not know which color will be used at compile-time. If the color is constant, use either OwoColorize::fg or a color-specific method, such as OwoColorize::green, Read more
Source§

fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the background color at runtime. Only use if you do not know what color to use at compile-time. If the color is constant, use either OwoColorize::bg or a color-specific method, such as OwoColorize::on_yellow, Read more
Source§

fn fg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the foreground color to a specific RGB value.
Source§

fn bg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the background color to a specific RGB value.
Source§

fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>

Sets the foreground color to an RGB value.
Source§

fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>

Sets the background color to an RGB value.
Source§

fn style(&self, style: Style) -> Styled<&Self>

Apply a runtime-determined style
Source§

impl<Response, Error> ResponseResult<Response, Error> for Response

Source§

fn into_result(self) -> Result<Response, Error>

Converts the type into a Result that can be sent as a response.
Source§

impl<T, Request> ServiceExt<Request> for T
where T: Service<Request> + ?Sized,

Source§

fn ready(&mut self) -> Ready<'_, Self, Request>
where Self: Sized,

Yields a mutable reference to the service when it is ready to accept a request.
Source§

fn ready_and(&mut self) -> Ready<'_, Self, Request>
where Self: Sized,

👎Deprecated since 0.4.6: please use the ServiceExt::ready method instead
Yields a mutable reference to the service when it is ready to accept a request.
Source§

fn ready_oneshot(self) -> ReadyOneshot<Self, Request>
where Self: Sized,

Yields the service when it is ready to accept a request.
Source§

fn oneshot(self, req: Request) -> Oneshot<Self, Request>
where Self: Sized,

Consume this Service, calling with the providing request once it is ready.
Source§

fn call_all<S>(self, reqs: S) -> CallAll<Self, S>
where Self: Sized, Self::Error: Into<Box<dyn Error + Send + Sync>>, S: Stream<Item = Request>,

Process all requests from the given Stream, and produce a Stream of their responses. Read more
Source§

fn and_then<F>(self, f: F) -> AndThen<Self, F>
where Self: Sized, F: Clone,

Executes a new future after this service’s future resolves. This does not alter the behaviour of the poll_ready method. Read more
Source§

fn map_response<F, Response>(self, f: F) -> MapResponse<Self, F>
where Self: Sized, F: FnOnce(Self::Response) -> Response + Clone,

Maps this service’s response value to a different value. This does not alter the behaviour of the poll_ready method. Read more
Source§

fn map_err<F, Error>(self, f: F) -> MapErr<Self, F>
where Self: Sized, F: FnOnce(Self::Error) -> Error + Clone,

Maps this service’s error value to a different value. This does not alter the behaviour of the poll_ready method. Read more
Source§

fn map_result<F, Response, Error>(self, f: F) -> MapResult<Self, F>
where Self: Sized, Error: From<Self::Error>, F: FnOnce(Result<Self::Response, Self::Error>) -> Result<Response, Error> + Clone,

Maps this service’s result type (Result<Self::Response, Self::Error>) to a different value, regardless of whether the future succeeds or fails. Read more
Source§

fn map_request<F, NewRequest>(self, f: F) -> MapRequest<Self, F>
where Self: Sized, F: FnMut(NewRequest) -> Request,

Composes a function in front of the service. Read more
Source§

fn then<F, Response, Error, Fut>(self, f: F) -> Then<Self, F>
where Self: Sized, Error: From<Self::Error>, F: FnOnce(Result<Self::Response, Self::Error>) -> Fut + Clone, Fut: Future<Output = Result<Response, Error>>,

Composes an asynchronous function after this service. Read more
Source§

fn map_future<F, Fut, Response, Error>(self, f: F) -> MapFuture<Self, F>
where Self: Sized, F: FnMut(Self::Future) -> Fut, Error: From<Self::Error>, Fut: Future<Output = Result<Response, Error>>,

Composes a function that transforms futures produced by the service. Read more
Source§

fn boxed(self) -> BoxService<Request, Self::Response, Self::Error>
where Self: Sized + Send + 'static, Self::Future: Send + 'static,

Convert the service into a Service + Send trait object. Read more
Source§

fn boxed_clone(self) -> BoxCloneService<Request, Self::Response, Self::Error>
where Self: Sized + Clone + Send + 'static, Self::Future: Send + 'static,

Convert the service into a Service + Clone + Send trait object. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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> 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