mithril_dmq/test/double/
publisher.rs1use 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
9pub 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 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}