diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-06-21 03:55:22 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-06-21 03:55:22 +0900 |
| commit | d5334c9e88a1fc6e88c7609830351170bbcf5db3 (patch) | |
| tree | d7f9885d002fb0c174dcea6a3249dbbeab2b9918 | |
| parent | 27b73a9d4e27027bd34c0068989ce0609bdc6e9f (diff) | |
| download | php-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.rs | 1 | ||||
| -rw-r--r-- | crates/shirabe/tests/repository/repository_utils_test.rs | 165 | ||||
| -rw-r--r-- | crates/shirabe/tests/util/ini_helper_test.rs | 55 | ||||
| -rw-r--r-- | crates/shirabe/tests/util/main.rs | 1 |
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; |
