From 70198f0c1e67594549193413fb8e86b1879dc41d Mon Sep 17 00:00:00 2001 From: nsfisis Date: Fri, 24 Jul 2026 20:23:18 +0900 Subject: fix(installer-test): catch exceptions thrown during composer construction MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PHPUnit's expectException/expectExceptionMessage wrap the whole rest of InstallerTest::doTestIntegration, so a fixture's expected exception can legitimately come from FactoryMock::create() itself (root package construction), not just the later install/update run. The Rust port only checked for that at one point, after the run, and unconditionally unwrapped Factory::__create_mock's result — so a fixture like install-self-from-root.test (root package requiring itself, which throws during root package construction) panicked on that unwrap instead of being caught and compared against the expected message. Capture the construction Result and, when an exception was expected, run the same normalize/contains/assert check the later block already uses before returning early, matching PHPUnit's behavior of running no further test-method code once the expected exception has fired. --- crates/shirabe/tests/installer_test.rs | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) (limited to 'crates/shirabe') diff --git a/crates/shirabe/tests/installer_test.rs b/crates/shirabe/tests/installer_test.rs index 7a581a00..e4fe681c 100644 --- a/crates/shirabe/tests/installer_test.rs +++ b/crates/shirabe/tests/installer_test.rs @@ -856,13 +856,28 @@ fn do_test_integration(case: &IntegrationCase, expect_output: Option<&str>) { .as_array() .cloned() .unwrap_or_default(); - let composer = Factory::__create_mock( + let composer_result = Factory::__create_mock( io.clone(), Some(LocalConfigInput::Data(composer_data)), DisablePlugins::None, false, - ) - .unwrap(); + ); + // PHP's PHPUnit::expectException wraps the whole rest of the test method, so an exception + // expected from the fixture can come from composer construction itself, not just the later + // install/update run; check for that here since Rust has no equivalent ambient wrapper. + if is_exception && let Err(e) = &composer_result { + let normalized = case.expect.replace('\n', shirabe_php_shim::PHP_EOL); + let normalized = normalized.trim_end(); + let err = format!("{}", e); + assert!( + err.contains(normalized), + "expected exception message containing:\n{}\n--- got ---\n{}", + normalized, + err + ); + return; + } + let composer = composer_result.unwrap(); // installed.json mock: a real JsonFile over a temp file holding $installed, wrapped in the // no-op InstalledFilesystemRepositoryMock. @@ -1411,7 +1426,7 @@ pool_optimizer_test! { pool_optimizer_install_prefers_repos_over_package_versions => "install-prefers-repos-over-package-versions.test"; pool_optimizer_install_reference => "install-reference.test"; pool_optimizer_install_security_advisory_matching_dependency => "install-security-advisory-matching-dependency.test"; - pool_optimizer_install_self_from_root => "install-self-from-root.test", ignore = "TODO(phase-d): known-failing fixture under COMPOSER_POOL_OPTIMIZER=1"; + pool_optimizer_install_self_from_root => "install-self-from-root.test"; pool_optimizer_install_simple => "install-simple.test"; pool_optimizer_install_without_lock => "install-without-lock.test"; pool_optimizer_load_replaced_package_if_replacer_dropped => "load-replaced-package-if-replacer-dropped.test"; @@ -1601,7 +1616,7 @@ raw_pool_test! { raw_pool_install_prefers_repos_over_package_versions => "install-prefers-repos-over-package-versions.test"; raw_pool_install_reference => "install-reference.test"; raw_pool_install_security_advisory_matching_dependency => "install-security-advisory-matching-dependency.test"; - raw_pool_install_self_from_root => "install-self-from-root.test", ignore = "TODO(phase-d): known-failing fixture under COMPOSER_POOL_OPTIMIZER=0"; + raw_pool_install_self_from_root => "install-self-from-root.test"; raw_pool_install_simple => "install-simple.test"; raw_pool_install_without_lock => "install-without-lock.test"; raw_pool_load_replaced_package_if_replacer_dropped => "load-replaced-package-if-replacer-dropped.test"; -- cgit v1.3.1