diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-06-25 16:44:29 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-06-26 00:20:05 +0900 |
| commit | f5f429dbae0a3e2d8224c0b1e4edcef54805d286 (patch) | |
| tree | 9f837baeeae6efa0ed926b181b8c273128d86c49 /crates/shirabe/tests/repository | |
| parent | 3a0d9340810a8808d963135a884f50d08442ac67 (diff) | |
| download | php-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.rs | 105 | ||||
| -rw-r--r-- | crates/shirabe/tests/repository/vcs/svn_driver_test.rs | 66 |
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 + ); } |
