aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/tests/repository
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-06-25 16:44:29 +0900
committernsfisis <nsfisis@gmail.com>2026-06-26 00:20:05 +0900
commitf5f429dbae0a3e2d8224c0b1e4edcef54805d286 (patch)
tree9f837baeeae6efa0ed926b181b8c273128d86c49 /crates/shirabe/tests/repository
parent3a0d9340810a8808d963135a884f50d08442ac67 (diff)
downloadphp-shirabe-f5f429dbae0a3e2d8224c0b1e4edcef54805d286.tar.gz
php-shirabe-f5f429dbae0a3e2d8224c0b1e4edcef54805d286.tar.zst
php-shirabe-f5f429dbae0a3e2d8224c0b1e4edcef54805d286.zip
feat(http): reimplement CurlDownloader on reqwest; port 15 more tests
Replace the libcurl-shim CurlDownloader with a reqwest+tokio implementation per the .ken sketch, resolving the construction panic that blocked command tests (mock path via __new_mock is untouched). Port remote_filesystem (7), hg/svn driver (4), zip_archiver/git_exclude_filter (4) tests. Fix hg/svn/git_exclude regex-delimiter and svn result-propagation porting bugs. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/tests/repository')
-rw-r--r--crates/shirabe/tests/repository/vcs/hg_driver_test.rs105
-rw-r--r--crates/shirabe/tests/repository/vcs/svn_driver_test.rs66
2 files changed, 145 insertions, 26 deletions
diff --git a/crates/shirabe/tests/repository/vcs/hg_driver_test.rs b/crates/shirabe/tests/repository/vcs/hg_driver_test.rs
index 7b6f1e6..f00cb9d 100644
--- a/crates/shirabe/tests/repository/vcs/hg_driver_test.rs
+++ b/crates/shirabe/tests/repository/vcs/hg_driver_test.rs
@@ -9,18 +9,21 @@ use shirabe::io::IOInterface;
use shirabe::io::null_io::NullIO;
use shirabe::repository::vcs::HgDriver;
use shirabe::util::filesystem::Filesystem;
-use shirabe_php_shim::PhpMixed;
+use shirabe::util::http_downloader::HttpDownloaderMockHandler;
+use shirabe::util::process_executor::MockHandler;
+use shirabe_php_shim::{PhpMixed, RuntimeException};
use tempfile::TempDir;
+use crate::http_downloader_mock::{HttpDownloaderMockGuard, get_http_downloader_mock};
+use crate::io_stub::IOStub;
+use crate::process_executor_mock::{ProcessExecutorMockGuard, cmd_full, get_process_executor_mock};
+
struct SetUp {
home: TempDir,
config: Config,
- // The IOInterface mock is not ported.
- io: (),
}
fn set_up() -> SetUp {
- let io = ();
let home = TempDir::new().unwrap();
let mut config = Config::new(true, None);
let mut top: IndexMap<String, PhpMixed> = IndexMap::new();
@@ -32,7 +35,7 @@ fn set_up() -> SetUp {
top.insert("config".to_string(), PhpMixed::Array(config_section));
config.merge(&top, Config::SOURCE_UNKNOWN);
- SetUp { home, config, io }
+ SetUp { home, config }
}
fn tear_down(home: &std::path::Path) {
@@ -76,32 +79,94 @@ fn test_supports() {
}
}
-// The remaining cases construct an HgDriver, which requires an HttpDownloader
-// (curl_multi_init is todo!() in the php-shim) and a mocked ProcessExecutor to feed
-// hg command output, neither of which is available here.
#[test]
-#[ignore = "requires getProcessExecutorMock with expects() hg branches/bookmarks command-sequence assertions and a getMockBuilder HttpDownloader mock; no ProcessExecutorMock/HttpDownloader mocking infrastructure exists"]
fn test_get_branches_filter_invalid_branch_names() {
- let SetUp { home, config, io } = set_up();
+ let SetUp { home, config } = set_up();
let _tear_down = TearDown::new(home.path().to_path_buf());
- let _ = (&config, &io);
- todo!()
+
+ let config = Rc::new(RefCell::new(config));
+ let io: Rc<RefCell<dyn IOInterface>> = Rc::new(RefCell::new(IOStub::new()));
+
+ let (http_downloader, _http_guard): (_, HttpDownloaderMockGuard) =
+ get_http_downloader_mock(vec![], false, HttpDownloaderMockHandler::default());
+
+ let stdout = "default 1:dbf6c8acb640\n--help 1:dbf6c8acb640";
+ let stdout1 = "help 1:dbf6c8acb641\n--help 1:dbf6c8acb641\n";
+
+ let (process, _process_guard): (_, ProcessExecutorMockGuard) = get_process_executor_mock(
+ vec![
+ cmd_full(["hg", "branches"], 0, stdout, ""),
+ cmd_full(["hg", "bookmarks"], 0, stdout1, ""),
+ ],
+ false,
+ MockHandler::default(),
+ );
+
+ let mut repo_config: IndexMap<String, PhpMixed> = IndexMap::new();
+ repo_config.insert(
+ "url".to_string(),
+ PhpMixed::String("https://example.org/acme.git".to_string()),
+ );
+
+ let mut driver = HgDriver::new(repo_config, io, config, http_downloader, process);
+
+ let branches = driver.get_branches().unwrap();
+ let mut expected: IndexMap<String, String> = IndexMap::new();
+ expected.insert("help".to_string(), "dbf6c8acb641".to_string());
+ expected.insert("default".to_string(), "dbf6c8acb640".to_string());
+ assert_eq!(expected, branches);
}
#[test]
-#[ignore = "requires getProcessExecutorMock and a getMockBuilder HttpDownloader mock to construct HgDriver; no ProcessExecutorMock/HttpDownloader mocking infrastructure exists"]
fn test_file_get_content_invalid_identifier() {
- let SetUp { home, config, io } = set_up();
+ let SetUp { home, config } = set_up();
let _tear_down = TearDown::new(home.path().to_path_buf());
- let _ = (&config, &io);
- todo!()
+
+ let config = Rc::new(RefCell::new(config));
+ let io: Rc<RefCell<dyn IOInterface>> = Rc::new(RefCell::new(IOStub::new()));
+
+ let (http_downloader, _http_guard): (_, HttpDownloaderMockGuard) =
+ get_http_downloader_mock(vec![], false, HttpDownloaderMockHandler::default());
+
+ let (process, _process_guard): (_, ProcessExecutorMockGuard) =
+ get_process_executor_mock(vec![], false, MockHandler::default());
+
+ let mut repo_config: IndexMap<String, PhpMixed> = IndexMap::new();
+ repo_config.insert(
+ "url".to_string(),
+ PhpMixed::String("https://example.org/acme.git".to_string()),
+ );
+
+ let driver = HgDriver::new(repo_config, io, config, http_downloader, process);
+
+ assert_eq!(None, driver.get_file_content("file.txt", "h").unwrap());
+
+ let err = driver.get_file_content("file.txt", "-h").unwrap_err();
+ assert!(err.downcast_ref::<RuntimeException>().is_some());
}
#[test]
-#[ignore = "requires getProcessExecutorMock and a getMockBuilder HttpDownloader mock to construct HgDriver; no ProcessExecutorMock/HttpDownloader mocking infrastructure exists"]
fn test_get_change_date_invalid_identifier() {
- let SetUp { home, config, io } = set_up();
+ let SetUp { home, config } = set_up();
let _tear_down = TearDown::new(home.path().to_path_buf());
- let _ = (&config, &io);
- todo!()
+
+ let config = Rc::new(RefCell::new(config));
+ let io: Rc<RefCell<dyn IOInterface>> = Rc::new(RefCell::new(IOStub::new()));
+
+ let (http_downloader, _http_guard): (_, HttpDownloaderMockGuard) =
+ get_http_downloader_mock(vec![], false, HttpDownloaderMockHandler::default());
+
+ let (process, _process_guard): (_, ProcessExecutorMockGuard) =
+ get_process_executor_mock(vec![], false, MockHandler::default());
+
+ let mut repo_config: IndexMap<String, PhpMixed> = IndexMap::new();
+ repo_config.insert(
+ "url".to_string(),
+ PhpMixed::String("https://example.org/acme.git".to_string()),
+ );
+
+ let driver = HgDriver::new(repo_config, io, config, http_downloader, process);
+
+ let err = driver.get_change_date("-r foo").unwrap_err();
+ assert!(err.downcast_ref::<RuntimeException>().is_some());
}
diff --git a/crates/shirabe/tests/repository/vcs/svn_driver_test.rs b/crates/shirabe/tests/repository/vcs/svn_driver_test.rs
index 5ec9097..a1e79fc 100644
--- a/crates/shirabe/tests/repository/vcs/svn_driver_test.rs
+++ b/crates/shirabe/tests/repository/vcs/svn_driver_test.rs
@@ -9,9 +9,15 @@ use shirabe::io::IOInterface;
use shirabe::io::null_io::NullIO;
use shirabe::repository::vcs::SvnDriver;
use shirabe::util::filesystem::Filesystem;
-use shirabe_php_shim::PhpMixed;
+use shirabe::util::http_downloader::HttpDownloaderMockHandler;
+use shirabe::util::process_executor::MockHandler;
+use shirabe_php_shim::{PhpMixed, RuntimeException};
use tempfile::TempDir;
+use crate::http_downloader_mock::{HttpDownloaderMockGuard, get_http_downloader_mock};
+use crate::io_stub::IOStub;
+use crate::process_executor_mock::{ProcessExecutorMockGuard, cmd_full, get_process_executor_mock};
+
struct SetUp {
home: TempDir,
config: Config,
@@ -75,13 +81,61 @@ fn test_support() {
}
}
-// Constructs an SvnDriver and runs an svn command via a mocked ProcessExecutor; mocking is
-// not available here.
-#[ignore = "requires ProcessExecutor mock (getProcessExecutorMock/expects) and IOInterface/HttpDownloader mocks, none available"]
#[test]
fn test_wrong_credentials_in_url() {
let SetUp { home, config } = set_up();
let _tear_down = TearDown::new(home.path().to_path_buf());
- let _ = &config;
- todo!()
+
+ let config = Rc::new(RefCell::new(config));
+ let console: Rc<RefCell<dyn IOInterface>> = Rc::new(RefCell::new(IOStub::new()));
+
+ let (http_downloader, _http_guard): (_, HttpDownloaderMockGuard) =
+ get_http_downloader_mock(vec![], false, HttpDownloaderMockHandler::default());
+
+ let mut output = String::from("svn: OPTIONS of 'https://corp.svn.local/repo':");
+ output.push_str(" authorization failed: Could not authenticate to server:");
+ output.push_str(" rejected Basic challenge (https://corp.svn.local/)");
+
+ let authed_command = [
+ "svn",
+ "ls",
+ "--verbose",
+ "--non-interactive",
+ "--username",
+ "till",
+ "--password",
+ "secret",
+ "--",
+ "https://till:secret@corp.svn.local/repo/trunk",
+ ];
+
+ let (process, _process_guard): (_, ProcessExecutorMockGuard) = get_process_executor_mock(
+ vec![
+ cmd_full(authed_command, 1, "", output.clone()),
+ cmd_full(authed_command, 1, "", output.clone()),
+ cmd_full(authed_command, 1, "", output.clone()),
+ cmd_full(authed_command, 1, "", output.clone()),
+ cmd_full(authed_command, 1, "", output.clone()),
+ cmd_full(authed_command, 1, "", output.clone()),
+ cmd_full(["svn", "--version"], 0, "1.2.3", ""),
+ ],
+ true,
+ MockHandler::default(),
+ );
+
+ let mut repo_config: IndexMap<String, PhpMixed> = IndexMap::new();
+ repo_config.insert(
+ "url".to_string(),
+ PhpMixed::String("https://till:secret@corp.svn.local/repo".to_string()),
+ );
+
+ let mut svn = SvnDriver::new(repo_config, console, config, http_downloader, process);
+ let err = svn.initialize().unwrap_err();
+ let runtime = err
+ .downcast_ref::<RuntimeException>()
+ .expect("expected RuntimeException");
+ assert_eq!(
+ "Repository https://till:secret@corp.svn.local/repo could not be processed, wrong credentials provided (svn: OPTIONS of 'https://corp.svn.local/repo': authorization failed: Could not authenticate to server: rejected Basic challenge (https://corp.svn.local/))",
+ runtime.message
+ );
}