mithril_common/certificate_chain/
fake_certificate_retriever.rs1use anyhow::anyhow;
5use async_trait::async_trait;
6use std::collections::HashMap;
7use tokio::sync::RwLock;
8
9use crate::entities::Certificate;
10
11use super::{CertificateRetriever, CertificateRetrieverError};
12
13pub struct FakeCertificaterRetriever {
15 certificates_map: RwLock<HashMap<String, Certificate>>,
16}
17
18impl FakeCertificaterRetriever {
19 pub fn from_certificates(certificates: &[Certificate]) -> Self {
21 let certificates_map = certificates
22 .iter()
23 .map(|certificate| (certificate.hash.clone(), certificate.clone()))
24 .collect::<HashMap<_, _>>();
25 let certificates_map = RwLock::new(certificates_map);
26
27 Self { certificates_map }
28 }
29}
30
31#[async_trait]
32impl CertificateRetriever for FakeCertificaterRetriever {
33 async fn get_certificate_details(
34 &self,
35 certificate_hash: &str,
36 ) -> Result<Certificate, CertificateRetrieverError> {
37 let certificates_map = self.certificates_map.read().await;
38 certificates_map
39 .get(certificate_hash)
40 .cloned()
41 .ok_or_else(|| CertificateRetrieverError(anyhow!("Certificate not found")))
42 }
43}
44
45#[cfg(test)]
46mod tests {
47 use crate::test_utils::fake_data;
48
49 use super::*;
50
51 #[tokio::test]
52 async fn fake_certificate_retriever_retrieves_existing_certificate() {
53 let certificate = fake_data::certificate("certificate-hash-123".to_string());
54 let certificate_hash = certificate.hash.clone();
55 let certificate_retriever =
56 FakeCertificaterRetriever::from_certificates(&[certificate.clone()]);
57
58 let retrieved_certificate = certificate_retriever
59 .get_certificate_details(&certificate_hash)
60 .await
61 .expect("Should retrieve certificate");
62
63 assert_eq!(retrieved_certificate, certificate);
64 }
65
66 #[tokio::test]
67 async fn test_fake_certificate_fails_retrieving_unknown_certificate() {
68 let certificate = fake_data::certificate("certificate-hash-123".to_string());
69 let certificate_retriever = FakeCertificaterRetriever::from_certificates(&[certificate]);
70
71 let retrieved_certificate = certificate_retriever
72 .get_certificate_details("certificate-hash-not-found")
73 .await;
74
75 retrieved_certificate.expect_err("get_certificate_details should fail");
76 }
77}