From 7fe5f991d6673b1a12144f69c2ed560ced5b760a Mon Sep 17 00:00:00 2001 From: Duddino Date: Fri, 20 Sep 2024 13:33:15 +0200 Subject: [PATCH] Add address index tests --- src-tauri/src/address_index/block_source.rs | 33 +++++++++++++++++ src-tauri/src/address_index/database.rs | 27 ++++++++++++++ src-tauri/src/address_index/mod.rs | 39 +++++++++++++++++++++ 3 files changed, 99 insertions(+) diff --git a/src-tauri/src/address_index/block_source.rs b/src-tauri/src/address_index/block_source.rs index 4147545..765a069 100644 --- a/src-tauri/src/address_index/block_source.rs +++ b/src-tauri/src/address_index/block_source.rs @@ -7,3 +7,36 @@ pub trait BlockSource { &mut self, ) -> crate::error::Result + '_ + Send>>>; } + +#[cfg(test)] +pub mod test { + use super::super::types::{Block, Tx}; + use super::*; + pub struct MockBlockSource; + impl BlockSource for MockBlockSource { + fn get_blocks( + &mut self, + ) -> crate::error::Result + '_ + Send>>> { + Ok(Box::pin(futures::stream::iter(vec![ + Block { + txs: vec![Tx { + txid: "txid1".to_owned(), + addresses: vec!["address1".to_owned(), "address2".to_owned()], + }], + }, + Block { + txs: vec![Tx { + txid: "txid2".to_owned(), + addresses: vec!["address1".to_owned(), "address4".to_owned()], + }], + }, + Block { + txs: vec![Tx { + txid: "txid3".to_owned(), + addresses: vec!["address1".to_owned(), "address5".to_owned()], + }], + }, + ]))) + } + } +} diff --git a/src-tauri/src/address_index/database.rs b/src-tauri/src/address_index/database.rs index a455604..ca517e6 100644 --- a/src-tauri/src/address_index/database.rs +++ b/src-tauri/src/address_index/database.rs @@ -16,3 +16,30 @@ pub trait Database { Ok(()) } } + +#[cfg(test)] +pub mod test { + use super::*; + use std::collections::HashMap; + + #[derive(Default)] + pub struct MockDB { + address_map: HashMap>, + } + + impl Database for MockDB { + async fn get_address_txids(&self, address: &str) -> crate::error::Result> { + Ok(self.address_map.get(address).unwrap_or(&vec![]).clone()) + } + + async fn store_tx(&mut self, tx: &Tx) -> crate::error::Result<()> { + for address in &tx.addresses { + self.address_map + .entry(address.clone()) + .and_modify(|vec| vec.push(tx.txid.clone())) + .or_insert(vec![tx.txid.clone()]); + } + Ok(()) + } + } +} diff --git a/src-tauri/src/address_index/mod.rs b/src-tauri/src/address_index/mod.rs index e6b7732..dd55da0 100644 --- a/src-tauri/src/address_index/mod.rs +++ b/src-tauri/src/address_index/mod.rs @@ -30,4 +30,43 @@ impl AddressIndex { block_source, } } + async fn get_address_txids(&self, address: &str) -> crate::error::Result> { + self.database.get_address_txids(address).await + } +} + +#[cfg(test)] +mod test { + use super::block_source::test::MockBlockSource; + use super::database::test::MockDB; + use super::*; + + #[tokio::test] + async fn syncs_correctly() -> crate::error::Result<()> { + let mock_db = MockDB::default(); + let block_source = MockBlockSource; + let mut address_index = AddressIndex::new(mock_db, block_source); + address_index.sync().await?; + assert_eq!( + address_index.get_address_txids("address1").await?, + vec!["txid1", "txid2", "txid3"] + ); + assert_eq!( + address_index.get_address_txids("address2").await?, + vec!["txid1"] + ); + assert_eq!( + address_index.get_address_txids("address4").await?, + vec!["txid2"] + ); + assert_eq!( + address_index.get_address_txids("address5").await?, + vec!["txid3"] + ); + assert_eq!( + address_index.get_address_txids("address6").await?, + Vec::::new() + ); + Ok(()) + } }