diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-07-19 15:20:26 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-07-19 17:53:42 +0900 |
| commit | 82cd8e8051ef791b9224916a5e2060ad38c1f82b (patch) | |
| tree | 32c1428f354c2f43df1819c5c5ee74dfdd6c403f /crates/shirabe/tests/common | |
| parent | a3334ee267d3e905646bdb49c2edc8774ac8d966 (diff) | |
| download | php-shirabe-82cd8e8051ef791b9224916a5e2060ad38c1f82b.tar.gz php-shirabe-82cd8e8051ef791b9224916a5e2060ad38c1f82b.tar.zst php-shirabe-82cd8e8051ef791b9224916a5e2060ad38c1f82b.zip | |
fix(update-command): un-ignore test_update by fixing 3 real bugs
test_update was skipped for a stale reason; running it uncovered three
distinct bugs it was actually catching:
- ApplicationTester::run never restored SHELL_VERBOSITY after
Application::configureIO mutates it, so one dataset's -vv verbosity
leaked into later runs sharing the process (Symfony's tester restores
it in a finally block; the port dropped that).
- Installer::do_install built its RepositorySet with a hardcoded empty
temporary_constraints map instead of self.temporary_constraints, so
--with never actually constrained the resolver.
- BumpCommand was missing a <warning> tag pair around one of its output
lines.
Diffstat (limited to 'crates/shirabe/tests/common')
| -rw-r--r-- | crates/shirabe/tests/common/test_case.rs | 67 |
1 files changed, 53 insertions, 14 deletions
diff --git a/crates/shirabe/tests/common/test_case.rs b/crates/shirabe/tests/common/test_case.rs index 91d890a9..2b94bbe1 100644 --- a/crates/shirabe/tests/common/test_case.rs +++ b/crates/shirabe/tests/common/test_case.rs @@ -317,24 +317,63 @@ impl ApplicationTester { input: Vec<(PhpMixed, PhpMixed)>, options: RunOptions, ) -> anyhow::Result<i32> { - let mut array_input = ArrayInput::new(input, None)?; - if let Some(interactive) = options.interactive { - array_input.set_interactive(interactive); - } - if !self.inputs.is_empty() { - array_input.set_stream(Self::create_stream(&self.inputs)); - } + let prev_shell_verbosity = shirabe_php_shim::getenv("SHELL_VERBOSITY"); + + let result = (|| -> anyhow::Result<i32> { + let mut array_input = ArrayInput::new(input, None)?; + if let Some(interactive) = options.interactive { + array_input.set_interactive(interactive); + } + if !self.inputs.is_empty() { + array_input.set_stream(Self::create_stream(&self.inputs)); + } + + self.init_output(&options); - self.init_output(&options); + let input: std::rc::Rc<std::cell::RefCell<dyn InputInterface>> = + std::rc::Rc::new(std::cell::RefCell::new(array_input)); + let output = self.output.clone().expect("init_output initializes output"); - let input: std::rc::Rc<std::cell::RefCell<dyn InputInterface>> = - std::rc::Rc::new(std::cell::RefCell::new(array_input)); - let output = self.output.clone().expect("init_output initializes output"); + let status_code = self.application.run(Some(input), Some(output))?; + self.status_code = Some(status_code); - let status_code = self.application.run(Some(input), Some(output))?; - self.status_code = Some(status_code); + Ok(status_code) + })(); + + // ref: Symfony\Component\Console\Tester\ApplicationTester::run's `finally` block. + // Application::configureIO mutates the real SHELL_VERBOSITY env var (and the $_ENV/$_SERVER + // superglobal shims), so it must be restored here or one test's verbosity leaks into the + // next `run()` call sharing this process. + match &prev_shell_verbosity { + None => { + if shirabe_php_shim::function_exists("putenv") { + unsafe { shirabe_php_shim::putenv_clear("SHELL_VERBOSITY") }; + } + shirabe_php_shim::PHP_ENV + .lock() + .unwrap() + .clear("SHELL_VERBOSITY"); + shirabe_php_shim::PHP_SERVER + .lock() + .unwrap() + .clear("SHELL_VERBOSITY"); + } + Some(prev) => { + if shirabe_php_shim::function_exists("putenv") { + unsafe { shirabe_php_shim::putenv("SHELL_VERBOSITY", prev) }; + } + shirabe_php_shim::PHP_ENV + .lock() + .unwrap() + .put("SHELL_VERBOSITY".into(), prev.clone()); + shirabe_php_shim::PHP_SERVER + .lock() + .unwrap() + .put("SHELL_VERBOSITY".into(), prev.clone()); + } + } - Ok(status_code) + result } fn init_output(&mut self, options: &RunOptions) { |
