Skip to content

Commit 2e82173

Browse files
committed
feat(aggregator-discovery): create test double for 'AggregatorDiscoverer' trait
1 parent 2e4c8e0 commit 2e82173

File tree

4 files changed

+91
-0
lines changed

4 files changed

+91
-0
lines changed

internal/mithril-aggregator-discovery/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
44
mod interface;
55
mod model;
6+
pub mod test;
67

78
pub use interface::AggregatorDiscoverer;
89
pub use model::{AggregatorEndpoint, MithrilNetwork};
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
use std::collections::VecDeque;
2+
3+
use tokio::sync::Mutex;
4+
5+
use mithril_common::StdResult;
6+
7+
use crate::{AggregatorDiscoverer, AggregatorEndpoint, MithrilNetwork};
8+
9+
type AggregatorListReturn = StdResult<Vec<AggregatorEndpoint>>;
10+
11+
/// A fake implementation of the [AggregatorDiscoverer] trait for testing purposes.
12+
pub struct AggregatorDiscovererFake {
13+
results: Mutex<VecDeque<AggregatorListReturn>>,
14+
}
15+
16+
impl 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]
26+
impl AggregatorDiscoverer for AggregatorDiscovererFake {
27+
async fn get_available_aggregators(
28+
&self,
29+
_network: MithrilNetwork,
30+
) -> StdResult<Vec<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(endpoints)
38+
}
39+
}
40+
41+
#[cfg(test)]
42+
mod 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
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+
consumer
72+
.get_available_aggregators(MithrilNetwork::dummy())
73+
.await
74+
.expect_err("AggregatorDiscovererFake should return an error");
75+
}
76+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
//! Test doubles
2+
//!
3+
//! Enable unit testing with controlled inputs and predictable behavior.
4+
5+
mod discoverer;
6+
7+
pub use discoverer::*;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
//! Test utilities.
2+
//!
3+
//! ⚠ Do not use in production code ⚠
4+
//!
5+
//! This module provides in particular test doubles for the traits defined in this crate.
6+
7+
pub mod double;

0 commit comments

Comments
 (0)