Skip to content

Commit 32c8363

Browse files
committed
Make retrieve_block_range_roots more testable by extracting part of its logic
The block range retrieval is extracted to a new repository function that has a dedicated test, this simplify the test since we don't have to handle the link between the transactions block number and the block range.
1 parent 69ca040 commit 32c8363

File tree

2 files changed

+174
-18
lines changed

2 files changed

+174
-18
lines changed

mithril-aggregator/src/database/repository/cardano_transaction_repository.rs

Lines changed: 87 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,23 @@ impl CardanoTransactionRepository {
177177
}
178178
}
179179

180+
/// Retrieve all the Block Range Roots in database up to the given end block number excluded.
181+
pub async fn retrieve_block_range_roots_up_to(
182+
&self,
183+
end_block_number: BlockNumber,
184+
) -> StdResult<Box<dyn Iterator<Item = (BlockRange, MKTreeNode)>>> {
185+
let provider = GetBlockRangeRootProvider::new(&self.connection);
186+
let filters = provider.get_up_to_block_number_condition(end_block_number);
187+
let block_range_roots = provider.find(filters)?;
188+
let iterator = block_range_roots
189+
.into_iter()
190+
.map(|record| -> (BlockRange, MKTreeNode) { record.into() })
191+
.collect::<Vec<_>>() // TODO: remove this collect when we should ba able return the iterator directly
192+
.into_iter();
193+
194+
Ok(Box::new(iterator))
195+
}
196+
180197
#[cfg(test)]
181198
pub(crate) async fn get_all(&self) -> StdResult<Vec<CardanoTransaction>> {
182199
let provider = GetCardanoTransactionProvider::new(&self.connection);
@@ -340,16 +357,8 @@ impl BlockRangeRootRetriever for CardanoTransactionRepository {
340357
.get_highest_block_number_for_immutable_number(up_to_beacon)
341358
.await?
342359
.unwrap_or(0);
343-
let provider = GetBlockRangeRootProvider::new(&self.connection);
344-
let filters = provider.get_up_to_block_number_condition(block_number);
345-
let block_range_roots = provider.find(filters)?;
346-
let iterator = block_range_roots
347-
.into_iter()
348-
.map(|record| -> (BlockRange, MKTreeNode) { record.into() })
349-
.collect::<Vec<_>>() // TODO: remove this collect when we should ba able return the iterator directly
350-
.into_iter();
351360

352-
Ok(Box::new(iterator))
361+
self.retrieve_block_range_roots_up_to(block_number).await
353362
}
354363
}
355364

@@ -807,4 +816,73 @@ mod tests {
807816
record
808817
);
809818
}
819+
820+
#[tokio::test]
821+
async fn repository_retrieve_block_range_roots_up_to() {
822+
let connection = Arc::new(cardano_tx_db_connection().unwrap());
823+
let repository = CardanoTransactionRepository::new(connection);
824+
let block_range_roots = vec![
825+
(
826+
BlockRange::from_block_number(15),
827+
MKTreeNode::from_hex("AAAA").unwrap(),
828+
),
829+
(
830+
BlockRange::from_block_number(30),
831+
MKTreeNode::from_hex("BBBB").unwrap(),
832+
),
833+
(
834+
BlockRange::from_block_number(45),
835+
MKTreeNode::from_hex("CCCC").unwrap(),
836+
),
837+
];
838+
repository
839+
.store_block_range_roots(block_range_roots.clone())
840+
.await
841+
.unwrap();
842+
843+
// Retrieve with a block far higher than the highest block range - should return all
844+
{
845+
let retrieved_block_ranges = repository
846+
.retrieve_block_range_roots_up_to(1000)
847+
.await
848+
.unwrap();
849+
assert_eq!(
850+
block_range_roots,
851+
retrieved_block_ranges.collect::<Vec<_>>()
852+
);
853+
}
854+
// Retrieve with a block bellow than the smallest block range - should return none
855+
{
856+
let retrieved_block_ranges = repository
857+
.retrieve_block_range_roots_up_to(2)
858+
.await
859+
.unwrap();
860+
assert_eq!(
861+
Vec::<(BlockRange, MKTreeNode)>::new(),
862+
retrieved_block_ranges.collect::<Vec<_>>()
863+
);
864+
}
865+
// The given block is matched to the end (excluded) - should return the first of the three
866+
{
867+
let retrieved_block_ranges = repository
868+
.retrieve_block_range_roots_up_to(45)
869+
.await
870+
.unwrap();
871+
assert_eq!(
872+
vec![block_range_roots[0].clone()],
873+
retrieved_block_ranges.collect::<Vec<_>>()
874+
);
875+
}
876+
// Right after the end of the second block range - should return first two of the three
877+
{
878+
let retrieved_block_ranges = repository
879+
.retrieve_block_range_roots_up_to(46)
880+
.await
881+
.unwrap();
882+
assert_eq!(
883+
block_range_roots[0..=1].to_vec(),
884+
retrieved_block_ranges.collect::<Vec<_>>()
885+
);
886+
}
887+
}
810888
}

mithril-signer/src/database/repository/cardano_transaction_repository.rs

Lines changed: 87 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,23 @@ impl CardanoTransactionRepository {
157157
}
158158
}
159159

160+
/// Retrieve all the Block Range Roots in database up to the given end block number excluded.
161+
pub async fn retrieve_block_range_roots_up_to(
162+
&self,
163+
end_block_number: BlockNumber,
164+
) -> StdResult<Box<dyn Iterator<Item = (BlockRange, MKTreeNode)>>> {
165+
let provider = GetBlockRangeRootProvider::new(&self.connection);
166+
let filters = provider.get_up_to_block_number_condition(end_block_number);
167+
let block_range_roots = provider.find(filters)?;
168+
let iterator = block_range_roots
169+
.into_iter()
170+
.map(|record| -> (BlockRange, MKTreeNode) { record.into() })
171+
.collect::<Vec<_>>() // TODO: remove this collect when we should ba able return the iterator directly
172+
.into_iter();
173+
174+
Ok(Box::new(iterator))
175+
}
176+
160177
#[cfg(test)]
161178
pub(crate) async fn get_all(&self) -> StdResult<Vec<CardanoTransaction>> {
162179
let provider = GetCardanoTransactionProvider::new(&self.connection);
@@ -279,16 +296,8 @@ impl BlockRangeRootRetriever for CardanoTransactionRepository {
279296
.get_highest_block_number_for_immutable_number(up_to_beacon)
280297
.await?
281298
.unwrap_or(0);
282-
let provider = GetBlockRangeRootProvider::new(&self.connection);
283-
let filters = provider.get_up_to_block_number_condition(block_number);
284-
let block_range_roots = provider.find(filters)?;
285-
let iterator = block_range_roots
286-
.into_iter()
287-
.map(|record| -> (BlockRange, MKTreeNode) { record.into() })
288-
.collect::<Vec<_>>() // TODO: remove this collect when we should ba able return the iterator directly
289-
.into_iter();
290299

291-
Ok(Box::new(iterator))
300+
self.retrieve_block_range_roots_up_to(block_number).await
292301
}
293302
}
294303

@@ -616,4 +625,73 @@ mod tests {
616625
record
617626
);
618627
}
628+
629+
#[tokio::test]
630+
async fn repository_retrieve_block_range_roots_up_to() {
631+
let connection = Arc::new(cardano_tx_db_connection().unwrap());
632+
let repository = CardanoTransactionRepository::new(connection);
633+
let block_range_roots = vec![
634+
(
635+
BlockRange::from_block_number(15),
636+
MKTreeNode::from_hex("AAAA").unwrap(),
637+
),
638+
(
639+
BlockRange::from_block_number(30),
640+
MKTreeNode::from_hex("BBBB").unwrap(),
641+
),
642+
(
643+
BlockRange::from_block_number(45),
644+
MKTreeNode::from_hex("CCCC").unwrap(),
645+
),
646+
];
647+
repository
648+
.store_block_range_roots(block_range_roots.clone())
649+
.await
650+
.unwrap();
651+
652+
// Retrieve with a block far higher than the highest block range - should return all
653+
{
654+
let retrieved_block_ranges = repository
655+
.retrieve_block_range_roots_up_to(1000)
656+
.await
657+
.unwrap();
658+
assert_eq!(
659+
block_range_roots,
660+
retrieved_block_ranges.collect::<Vec<_>>()
661+
);
662+
}
663+
// Retrieve with a block bellow than the smallest block range - should return none
664+
{
665+
let retrieved_block_ranges = repository
666+
.retrieve_block_range_roots_up_to(2)
667+
.await
668+
.unwrap();
669+
assert_eq!(
670+
Vec::<(BlockRange, MKTreeNode)>::new(),
671+
retrieved_block_ranges.collect::<Vec<_>>()
672+
);
673+
}
674+
// The given block is matched to the end (excluded) - should return the first of the three
675+
{
676+
let retrieved_block_ranges = repository
677+
.retrieve_block_range_roots_up_to(45)
678+
.await
679+
.unwrap();
680+
assert_eq!(
681+
vec![block_range_roots[0].clone()],
682+
retrieved_block_ranges.collect::<Vec<_>>()
683+
);
684+
}
685+
// Right after the end of the second block range - should return first two of the three
686+
{
687+
let retrieved_block_ranges = repository
688+
.retrieve_block_range_roots_up_to(46)
689+
.await
690+
.unwrap();
691+
assert_eq!(
692+
block_range_roots[0..=1].to_vec(),
693+
retrieved_block_ranges.collect::<Vec<_>>()
694+
);
695+
}
696+
}
619697
}

0 commit comments

Comments
 (0)