use p2panda_core::Hash;
use crate::orderer::OrdererStore;
use crate::{SqliteStore, Transaction};
#[tokio::test]
async fn ready() {
let store = SqliteStore::temporary().await;
let hash_1 = Hash::digest(b"tick");
let hash_2 = Hash::digest(b"trick");
let hash_3 = Hash::digest(b"track");
let permit = store.begin().await.unwrap();
assert!(store.mark_ready(hash_3).await.unwrap());
assert!(store.mark_ready(hash_2).await.unwrap());
assert!(!store.mark_ready(hash_2).await.unwrap());
assert!(store.ready(&[hash_2, hash_3]).await.unwrap());
assert!(!store.ready(&[hash_1, hash_3]).await.unwrap());
assert!(!store.ready(&[hash_1]).await.unwrap());
assert_eq!(store.take_next_ready().await.unwrap(), Some(hash_3));
assert!(store.mark_ready(hash_1).await.unwrap());
assert_eq!(store.take_next_ready().await.unwrap(), Some(hash_2));
assert_eq!(store.take_next_ready().await.unwrap(), Some(hash_1));
assert_eq!(
OrdererStore::<Hash>::take_next_ready(&store).await.unwrap(),
None
);
store.commit(permit).await.unwrap();
}
#[tokio::test]
async fn pending() {
let store = SqliteStore::temporary().await;
let hash_1 = Hash::digest(b"piff");
let hash_2 = Hash::digest(b"puff");
let hash_3 = Hash::digest(b"paff");
let hash_4 = Hash::digest(b"peff");
let permit = store.begin().await.unwrap();
assert!(
store
.mark_pending(hash_1, vec![hash_2, hash_3])
.await
.unwrap()
);
assert!(store.mark_pending(hash_1, vec![hash_3]).await.unwrap());
assert!(!store.mark_pending(hash_1, vec![hash_3]).await.unwrap());
assert!(
store
.mark_pending(hash_1, vec![hash_4, hash_3])
.await
.unwrap()
);
let pending = store.get_next_pending(hash_2).await.unwrap().unwrap();
assert_eq!(pending.len(), 1);
let (parent, deps) = pending.iter().next().unwrap();
assert_eq!(*parent, hash_1);
assert!(deps.contains(&hash_2));
assert!(deps.contains(&hash_3));
store.commit(permit).await.unwrap();
}