diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2020-10-26 09:47:50 +0100 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2020-10-26 09:48:47 +0100 |
commit | d4013f1ebeeeb9dd5a5d9c51fc7d2794b0d92128 (patch) | |
tree | a62c2cdd16b519c3113b3142c683ba537eb87ac4 /src/repository/repository.rs | |
parent | d9c54fbffdc75149ad6e9e0bb81897a46b22af3f (diff) |
Implement tests for Repository type
This patch also implements helper functions (cfg(test)-gated) on various
types so we can instantiate them properly in the tests.
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
Diffstat (limited to 'src/repository/repository.rs')
-rw-r--r-- | src/repository/repository.rs | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/src/repository/repository.rs b/src/repository/repository.rs index 62bba7b..5b51437 100644 --- a/src/repository/repository.rs +++ b/src/repository/repository.rs @@ -15,6 +15,13 @@ pub struct Repository { inner: BTreeMap<(PackageName, PackageVersion), Package>, } +#[cfg(test)] +impl From<BTreeMap<(PackageName, PackageVersion), Package>> for Repository { + fn from(inner: BTreeMap<(PackageName, PackageVersion), Package>) -> Self { + Repository { inner } + } +} + impl Repository { pub fn load(path: &Path, progress: &indicatif::ProgressBar) -> Result<Self> { @@ -100,3 +107,168 @@ impl Repository { .collect() } } + +#[cfg(test)] +mod tests { + use super::*; + use url::Url; + use crate::package::Source; + use crate::package::SourceHash; + use crate::package::HashType; + use crate::package::HashValue; + use crate::package::Dependencies; + + fn pname(name: &str) -> PackageName { + PackageName::from(String::from(name)) + } + + fn pversion(version: &str) -> PackageVersion { + PackageVersion::from(String::from(version)) + } + + fn package(name: &str, vers: &str, srcurl: &str, hash: &str) -> Package { + let name = pname(name); + let version = pversion(vers); + let version_is_semver = false; + let source = { + let url = Url::parse(srcurl).unwrap(); + let hashvalue = HashValue::from(String::from(hash)); + Source::new(url, SourceHash::new(HashType::Sha1, hashvalue)) + }; + let dependencies = Dependencies::empty(); + Package::new(name, version, version_is_semver, source, dependencies) + } + + #[test] + fn test_finding_by_name() { + let mut btree = BTreeMap::new(); + + { + let name = "a"; + let vers = "1"; + let pack = package(name, vers, "https://rust-lang.org", "123"); + btree.insert((pname(name), pversion(vers)), pack); + } + + let repo = Repository::from(btree); + + let ps = repo.find_by_name(&pname("a")); + assert_eq!(ps.len(), 1); + + let p = ps.get(0).unwrap(); + assert_eq!(*p.name(), pname("a")); + assert_eq!(*p.version(), pversion("1")); + assert!(!p.version_is_semver()); + } + + #[test] + fn test_find() { + let mut btree = BTreeMap::new(); + + { + let name = "a"; + let vers = "1"; + let pack = package(name, vers, "https://rust-lang.org", "123"); + btree.insert((pname(name), pversion(vers)), pack); + } + { + let name = "a"; + let vers = "2"; + let pack = package(name, vers, "https://rust-lang.org", "124"); + btree.insert((pname(name), pversion(vers)), pack); + } + + let repo = Repository::from(btree); + + let ps = repo.find(&pname("a"), &pversion("2")); + assert_eq!(ps.len(), 1); + + let p = ps.get(0).unwrap(); + assert_eq!(*p.name(), pname("a")); + assert_eq!(*p.version(), pversion("2")); + assert!(!p.version_is_semver()); + } + + #[test] + fn test_find_with_vers_constr_any() { + let mut btree = BTreeMap::new(); + + { + let name = "a"; + let vers = "1"; + let pack = package(name, vers, "https://rust-lang.org", "123"); + btree.insert((pname(name), pversion(vers)), pack); + } + { + let name = "a"; + let vers = "2"; + let pack = package(name, vers, "https://rust-lang.org", "124"); + btree.insert((pname(name), pversion(vers)), pack); + } + { + let name = "a"; + let vers = "3"; + let pack = package(name, vers, "https://rust-lang.org", "125"); + btree.insert((pname(name), pversion(vers)), pack); + } + + let repo = Repository::from(btree); + + let constraint = PackageVersionConstraint::Any; + + let ps = repo.find_with_version_constraint(&pname("a"), &constraint); + assert_eq!(ps.len(), 3); + + let p = ps.get(0).unwrap(); + assert_eq!(*p.name(), pname("a")); + assert_eq!(*p.version(), pversion("1")); + assert!(!p.version_is_semver()); + + let p = ps.get(1).unwrap(); + assert_eq!(*p.name(), pname("a")); + assert_eq!(*p.version(), pversion("2")); + assert!(!p.version_is_semver()); + + let p = ps.get(2).unwrap(); + assert_eq!(*p.name(), pname("a")); + assert_eq!(*p.version(), pversion("3")); + assert!(!p.version_is_semver()); + } + + + #[test] + fn test_find_with_vers_constr_exact() { + let mut btree = BTreeMap::new(); + + { + let name = "a"; + let vers = "1"; + let pack = package(name, vers, "https://rust-lang.org", "123"); + btree.insert((pname(name), pversion(vers)), pack); + } + { + let name = "a"; + let vers = "2"; + let pack = package(name, vers, "https://rust-lang.org", "124"); + btree.insert((pname(name), pversion(vers)), pack); + } + { + let name = "a"; + let vers = "3"; + let pack = package(name, vers, "https://rust-lang.org", "125"); + btree.insert((pname(name), pversion(vers)), pack); + } + + let repo = Repository::from(btree); + + let constraint = PackageVersionConstraint::Exact(pversion("2")); + + let ps = repo.find_with_version_constraint(&pname("a"), &constraint); + assert_eq!(ps.len(), 1); + + let p = ps.get(0).unwrap(); + assert_eq!(*p.name(), pname("a")); + assert_eq!(*p.version(), pversion("2")); + assert!(!p.version_is_semver()); + } +} |