aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-06-21 03:55:22 +0900
committernsfisis <nsfisis@gmail.com>2026-06-21 03:55:22 +0900
commitd5334c9e88a1fc6e88c7609830351170bbcf5db3 (patch)
treed7f9885d002fb0c174dcea6a3249dbbeab2b9918
parent27b73a9d4e27027bd34c0068989ce0609bdc6e9f (diff)
downloadphp-shirabe-d5334c9e88a1fc6e88c7609830351170bbcf5db3.tar.gz
php-shirabe-d5334c9e88a1fc6e88c7609830351170bbcf5db3.tar.zst
php-shirabe-d5334c9e88a1fc6e88c7609830351170bbcf5db3.zip
test: port IniHelperTest and RepositoryUtilsTest
IniHelper cases reach XdebugHandler::get_all_ini_files (todo!()); RepositoryUtils filterRequiredPackages is fully modeled but building linked packages via ArrayLoader parses constraints with a look-around regex the regex crate cannot compile. Both ignored. setUp/tearDown not ported. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
-rw-r--r--crates/shirabe/tests/repository/main.rs1
-rw-r--r--crates/shirabe/tests/repository/repository_utils_test.rs165
-rw-r--r--crates/shirabe/tests/util/ini_helper_test.rs55
-rw-r--r--crates/shirabe/tests/util/main.rs1
4 files changed, 222 insertions, 0 deletions
diff --git a/crates/shirabe/tests/repository/main.rs b/crates/shirabe/tests/repository/main.rs
index 98b3c68..b2b4707 100644
--- a/crates/shirabe/tests/repository/main.rs
+++ b/crates/shirabe/tests/repository/main.rs
@@ -5,4 +5,5 @@ mod array_repository_test;
mod composite_repository_test;
mod installed_repository_test;
mod repository_factory_test;
+mod repository_utils_test;
mod vcs;
diff --git a/crates/shirabe/tests/repository/repository_utils_test.rs b/crates/shirabe/tests/repository/repository_utils_test.rs
index b732b42..e892af7 100644
--- a/crates/shirabe/tests/repository/repository_utils_test.rs
+++ b/crates/shirabe/tests/repository/repository_utils_test.rs
@@ -1 +1,166 @@
//! ref: composer/tests/Composer/Test/Repository/RepositoryUtilsTest.php
+
+use indexmap::IndexMap;
+use shirabe::package::handle::PackageInterfaceHandle;
+use shirabe::package::loader::array_loader::ArrayLoader;
+use shirabe::repository::RepositoryUtils;
+use shirabe_php_shim::PhpMixed;
+
+use crate::test_case::{get_alias_package, get_package};
+
+/// PHP `configureLinks` sets link arrays on non-root packages; the public handle API only allows
+/// link setters on root packages, so packages carrying links are built via ArrayLoader.
+fn load_with(
+ name: &str,
+ version: &str,
+ link_type: &str,
+ deps: Vec<(&str, &str)>,
+) -> 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()));
+
+ let mut links: IndexMap<String, PhpMixed> = IndexMap::new();
+ for (dep, constraint) in deps {
+ links.insert(dep.to_string(), PhpMixed::String(constraint.to_string()));
+ }
+ config.insert(link_type.to_string(), PhpMixed::Array(links));
+
+ ArrayLoader::new(None, false)
+ .load_packages(vec![config])
+ .unwrap()
+ .remove(0)
+}
+
+/// ref: RepositoryUtilsTest::getPackages
+fn build_packages() -> IndexMap<String, PackageInterfaceHandle> {
+ let package_c = get_package("required/c", "1.0.0");
+ let package_c_alias = get_alias_package(&package_c, "2.0.0");
+
+ let mut pkgs: IndexMap<String, PackageInterfaceHandle> = IndexMap::new();
+ pkgs.insert("0".to_string(), get_package("dummy/pkg", "1.0.0"));
+ pkgs.insert("1".to_string(), get_package("dummy/pkg2", "2.0.0"));
+ pkgs.insert("a".to_string(), get_package("required/a", "1.0.0"));
+ pkgs.insert(
+ "b".to_string(),
+ load_with("required/b", "1.0.0", "require", vec![("required/c", "*")]),
+ );
+ pkgs.insert("c".to_string(), package_c);
+ pkgs.insert("c-alias".to_string(), package_c_alias);
+ pkgs.insert(
+ "circular".to_string(),
+ load_with(
+ "required/circular",
+ "1.0.0",
+ "require",
+ vec![("required/circular-b", "*")],
+ ),
+ );
+ pkgs.insert(
+ "circular-b".to_string(),
+ load_with(
+ "required/circular-b",
+ "1.0.0",
+ "require",
+ vec![("required/circular", "*")],
+ ),
+ );
+ pkgs
+}
+
+struct FilterCase {
+ requirer: PackageInterfaceHandle,
+ expected: Vec<&'static str>,
+ include_require_dev: bool,
+}
+
+/// ref: RepositoryUtilsTest::provideFilterRequireTests
+fn provide_filter_require_tests() -> Vec<FilterCase> {
+ vec![
+ // 'no require'
+ FilterCase {
+ requirer: get_package("requirer/pkg", "1.0.0"),
+ expected: vec![],
+ include_require_dev: false,
+ },
+ // 'require-dev has no effect'
+ FilterCase {
+ requirer: load_with(
+ "requirer/pkg",
+ "1.0.0",
+ "require-dev",
+ vec![("required/a", "*")],
+ ),
+ expected: vec![],
+ include_require_dev: false,
+ },
+ // 'require-dev works if called with it enabled'
+ FilterCase {
+ requirer: load_with(
+ "requirer/pkg",
+ "1.0.0",
+ "require-dev",
+ vec![("required/a", "*")],
+ ),
+ expected: vec!["a"],
+ include_require_dev: true,
+ },
+ // 'simple require'
+ FilterCase {
+ requirer: load_with("requirer/pkg", "1.0.0", "require", vec![("required/a", "*")]),
+ expected: vec!["a"],
+ include_require_dev: false,
+ },
+ // 'require constraint is irrelevant'
+ FilterCase {
+ requirer: load_with(
+ "requirer/pkg",
+ "1.0.0",
+ "require",
+ vec![("required/a", "dev-lala")],
+ ),
+ expected: vec!["a"],
+ include_require_dev: false,
+ },
+ // 'require transitive deps and aliases are included'
+ FilterCase {
+ requirer: load_with("requirer/pkg", "1.0.0", "require", vec![("required/b", "*")]),
+ expected: vec!["b", "c", "c-alias"],
+ include_require_dev: false,
+ },
+ // 'circular deps are no problem'
+ FilterCase {
+ requirer: load_with(
+ "requirer/pkg",
+ "1.0.0",
+ "require",
+ vec![("required/circular", "*")],
+ ),
+ expected: vec!["circular", "circular-b"],
+ include_require_dev: false,
+ },
+ ]
+}
+
+#[test]
+#[ignore = "building packages with links via ArrayLoader parses constraints with a look-around regex the regex crate cannot compile"]
+fn test_filter_required_packages() {
+ for case in provide_filter_require_tests() {
+ let pkgs = build_packages();
+ let packages: Vec<PackageInterfaceHandle> = pkgs.values().cloned().collect();
+ let expected: Vec<PackageInterfaceHandle> =
+ case.expected.iter().map(|name| pkgs[*name].clone()).collect();
+
+ let result = RepositoryUtils::filter_required_packages(
+ &packages,
+ case.requirer,
+ case.include_require_dev,
+ vec![],
+ );
+
+ assert_eq!(expected.len(), result.len());
+ for (expected_pkg, result_pkg) in expected.iter().zip(result.iter()) {
+ assert!(expected_pkg.ptr_eq(result_pkg));
+ }
+ }
+}
diff --git a/crates/shirabe/tests/util/ini_helper_test.rs b/crates/shirabe/tests/util/ini_helper_test.rs
index 69f6f1b..54ab250 100644
--- a/crates/shirabe/tests/util/ini_helper_test.rs
+++ b/crates/shirabe/tests/util/ini_helper_test.rs
@@ -1 +1,56 @@
//! ref: composer/tests/Composer/Test/Util/IniHelperTest.php
+
+use shirabe::util::ini_helper::IniHelper;
+use shirabe_php_shim::{PATH_SEPARATOR, putenv};
+
+fn set_env(paths: &[&str]) {
+ putenv(&format!("COMPOSER_ORIGINAL_INIS={}", paths.join(PATH_SEPARATOR)));
+}
+
+#[test]
+#[ignore = "IniHelper::get_all reaches XdebugHandler::get_all_ini_files, which is todo!()"]
+fn test_with_no_ini() {
+ let paths = [""];
+
+ set_env(&paths);
+ assert!(IniHelper::get_message().contains("does not exist"));
+ assert_eq!(
+ paths.iter().map(|s| s.to_string()).collect::<Vec<_>>(),
+ IniHelper::get_all()
+ );
+}
+
+#[test]
+#[ignore = "IniHelper::get_all reaches XdebugHandler::get_all_ini_files, which is todo!()"]
+fn test_with_loaded_ini_only() {
+ let paths = ["loaded.ini"];
+
+ set_env(&paths);
+ assert!(IniHelper::get_message().contains("loaded.ini"));
+}
+
+#[test]
+#[ignore = "IniHelper::get_all reaches XdebugHandler::get_all_ini_files, which is todo!()"]
+fn test_with_loaded_ini_and_additional() {
+ let paths = ["loaded.ini", "one.ini", "two.ini"];
+
+ set_env(&paths);
+ assert!(IniHelper::get_message().contains("multiple ini files"));
+ assert_eq!(
+ paths.iter().map(|s| s.to_string()).collect::<Vec<_>>(),
+ IniHelper::get_all()
+ );
+}
+
+#[test]
+#[ignore = "IniHelper::get_all reaches XdebugHandler::get_all_ini_files, which is todo!()"]
+fn test_without_loaded_ini_and_additional() {
+ let paths = ["", "one.ini", "two.ini"];
+
+ set_env(&paths);
+ assert!(IniHelper::get_message().contains("multiple ini files"));
+ assert_eq!(
+ paths.iter().map(|s| s.to_string()).collect::<Vec<_>>(),
+ IniHelper::get_all()
+ );
+}
diff --git a/crates/shirabe/tests/util/main.rs b/crates/shirabe/tests/util/main.rs
index 6165e54..1955f8d 100644
--- a/crates/shirabe/tests/util/main.rs
+++ b/crates/shirabe/tests/util/main.rs
@@ -3,6 +3,7 @@ mod error_handler_test;
mod forgejo_url_test;
mod http;
mod http_downloader_test;
+mod ini_helper_test;
mod metadata_minifier_test;
mod no_proxy_pattern_test;
mod package_sorter_test;