mithril_signer/services/signature_publisher/
dmq.rs1use std::sync::Arc;
2
3use anyhow::Context;
4use async_trait::async_trait;
5
6use mithril_common::{
7 StdResult,
8 entities::{ProtocolMessage, SignedEntityType, SingleSignature},
9 messages::RegisterSignatureMessageDmq,
10};
11use mithril_dmq::DmqPublisher;
12
13use super::SignaturePublisher;
14
15pub struct SignaturePublisherDmq {
17 dmq_publisher: Arc<dyn DmqPublisher<RegisterSignatureMessageDmq>>,
18}
19
20impl SignaturePublisherDmq {
21 pub fn new(dmq_publisher: Arc<dyn DmqPublisher<RegisterSignatureMessageDmq>>) -> Self {
23 Self { dmq_publisher }
24 }
25}
26
27#[async_trait]
28impl SignaturePublisher for SignaturePublisherDmq {
29 async fn publish(
30 &self,
31 signed_entity_type: &SignedEntityType,
32 signature: &SingleSignature,
33 _protocol_message: &ProtocolMessage,
34 ) -> StdResult<()> {
35 let message = RegisterSignatureMessageDmq {
36 signature: signature.signature.to_owned(),
37 signed_entity_type: signed_entity_type.to_owned(),
38 };
39
40 self.dmq_publisher
41 .publish_message(message)
42 .await
43 .with_context(|| "Failed to publish DMQ message")
44 }
45}
46
47#[cfg(test)]
48mod tests {
49 use mithril_common::test_utils::fake_data;
50 use mithril_dmq::test::double::DmqPublisherFake;
51
52 use super::*;
53
54 #[tokio::test]
55 async fn publish_signature_success() {
56 let signed_entity_type = SignedEntityType::dummy();
57 let signature = fake_data::single_signature(vec![1, 2, 3]);
58 let protocol_message = ProtocolMessage::default();
59 let dmq_publisher = Arc::new(DmqPublisherFake::new(vec![Ok(())]));
60 let publisher = SignaturePublisherDmq::new(dmq_publisher);
61
62 publisher
63 .publish(&signed_entity_type, &signature, &protocol_message)
64 .await
65 .unwrap();
66 }
67
68 #[tokio::test]
69 async fn publish_signature_failure() {
70 let signed_entity_type = SignedEntityType::dummy();
71 let signature = fake_data::single_signature(vec![1, 2, 3]);
72 let protocol_message = ProtocolMessage::default();
73 let dmq_publisher = Arc::new(DmqPublisherFake::new(vec![Err(anyhow::anyhow!(
74 "Test error"
75 ))]));
76 let publisher = SignaturePublisherDmq::new(dmq_publisher);
77
78 publisher
79 .publish(&signed_entity_type, &signature, &protocol_message)
80 .await
81 .expect_err("SignaturePublisherDmq should return an error");
82 }
83}