Skip to main content

MockSite

Struct MockSite 

Source
pub struct MockSite { /* private fields */ }
Available on crate feature testing only.
Expand description

A Backend serving fixed MockPages by URI, for tests.

URIs without a page get a 404 Not Found. Statuses are treated as the real backends treat them, by a StatusPolicy: by default, an error status fails the fetch, so the crawler retries or fails the request.

Clones share the record of requests. Crawls with identities can be tested too, see sent.

§Examples

use spire_core::crawler::Crawler;
use spire_core::frontier::seed::Seed;
use spire_core::testing::{MockPage, MockSite};
use spire_core::worker::from_fn;

let site = MockSite::new()
    .page("https://example.com/", MockPage::html("<p>Home</p>"))
    .page("https://example.com/old", MockPage::redirect("https://example.com/"));

let worker = from_fn(|cx: spire_core::Context<_>| async move { cx.body().await.map(drop) });
let crawler = Crawler::new(site.clone(), worker).with_seeds([
    Seed::get("https://example.com/old")?,
    Seed::get("https://example.com/missing")?,
]);

let stats = crawler.run().await?;
assert_eq!((stats.succeeded, stats.failed), (1, 1));
assert_eq!(site.requests().len(), 2);

Implementations§

Source§

impl MockSite

Source

pub fn new() -> Self

Creates a site without pages.

Source

pub fn page(self, uri: &str, page: MockPage) -> Self

Serves page at uri, replacing any previous page there.

§Panics

Panics if uri is not a valid absolute URI.

Source

pub const fn with_status_policy(self, policy: StatusPolicy) -> Self

Replaces the StatusPolicy, Classify by default.

Source

pub fn unreachable_through(self, name: impl Into<String>) -> Self

Fails every fetch through the identity named name, as a proxy refusing connections would: a retryable error without a status.

Source

pub fn requests(&self) -> Vec<Uri>

Returns the URIs fetched so far, in order, including clones’ fetches. Redirects are followed within a fetch, so only the requested URI is listed.

Source

pub fn sent(&self) -> Vec<Sent>

Returns the requests received so far, in order, with their identity and headers. Fetches through an unreachable identity are included.

Source

pub fn visit(&self, seed: Seed) -> Visit

Prepares a Visit to seed, to run one request through a worker.

Trait Implementations§

Source§

impl Backend for MockSite

Source§

fn connect_as( &self, identity: &Identity, ) -> impl Future<Output = Result<Self::Session>> + Send

Records each request’s identity, see MockSite::sent, and refuses those unreachable. Proxies are accepted, as nothing is sent through them.

Source§

type Session = MockSession

The session used to fetch a single request.
Source§

fn connect(&self) -> impl Future<Output = Result<Self::Session>> + Send

Returns a session for the next request, sent directly, from the crawler itself, with the backend’s own cookies and sessions. Read more
Source§

impl Clone for MockSite

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

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

Performs copy-assignment from source. Read more
Source§

impl Debug for MockSite

Source§

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

Formats the value using the given formatter. Read more
Source§

impl Default for MockSite

Source§

fn default() -> Self

Returns the “default value” for a type. 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> 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, 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> 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 = !

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

fn try_from(value: U) -> Result<T, !>

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<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<W> WorkerExt for W

Source§

fn layer<C, M>(self, middleware: M) -> Layered<M, C>
where C: Send + 'static, Self: Worker<C>, M: Middleware<C>,

Wraps this worker in middleware, which runs before it, and before any middleware added earlier.