aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/tests/repository/installed_repository_test.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe/tests/repository/installed_repository_test.rs')
-rw-r--r--crates/shirabe/tests/repository/installed_repository_test.rs85
1 files changed, 85 insertions, 0 deletions
diff --git a/crates/shirabe/tests/repository/installed_repository_test.rs b/crates/shirabe/tests/repository/installed_repository_test.rs
index 510923a..b2c88a6 100644
--- a/crates/shirabe/tests/repository/installed_repository_test.rs
+++ b/crates/shirabe/tests/repository/installed_repository_test.rs
@@ -1 +1,86 @@
//! ref: composer/tests/Composer/Test/Repository/InstalledRepositoryTest.php
+
+use indexmap::IndexMap;
+use shirabe::package::handle::PackageInterfaceHandle;
+use shirabe::package::loader::array_loader::ArrayLoader;
+use shirabe::repository::{
+ ArrayRepository, FindPackageConstraint, InstalledArrayRepository, InstalledRepository,
+ RepositoryInterfaceHandle,
+};
+use shirabe_php_shim::PhpMixed;
+
+use crate::test_case::get_package;
+
+/// PHP `setReplaces`/`setProvides` operate on non-root packages; the public handle API only allows
+/// link setters on root packages, so packages carrying links are built via ArrayLoader.
+fn loaded(name: &str, version: &str, extra: Vec<(&str, PhpMixed)>) -> PackageInterfaceHandle {
+ let mut config: IndexMap<String, PhpMixed> = IndexMap::new();
+ config.insert("name".to_string(), PhpMixed::String(name.to_string()));
+ config.insert("version".to_string(), PhpMixed::String(version.to_string()));
+ for (key, value) in extra {
+ config.insert(key.to_string(), value);
+ }
+
+ ArrayLoader::new(None, false)
+ .load_packages(vec![config])
+ .unwrap()
+ .remove(0)
+}
+
+fn provided_link() -> PhpMixed {
+ let mut links: IndexMap<String, PhpMixed> = IndexMap::new();
+ links.insert("provided".to_string(), PhpMixed::String("*".to_string()));
+ PhpMixed::Array(links)
+}
+
+#[test]
+#[ignore = "InstalledRepository::add_repository asserts on a fixed set of repo types that omits InstalledRepositoryInterface, so adding an InstalledArrayRepository panics"]
+fn test_find_packages_with_replacers_and_providers() {
+ let foo = loaded("foo", "1", vec![("replace", provided_link())]);
+ let foo2 = get_package("foo", "2");
+ let array_repo_one =
+ InstalledArrayRepository::new_with_packages(vec![foo.clone(), foo2.clone()]).unwrap();
+
+ let bar = get_package("bar", "1");
+ let bar2 = loaded("bar", "2", vec![("provide", provided_link())]);
+ let array_repo_two =
+ InstalledArrayRepository::new_with_packages(vec![bar.clone(), bar2.clone()]).unwrap();
+
+ let repo = InstalledRepository::new(vec![
+ RepositoryInterfaceHandle::new(array_repo_one),
+ RepositoryInterfaceHandle::new(array_repo_two),
+ ]);
+
+ let foo_matches = repo
+ .find_packages_with_replacers_and_providers(
+ "foo",
+ Some(FindPackageConstraint::String("2".to_string())),
+ )
+ .unwrap();
+ assert_eq!(1, foo_matches.len());
+ assert!(foo_matches[0].ptr_eq(&foo2));
+
+ let bar_matches = repo
+ .find_packages_with_replacers_and_providers(
+ "bar",
+ Some(FindPackageConstraint::String("1".to_string())),
+ )
+ .unwrap();
+ assert_eq!(1, bar_matches.len());
+ assert!(bar_matches[0].ptr_eq(&bar));
+
+ let provided_matches = repo
+ .find_packages_with_replacers_and_providers("provided", None)
+ .unwrap();
+ assert_eq!(2, provided_matches.len());
+ assert!(provided_matches[0].ptr_eq(&foo));
+ assert!(provided_matches[1].ptr_eq(&bar2));
+}
+
+#[test]
+#[should_panic]
+fn test_add_repository() {
+ let array_repo_one = RepositoryInterfaceHandle::new(ArrayRepository::new(vec![]).unwrap());
+
+ InstalledRepository::new(vec![array_repo_one]);
+}