use arch_toolkit::ArchClient;
use arch_toolkit::cache::CacheConfigBuilder;
use arch_toolkit::error::Result;
use std::time::Duration;
#[tokio::test]
#[ignore = "Requires network access"]
async fn test_search_caching() -> Result<()> {
let cache_config = CacheConfigBuilder::new()
.enable_search(true)
.search_ttl(Duration::from_secs(300))
.build();
let client = ArchClient::builder().cache_config(cache_config).build()?;
let start = std::time::Instant::now();
let packages1 = client.aur().search("yay").await?;
let _first_duration = start.elapsed();
let start = std::time::Instant::now();
let packages2 = client.aur().search("yay").await?;
let _second_duration = start.elapsed();
assert_eq!(packages1.len(), packages2.len());
assert_eq!(packages1[0].name, packages2[0].name);
Ok(())
}
#[tokio::test]
#[ignore = "Requires network access"]
async fn test_info_caching() -> Result<()> {
let cache_config = CacheConfigBuilder::new()
.enable_info(true)
.info_ttl(Duration::from_secs(900))
.build();
let client = ArchClient::builder().cache_config(cache_config).build()?;
let package_name = "yay";
let start = std::time::Instant::now();
let info1 = client.aur().info(&[package_name]).await?;
let _first_duration = start.elapsed();
let start = std::time::Instant::now();
let info2 = client.aur().info(&[package_name]).await?;
let _second_duration = start.elapsed();
assert_eq!(info1.len(), info2.len());
if let (Some(details1), Some(details2)) = (info1.first(), info2.first()) {
assert_eq!(details1.name, details2.name);
assert_eq!(details1.version, details2.version);
}
Ok(())
}
#[tokio::test]
#[ignore = "Requires network access"]
async fn test_comments_caching() -> Result<()> {
let cache_config = CacheConfigBuilder::new()
.enable_comments(true)
.comments_ttl(Duration::from_secs(600))
.build();
let client = ArchClient::builder().cache_config(cache_config).build()?;
let package_name = "yay";
let comments1 = client.aur().comments(package_name).await?;
let comments2 = client.aur().comments(package_name).await?;
assert_eq!(comments1.len(), comments2.len());
Ok(())
}
#[tokio::test]
#[ignore = "Requires network access"]
async fn test_pkgbuild_caching() -> Result<()> {
let cache_config = CacheConfigBuilder::new()
.enable_pkgbuild(true)
.pkgbuild_ttl(Duration::from_secs(3600))
.build();
let client = ArchClient::builder().cache_config(cache_config).build()?;
let package_name = "yay";
let start = std::time::Instant::now();
let pkgbuild1 = client.aur().pkgbuild(package_name).await?;
let _first_duration = start.elapsed();
let start = std::time::Instant::now();
let pkgbuild2 = client.aur().pkgbuild(package_name).await?;
let _second_duration = start.elapsed();
assert_eq!(pkgbuild1, pkgbuild2);
Ok(())
}
#[tokio::test]
#[ignore = "Requires network access"]
async fn test_selective_caching() -> Result<()> {
let cache_config = CacheConfigBuilder::new()
.enable_search(true)
.enable_info(false) .build();
let client = ArchClient::builder().cache_config(cache_config).build()?;
let packages1 = client.aur().search("yay").await?;
let packages2 = client.aur().search("yay").await?;
assert_eq!(packages1.len(), packages2.len());
if let Some(pkg) = packages1.first() {
let info1 = client.aur().info(&[&pkg.name]).await?;
let info2 = client.aur().info(&[&pkg.name]).await?;
assert_eq!(info1.len(), info2.len());
}
Ok(())
}
#[tokio::test]
#[ignore = "Requires network access"]
async fn test_different_ttls() -> Result<()> {
let cache_config = CacheConfigBuilder::new()
.enable_search(true)
.search_ttl(Duration::from_secs(1)) .enable_info(true)
.info_ttl(Duration::from_secs(300)) .build();
let client = ArchClient::builder().cache_config(cache_config).build()?;
let packages1 = client.aur().search("yay").await?;
let info1 = if let Some(pkg) = packages1.first() {
client.aur().info(&[&pkg.name]).await?
} else {
return Ok(());
};
let packages2 = client.aur().search("yay").await?;
let info2 = if let Some(pkg) = packages2.first() {
client.aur().info(&[&pkg.name]).await?
} else {
return Ok(());
};
assert_eq!(packages1.len(), packages2.len());
assert_eq!(info1.len(), info2.len());
tokio::time::sleep(Duration::from_secs(2)).await;
let packages3 = client.aur().search("yay").await?;
let info3 = if let Some(pkg) = packages3.first() {
client.aur().info(&[&pkg.name]).await?
} else {
return Ok(());
};
assert_eq!(info1.len(), info3.len());
if let (Some(details1), Some(details3)) = (info1.first(), info3.first()) {
assert_eq!(details1.name, details3.name);
}
Ok(())
}
#[tokio::test]
#[ignore = "Requires network access"]
async fn test_cache_size_limit() -> Result<()> {
let cache_config = CacheConfigBuilder::new()
.enable_search(true)
.search_ttl(Duration::from_secs(300))
.memory_cache_size(2) .build();
let client = ArchClient::builder().cache_config(cache_config).build()?;
let _packages1 = client.aur().search("yay").await?;
let _packages2 = client.aur().search("paru").await?;
let _packages3 = client.aur().search("pacman").await?;
let packages_paru = client.aur().search("paru").await?;
assert!(!packages_paru.is_empty());
Ok(())
}