diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-06-25 14:46:55 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-06-26 00:19:42 +0900 |
| commit | 9c6f614aa6ddb5d91340e34b0136be6a14712d63 (patch) | |
| tree | 35973a35532ada33fe05805995b2e5b5e7bee1bc /crates/shirabe/tests/util | |
| parent | d0336078c5b63b174e7313d54d973a1832228928 (diff) | |
| download | php-shirabe-9c6f614aa6ddb5d91340e34b0136be6a14712d63.tar.gz php-shirabe-9c6f614aa6ddb5d91340e34b0136be6a14712d63.tar.zst php-shirabe-9c6f614aa6ddb5d91340e34b0136be6a14712d63.zip | |
feat(util): add ProcessExecutorMock test infra; port SymfonyStyle message methods
Add an internal mock hook to ProcessExecutor (None in production) so
tests can stub command execution without spawning processes, mirroring
Composer's ProcessExecutorMock subclass. Add get_process_executor_mock
helper and two verification tests. Implement SymfonyStyle's
message-handling methods.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/tests/util')
| -rw-r--r-- | crates/shirabe/tests/util/main.rs | 3 | ||||
| -rw-r--r-- | crates/shirabe/tests/util/process_executor_test.rs | 61 |
2 files changed, 64 insertions, 0 deletions
diff --git a/crates/shirabe/tests/util/main.rs b/crates/shirabe/tests/util/main.rs index e779fe0..bf23c6b 100644 --- a/crates/shirabe/tests/util/main.rs +++ b/crates/shirabe/tests/util/main.rs @@ -1,3 +1,6 @@ +#[path = "../common/process_executor_mock.rs"] +mod process_executor_mock; + mod auth_helper_test; mod bitbucket_test; mod config_validator_test; diff --git a/crates/shirabe/tests/util/process_executor_test.rs b/crates/shirabe/tests/util/process_executor_test.rs index ba3177f..342c7ff 100644 --- a/crates/shirabe/tests/util/process_executor_test.rs +++ b/crates/shirabe/tests/util/process_executor_test.rs @@ -204,3 +204,64 @@ fn test_escape_argument() { assert_eq!(unix, ProcessExecutor::escape(argument)); } } + +// Exercises the ProcessExecutorMock infrastructure (cf. +// composer/tests/Composer/Test/Mock/ProcessExecutorMock.php): expectations are matched in order, +// stdout is captured back, stderr surfaces via get_error_output, and assert_complete (via the +// guard) verifies the queue was fully consumed. +#[test] +fn test_mock_consumes_expectations_in_order() { + use crate::process_executor_mock::{cmd_full, get_process_executor_mock}; + use shirabe::util::process_executor::MockHandler; + + let (process, _guard) = get_process_executor_mock( + vec![ + cmd_full("git command", 1, "out one", ""), + cmd_full(["git", "--version"], 0, "git version 2.0.0", "warn"), + ], + true, + MockHandler::default(), + ); + + let mut output = String::new(); + let rc = process + .borrow_mut() + .execute("git command", &mut output, None) + .unwrap(); + assert_eq!(1, rc); + assert_eq!("out one", output); + + let mut output2 = String::new(); + let rc2 = process + .borrow_mut() + .execute(&["git", "--version"], &mut output2, None) + .unwrap(); + assert_eq!(0, rc2); + assert_eq!("git version 2.0.0", output2); + assert_eq!("warn", process.borrow().get_error_output()); +} + +// Non-strict mode falls back to the default handler for unexpected commands. +#[test] +fn test_mock_default_handler_for_unexpected_command() { + use crate::process_executor_mock::get_process_executor_mock; + use shirabe::util::process_executor::MockHandler; + + let (process, _guard) = get_process_executor_mock( + vec![], + false, + MockHandler { + r#return: 7, + stdout: "fallback".to_string(), + stderr: String::new(), + }, + ); + + let mut output = String::new(); + let rc = process + .borrow_mut() + .execute("anything goes", &mut output, None) + .unwrap(); + assert_eq!(7, rc); + assert_eq!("fallback", output); +} |
