aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/tests/util
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-06-25 14:46:55 +0900
committernsfisis <nsfisis@gmail.com>2026-06-26 00:19:42 +0900
commit9c6f614aa6ddb5d91340e34b0136be6a14712d63 (patch)
tree35973a35532ada33fe05805995b2e5b5e7bee1bc /crates/shirabe/tests/util
parentd0336078c5b63b174e7313d54d973a1832228928 (diff)
downloadphp-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.rs3
-rw-r--r--crates/shirabe/tests/util/process_executor_test.rs61
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);
+}