spire_core/testing/
visit.rs1use std::fmt;
2use std::sync::Arc;
3
4use super::MockSite;
5use crate::backend::Backend;
6use crate::dataset::{Data, Dataset, Datasets};
7use crate::frontier::queue::Queue;
8use crate::frontier::seed::Seed;
9use crate::frontier::{Frontier, InMemFrontier};
10use crate::worker::{Outcome, Worker};
11use crate::{Context, Result};
12
13pub struct Visit {
23 site: MockSite,
24 seed: Seed,
25 frontier: Arc<InMemFrontier>,
26 datasets: Arc<Datasets>,
27 extensions: http::Extensions,
28}
29
30impl Visit {
31 pub(super) fn new(site: MockSite, seed: Seed) -> Self {
32 Self {
33 site,
34 seed,
35 frontier: Arc::new(InMemFrontier::fifo()),
36 datasets: Arc::default(),
37 extensions: http::Extensions::new(),
38 }
39 }
40
41 #[must_use]
43 pub fn with_extension<T: Clone + Send + Sync + 'static>(mut self, value: T) -> Self {
44 self.extensions.insert(value);
45 self
46 }
47
48 #[must_use]
50 pub fn with_dataset<T, D>(mut self, dataset: D) -> Self
51 where
52 T: Send + 'static,
53 D: Dataset<T>,
54 {
55 Arc::make_mut(&mut self.datasets).insert(dataset);
56 self
57 }
58
59 pub async fn run<W: Worker<<MockSite as Backend>::Session>>(&self, worker: &W) -> Outcome {
64 let client = match self.site.connect().await {
65 Ok(client) => client,
66 Err(error) => return Outcome::Fail(error),
67 };
68 let mut request = self.seed.clone().into_request();
69 request.extensions_mut().extend(self.extensions.clone());
70 let queue = Queue::new(Arc::clone(&self.frontier)).child_of(&request);
71 let cx = Context::from_parts(request, client, queue, Arc::clone(&self.datasets));
72 worker.handle(cx).await
73 }
74
75 #[must_use]
77 pub fn queued(&self) -> Vec<Seed> {
78 self.frontier.snapshot().unwrap_or_default()
79 }
80
81 pub fn dataset<T: Send + 'static>(&self) -> Result<Data<T>> {
88 self.datasets.get()
89 }
90}
91
92impl fmt::Debug for Visit {
93 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
94 f.debug_struct("Visit")
95 .field("seed", &self.seed)
96 .field("queued", &self.frontier.size_hint())
97 .finish_non_exhaustive()
98 }
99}