mithril_aggregator_discovery/test/double/
discoverer.rs

1use 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
11/// A fake implementation of the [AggregatorDiscoverer] trait for testing purposes.
12pub struct AggregatorDiscovererFake {
13    results: Mutex<VecDeque<AggregatorListReturn>>,
14}
15
16impl AggregatorDiscovererFake {
17    /// Creates a new `AggregatorDiscovererFake` instance with the provided results.
18    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}