Skip to content

Commit 2ac1fc6

Browse files
committed
add StakePool tests
1 parent 5741602 commit 2ac1fc6

File tree

4 files changed

+130
-10
lines changed

4 files changed

+130
-10
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mithril-aggregator/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mithril-aggregator"
3-
version = "0.2.30"
3+
version = "0.2.31"
44
description = "A Mithril Aggregator server"
55
authors = { workspace = true }
66
edition = { workspace = true }

mithril-aggregator/src/database/provider/stake_pool.rs

Lines changed: 119 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,10 @@ use mithril_common::{
1919
use mithril_common::StdError;
2020

2121
/// Delete stake pools for Epoch older than this.
22-
const STAKE_POOL_PRUNE_EPOCH_THRESHOLD: u64 = 2;
22+
const STAKE_POOL_PRUNE_EPOCH_THRESHOLD: Epoch = Epoch(2);
2323

2424
/// Stake pool as read from Chain.
25-
/// TODO remove this compile directive ↓
26-
#[allow(dead_code)]
25+
#[derive(Debug, PartialEq)]
2726
pub struct StakePool {
2827
/// Pool Id
2928
stake_pool_id: PartyId,
@@ -122,7 +121,7 @@ impl<'client> Provider<'client> for StakePoolProvider<'client> {
122121
let aliases = SourceAlias::new(&[("{:stake_pool:}", "sp")]);
123122
let projection = Self::Entity::get_projection().expand(aliases);
124123

125-
format!("select {projection} from stake_pool as sp where {condition}")
124+
format!("select {projection} from stake_pool as sp where {condition} order by epoch asc, stake desc")
126125
}
127126
}
128127

@@ -267,9 +266,9 @@ impl StakeStorer for StakePoolStore {
267266
new_stakes.insert(pool_id.to_string(), stake_pool.stake);
268267
}
269268
// Clean useless old stake distributions if needed.
270-
if epoch.0 > STAKE_POOL_PRUNE_EPOCH_THRESHOLD {
269+
if epoch > STAKE_POOL_PRUNE_EPOCH_THRESHOLD {
271270
let _ = DeleteStakePoolProvider::new(connection)
272-
.prune(Epoch(epoch.0 - STAKE_POOL_PRUNE_EPOCH_THRESHOLD))
271+
.prune(epoch - STAKE_POOL_PRUNE_EPOCH_THRESHOLD)
273272
.map_err(AdapterError::InitializationError)?;
274273
}
275274
connection
@@ -300,6 +299,8 @@ impl StakeStorer for StakePoolStore {
300299

301300
#[cfg(test)]
302301
mod tests {
302+
use crate::database::migration::get_migrations;
303+
303304
use super::*;
304305

305306
#[test]
@@ -355,4 +356,116 @@ mod tests {
355356
assert_eq!("epoch < ?1".to_string(), condition);
356357
assert_eq!(vec![Value::Integer(5)], params);
357358
}
359+
360+
fn setup_db(connection: &Connection) -> Result<(), StdError> {
361+
let migrations = get_migrations();
362+
let migration =
363+
migrations
364+
.iter()
365+
.find(|&m| m.version == 1)
366+
.ok_or_else(|| -> StdError {
367+
"There should be a migration version 1".to_string().into()
368+
})?;
369+
let query = {
370+
// leverage the expanded parameter from this provider which is unit
371+
// tested on its own above.
372+
let update_provider = UpdateStakePoolProvider::new(connection);
373+
let (sql_values, _) = update_provider
374+
.get_update_condition("pool_id", Epoch(1), 1000)
375+
.expand();
376+
377+
connection.execute(&migration.alterations)?;
378+
379+
format!("insert into stake_pool {sql_values}")
380+
};
381+
let stake_distribution: &[(&str, i64, i64); 9] = &[
382+
("pool1", 1, 1000),
383+
("pool2", 1, 1100),
384+
("pool3", 1, 1300),
385+
("pool1", 2, 1230),
386+
("pool2", 2, 1090),
387+
("pool3", 2, 1300),
388+
("pool1", 3, 1250),
389+
("pool2", 3, 1370),
390+
("pool3", 3, 1300),
391+
];
392+
for (pool_id, epoch, stake) in stake_distribution {
393+
let mut statement = connection.prepare(&query)?;
394+
395+
statement.bind(1, *pool_id).unwrap();
396+
statement.bind(2, *epoch).unwrap();
397+
statement.bind(3, *stake).unwrap();
398+
statement.next().unwrap();
399+
}
400+
401+
Ok(())
402+
}
403+
404+
#[test]
405+
fn test_get_stake_pools() {
406+
let connection = Connection::open(":memory:").unwrap();
407+
setup_db(&connection).unwrap();
408+
409+
let provider = StakePoolProvider::new(&connection);
410+
let mut cursor = provider.get_by_epoch(&Epoch(1)).unwrap();
411+
412+
let stake_pool = cursor.next().expect("Should have a stake pool 'pool1'.");
413+
assert_eq!("pool3".to_string(), stake_pool.stake_pool_id);
414+
assert_eq!(Epoch(1), stake_pool.epoch);
415+
assert_eq!(1300, stake_pool.stake);
416+
assert_eq!(2, cursor.count());
417+
418+
let mut cursor = provider.get_by_epoch(&Epoch(3)).unwrap();
419+
420+
let stake_pool = cursor.next().expect("Should have a stake pool 'pool2'.");
421+
assert_eq!("pool2".to_string(), stake_pool.stake_pool_id);
422+
assert_eq!(Epoch(3), stake_pool.epoch);
423+
assert_eq!(1370, stake_pool.stake);
424+
assert_eq!(2, cursor.count());
425+
426+
let cursor = provider.get_by_epoch(&Epoch(5)).unwrap();
427+
assert_eq!(0, cursor.count());
428+
}
429+
430+
#[test]
431+
fn test_update_stakes() {
432+
let connection = Connection::open(":memory:").unwrap();
433+
setup_db(&connection).unwrap();
434+
435+
let provider = UpdateStakePoolProvider::new(&connection);
436+
let stake_pool = provider.persist("pool4", Epoch(3), 9999).unwrap();
437+
438+
assert_eq!("pool4".to_string(), stake_pool.stake_pool_id);
439+
assert_eq!(Epoch(3), stake_pool.epoch);
440+
assert_eq!(9999, stake_pool.stake);
441+
442+
let provider = StakePoolProvider::new(&connection);
443+
let mut cursor = provider.get_by_epoch(&Epoch(3)).unwrap();
444+
let stake_pool = cursor.next().expect("Should have a stake pool 'pool4'.");
445+
446+
assert_eq!("pool4".to_string(), stake_pool.stake_pool_id);
447+
assert_eq!(Epoch(3), stake_pool.epoch);
448+
assert_eq!(9999, stake_pool.stake);
449+
assert_eq!(3, cursor.count());
450+
}
451+
452+
#[test]
453+
fn test_prune() {
454+
let connection = Connection::open(":memory:").unwrap();
455+
setup_db(&connection).unwrap();
456+
457+
let provider = DeleteStakePoolProvider::new(&connection);
458+
let cursor = provider.prune(Epoch(2)).unwrap();
459+
460+
assert_eq!(3, cursor.count());
461+
462+
let provider = StakePoolProvider::new(&connection);
463+
let cursor = provider.get_by_epoch(&Epoch(1)).unwrap();
464+
465+
assert_eq!(0, cursor.count());
466+
467+
let cursor = provider.get_by_epoch(&Epoch(2)).unwrap();
468+
469+
assert_eq!(3, cursor.count());
470+
}
358471
}

mithril-common/src/entities/epoch.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,15 +99,15 @@ impl Sub for Epoch {
9999
type Output = Self;
100100

101101
fn sub(self, rhs: Self) -> Self::Output {
102-
Self(self.0 - rhs.0)
102+
Self(self.0.saturating_sub(rhs.0))
103103
}
104104
}
105105

106106
impl Sub<u64> for Epoch {
107107
type Output = Self;
108108

109109
fn sub(self, rhs: u64) -> Self::Output {
110-
Self(self.0 - rhs)
110+
Self(self.0.saturating_sub(rhs))
111111
}
112112
}
113113

@@ -181,9 +181,16 @@ mod tests {
181181
assert_eq!(Epoch(8), epoch);
182182
}
183183

184+
#[test]
185+
fn saturating_sub() {
186+
assert_eq!(Epoch(0), Epoch(1) - Epoch(5));
187+
assert_eq!(Epoch(0), Epoch(1) - 5_u64);
188+
}
189+
184190
#[test]
185191
fn test_previous() {
186192
assert_eq!(Epoch(2), Epoch(3).previous().unwrap());
193+
assert!(Epoch(0).previous().is_err());
187194
}
188195

189196
#[test]

0 commit comments

Comments
 (0)