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::Frontier;
8use crate::frontier::memory::InMemFrontier;
9use crate::frontier::queue::Queue;
10use crate::frontier::seed::Seed;
11use crate::worker::{Outcome, Worker};
12use crate::{Context, Result};
13
14pub struct Visit {
24 site: MockSite,
25 seed: Seed,
26 frontier: Arc<InMemFrontier>,
27 datasets: Arc<Datasets>,
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 }
38 }
39
40 #[must_use]
42 pub fn with_dataset<T, D>(mut self, dataset: D) -> Self
43 where
44 T: Send + 'static,
45 D: Dataset<T>,
46 {
47 Arc::make_mut(&mut self.datasets).insert(dataset);
48 self
49 }
50
51 pub async fn run<W: Worker<<MockSite as Backend>::Client>>(&self, worker: &W) -> Outcome {
56 let client = match self.site.connect().await {
57 Ok(client) => client,
58 Err(error) => return Outcome::Fail(error),
59 };
60 let request = self.seed.clone().into_request();
61 let queue = Queue::new(Arc::clone(&self.frontier)).child_of(&request);
62 let cx = Context::from_parts(request, client, queue, Arc::clone(&self.datasets));
63 worker.handle(cx).await
64 }
65
66 #[must_use]
68 pub fn queued(&self) -> Vec<Seed> {
69 self.frontier.snapshot().unwrap_or_default()
70 }
71
72 pub fn dataset<T: Send + 'static>(&self) -> Result<Data<T>> {
79 self.datasets.get()
80 }
81}
82
83impl fmt::Debug for Visit {
84 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
85 f.debug_struct("Visit")
86 .field("seed", &self.seed)
87 .field("queued", &self.frontier.size_hint())
88 .finish_non_exhaustive()
89 }
90}