diff --git a/src/primitives/mod.rs b/src/primitives/mod.rs index 5e4bb9c..29a9e42 100644 --- a/src/primitives/mod.rs +++ b/src/primitives/mod.rs @@ -3,7 +3,7 @@ use serde::{Deserialize, Serialize}; pub(crate) mod registry; -#[derive(Debug, Clone, Serialize, Deserialize, Deref, DerefMut, From)] +#[derive(Debug, Clone, Serialize, Deserialize, Deref, DerefMut, From, PartialEq, Eq, Hash)] pub(crate) struct BlsPublicKey(bls::PublicKey); impl BlsPublicKey { diff --git a/src/sources/mock.rs b/src/sources/mock.rs new file mode 100644 index 0000000..9d84adc --- /dev/null +++ b/src/sources/mock.rs @@ -0,0 +1,33 @@ +use std::collections::HashMap; + +use crate::primitives::{registry::RegistryEntry, BlsPublicKey}; + +use super::{ExternalSource, SourceError}; + +pub(crate) struct MockSource { + pub(crate) entries: HashMap, +} + +impl MockSource { + pub(crate) fn new() -> Self { + Self { entries: HashMap::new() } + } + + pub(crate) fn add_entry(&mut self, entry: RegistryEntry) { + self.entries.insert(entry.validator_pubkey.clone(), entry); + } +} + +#[async_trait::async_trait] +impl ExternalSource for MockSource { + fn name(&self) -> &'static str { + "mock" + } + + async fn get_validators( + &self, + pubkeys: &[BlsPublicKey], + ) -> Result, SourceError> { + Ok(pubkeys.iter().filter_map(|pubkey| self.entries.get(pubkey).cloned()).collect()) + } +} diff --git a/src/sources/mod.rs b/src/sources/mod.rs index 80a15ee..2f70ec0 100644 --- a/src/sources/mod.rs +++ b/src/sources/mod.rs @@ -7,6 +7,10 @@ use crate::primitives::{registry::RegistryEntry, BlsPublicKey}; /// pub(crate) mod kapi; +/// Mock external source for testing. +#[cfg(test)] +pub(crate) mod mock; + #[derive(Debug, Error)] pub(crate) enum SourceError { #[error(transparent)]