mithril_signer/services/signature_publisher/
dmq.rs

1use 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
15/// DMQ implementation of the [SignaturePublisher] trait.
16pub struct SignaturePublisherDmq {
17    dmq_publisher: Arc<dyn DmqPublisher<RegisterSignatureMessageDmq>>,
18}
19
20impl SignaturePublisherDmq {
21    /// Creates a new instance of [SignaturePublisherDmq].
22    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}