mithril_aggregator_discovery/test/double/
discoverer.rs1use std::collections::VecDeque;
2
3use tokio::sync::Mutex;
4
5use mithril_common::{StdResult, entities::MithrilNetwork};
6
7use crate::{AggregatorDiscoverer, AggregatorEndpoint};
8
9type AggregatorListReturn = StdResult<Vec<AggregatorEndpoint>>;
10
11pub struct AggregatorDiscovererFake {
13 results: Mutex<VecDeque<AggregatorListReturn>>,
14}
15
16impl AggregatorDiscovererFake {
17 pub fn new(results: Vec<AggregatorListReturn>) -> Self {
19 Self {
20 results: Mutex::new(VecDeque::from(results)),
21 }
22 }
23}
24
25#[async_trait::async_trait]
26impl AggregatorDiscoverer for AggregatorDiscovererFake {
27 async fn get_available_aggregators(
28 &self,
29 _network: MithrilNetwork,
30 ) -> StdResult<Box<dyn Iterator<Item = AggregatorEndpoint>>> {
31 let mut results = self.results.lock().await;
32
33 let endpoints = results.pop_front().ok_or_else(|| {
34 anyhow::anyhow!("No more results available in AggregatorDiscovererFake")
35 })??;
36
37 Ok(Box::new(endpoints.into_iter()))
38 }
39}
40
41#[cfg(test)]
42mod tests {
43
44 use super::*;
45
46 #[tokio::test]
47 async fn get_available_aggregators_success() {
48 let consumer = AggregatorDiscovererFake::new(vec![
49 Ok(vec![AggregatorEndpoint::new("test-1".to_string())]),
50 Ok(vec![AggregatorEndpoint::new("test-2".to_string())]),
51 ]);
52
53 let messages = consumer
54 .get_available_aggregators(MithrilNetwork::dummy())
55 .await
56 .unwrap();
57
58 assert_eq!(
59 vec![AggregatorEndpoint::new("test-1".to_string())],
60 messages.collect::<Vec<_>>()
61 );
62 }
63
64 #[tokio::test]
65 async fn consume_messages_failure() {
66 let consumer = AggregatorDiscovererFake::new(vec![
67 Err(anyhow::anyhow!("Test error")),
68 Ok(vec![AggregatorEndpoint::new("test-2".to_string())]),
69 ]);
70
71 let result = consumer.get_available_aggregators(MithrilNetwork::dummy()).await;
72
73 assert!(
74 result.is_err(),
75 "AggregatorDiscovererFake should return an error"
76 );
77 }
78}