use alloy::providers::{Provider, ProviderBuilder};
use alloy::rpc::types::Filter;
use alloy::transports::mock::Asserter;
use anyhow::Result;
use ethl::rpc::backfill::backfill;
use ethl::rpc::config::ProviderSettings;
use futures_util::pin_mut;
use futures_util::stream::StreamExt;
use std::collections::HashSet;
#[tokio::test]
async fn test_backfill() -> Result<()> {
let logs: serde_json::Value = serde_json::from_str(include_str!(
"fixtures/transfer_getlogs_34762687_34762688.json"
))?;
let asserter = Asserter::new();
asserter.push_success(&logs);
let provider = ProviderBuilder::new()
.disable_recommended_fillers()
.connect_mocked_client(asserter)
.erased();
let settings = ProviderSettings::from_mock(provider);
let filter = Filter::new().from_block(34762687).to_block(34762688);
let log_stream = backfill(&settings, &filter).await;
pin_mut!(log_stream);
let mut blocks: HashSet<u64> = HashSet::default();
let mut all = vec![];
while let Some(result) = log_stream.next().await {
let (from, to, logs) = result?;
for log in &logs {
all.push(((log.block_number.unwrap() as u128) << 16) + log.log_index.unwrap() as u128);
}
blocks.insert(from);
blocks.insert(to);
}
assert_eq!(blocks.len(), 2);
assert!(blocks.contains(&34762687));
assert!(blocks.contains(&34762688));
let mut sorted = all.clone();
sorted.sort();
assert_eq!(all, sorted);
Ok(())
}