#![cfg(feature = "deps")]
use arch_toolkit::deps::{
DependencyResolver, ReverseDependencyAnalyzer, get_installed_packages, get_upgradable_packages,
};
use arch_toolkit::error::Result;
use arch_toolkit::{PackageRef, PackageSource};
#[test]
fn test_dependency_resolver_empty() -> Result<()> {
let resolver = DependencyResolver::new();
let result = resolver.resolve(&[])?;
assert_eq!(result.dependencies.len(), 0);
assert_eq!(result.conflicts.len(), 0);
assert_eq!(result.missing.len(), 0);
Ok(())
}
#[test]
#[ignore = "Requires pacman to be available"]
fn test_dependency_resolver_real_package() -> Result<()> {
let resolver = DependencyResolver::new();
let packages = vec![PackageRef {
name: "pacman".to_string(),
version: "6.1.0".to_string(),
source: PackageSource::Official {
repo: "core".to_string(),
arch: "x86_64".to_string(),
},
}];
let result = resolver.resolve(&packages)?;
println!(
"Found {} dependencies for pacman",
result.dependencies.len()
);
assert!(!result.dependencies.is_empty());
Ok(())
}
#[test]
#[ignore = "Requires pacman to be available"]
fn test_dependency_resolver_multiple_packages() -> Result<()> {
let resolver = DependencyResolver::new();
let packages = vec![
PackageRef {
name: "pacman".to_string(),
version: "6.1.0".to_string(),
source: PackageSource::Official {
repo: "core".to_string(),
arch: "x86_64".to_string(),
},
},
PackageRef {
name: "glibc".to_string(),
version: "2.38".to_string(),
source: PackageSource::Official {
repo: "core".to_string(),
arch: "x86_64".to_string(),
},
},
];
let result = resolver.resolve(&packages)?;
println!(
"Found {} dependencies for {} packages",
result.dependencies.len(),
packages.len()
);
assert!(!result.dependencies.is_empty());
Ok(())
}
#[test]
fn test_dependency_resolver_with_config() -> Result<()> {
use arch_toolkit::ResolverConfig;
let config = ResolverConfig {
include_optdepends: true,
include_makedepends: false,
include_checkdepends: false,
max_depth: 0,
pkgbuild_cache: None,
check_aur: false,
};
let resolver = DependencyResolver::with_config(config);
let result = resolver.resolve(&[])?;
assert_eq!(result.dependencies.len(), 0);
Ok(())
}
#[test]
fn test_reverse_dependency_analyzer_empty() -> Result<()> {
let analyzer = ReverseDependencyAnalyzer::new();
let result = analyzer.analyze(&[])?;
assert_eq!(result.dependents.len(), 0);
assert_eq!(result.summaries.len(), 0);
Ok(())
}
#[test]
#[ignore = "Requires pacman to be available and package to be installed"]
fn test_reverse_dependency_analyzer_real_package() -> Result<()> {
let analyzer = ReverseDependencyAnalyzer::new();
let packages = vec![PackageRef {
name: "glibc".to_string(),
version: "2.38".to_string(),
source: PackageSource::Official {
repo: "core".to_string(),
arch: "x86_64".to_string(),
},
}];
let result = analyzer.analyze(&packages)?;
println!("Found {} dependents for glibc", result.dependents.len());
assert!(!result.dependents.is_empty());
Ok(())
}
#[test]
#[ignore = "Requires pacman to be available"]
fn test_reverse_dependency_analyzer_uninstalled_package() -> Result<()> {
let analyzer = ReverseDependencyAnalyzer::new();
let packages = vec![PackageRef {
name: "nonexistent-package-xyz123".to_string(),
version: "1.0.0".to_string(),
source: PackageSource::Official {
repo: "extra".to_string(),
arch: "x86_64".to_string(),
},
}];
let result = analyzer.analyze(&packages)?;
assert_eq!(result.dependents.len(), 0);
assert_eq!(result.summaries.len(), 0);
Ok(())
}
#[test]
#[ignore = "Requires pacman to be available and packages to be installed"]
fn test_reverse_dependency_analyzer_multiple_packages() -> Result<()> {
let analyzer = ReverseDependencyAnalyzer::new();
let packages = vec![
PackageRef {
name: "glibc".to_string(),
version: "2.38".to_string(),
source: PackageSource::Official {
repo: "core".to_string(),
arch: "x86_64".to_string(),
},
},
PackageRef {
name: "bash".to_string(),
version: "5.2".to_string(),
source: PackageSource::Official {
repo: "core".to_string(),
arch: "x86_64".to_string(),
},
},
];
let result = analyzer.analyze(&packages)?;
println!(
"Found {} dependents for {} packages",
result.dependents.len(),
packages.len()
);
assert!(!result.dependents.is_empty());
Ok(())
}
#[test]
#[ignore = "Requires pacman to be available"]
fn test_get_installed_packages_integration() -> Result<()> {
let packages = get_installed_packages()?;
println!("Found {} installed packages", packages.len());
assert!(!packages.is_empty());
Ok(())
}
#[test]
#[ignore = "Requires pacman to be available"]
fn test_get_upgradable_packages_integration() -> Result<()> {
let packages = get_upgradable_packages()?;
println!("Found {} upgradable packages", packages.len());
Ok(())
}
#[test]
fn test_graceful_degradation_no_pacman() {
let _resolver = DependencyResolver::new();
let _analyzer = ReverseDependencyAnalyzer::new();
}
#[cfg(feature = "aur")]
mod aur_tests {
use super::*;
use arch_toolkit::deps::{fetch_srcinfo, parse_srcinfo};
use reqwest::Client;
#[tokio::test]
#[ignore = "Requires network access"]
async fn test_fetch_srcinfo_from_aur() -> Result<()> {
let client = Client::new();
let srcinfo: String = fetch_srcinfo(&client, "yay").await?;
assert!(!srcinfo.is_empty());
let data = parse_srcinfo(&srcinfo);
assert_eq!(data.pkgname, "yay");
assert!(!data.pkgver.is_empty());
Ok(())
}
#[tokio::test]
#[ignore = "Requires network access"]
async fn test_parse_fetched_srcinfo() -> Result<()> {
let client = Client::new();
let srcinfo = fetch_srcinfo(&client, "paru").await?;
let data = parse_srcinfo(&srcinfo);
assert_eq!(data.pkgname, "paru");
assert!(!data.pkgver.is_empty());
println!("Found {} dependencies for paru", data.depends.len());
Ok(())
}
#[tokio::test]
#[ignore = "Requires network access"]
async fn test_fetch_srcinfo_nonexistent() {
let client = Client::new();
let result: arch_toolkit::error::Result<String> =
fetch_srcinfo(&client, "nonexistent-package-xyz123").await;
assert!(result.is_err());
}
}