mithril_dmq/test/double/
publisher.rs

1use std::{collections::VecDeque, fmt::Debug, marker::PhantomData};
2
3use tokio::sync::Mutex;
4
5use mithril_common::{StdResult, crypto_helper::TryToBytes};
6
7use crate::DmqPublisher;
8
9/// A fake implementation of the [DmqPublisher] trait for testing purposes.
10pub struct DmqPublisherFake<M: TryToBytes + Debug + Send + Sync> {
11    results: Mutex<VecDeque<StdResult<()>>>,
12    phantom: PhantomData<M>,
13}
14
15impl<M: TryToBytes + Debug + Send + Sync> DmqPublisherFake<M> {
16    /// Creates a new `DmqPublisherFake` instance with the provided results.
17    pub fn new(results: Vec<StdResult<()>>) -> Self {
18        Self {
19            results: Mutex::new(VecDeque::from(results)),
20            phantom: PhantomData,
21        }
22    }
23}
24
25#[async_trait::async_trait]
26impl<M: TryToBytes + Debug + Send + Sync> DmqPublisher<M> for DmqPublisherFake<M> {
27    async fn publish_message(&self, _message: M) -> StdResult<()> {
28        let mut results = self.results.lock().await;
29
30        results
31            .pop_front()
32            .ok_or_else(|| anyhow::anyhow!("No more results available in DmqPublisherFake"))?
33    }
34}
35
36#[cfg(test)]
37mod tests {
38    use crate::test::payload::DmqMessageTestPayload;
39
40    use super::*;
41
42    #[tokio::test]
43    async fn publish_messages_success() {
44        let publisher = DmqPublisherFake::new(vec![Ok(()), Err(anyhow::anyhow!("Test error"))]);
45
46        publisher
47            .publish_message(DmqMessageTestPayload::new(b"test-1"))
48            .await
49            .unwrap();
50    }
51
52    #[tokio::test]
53    async fn publish_messages_failure() {
54        let publisher = DmqPublisherFake::new(vec![Err(anyhow::anyhow!("Test error")), Ok(())]);
55
56        publisher
57            .publish_message(DmqMessageTestPayload::new(b"test-1"))
58            .await
59            .expect_err("DmqPublisherFake should return an error");
60    }
61}