diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-06-28 06:11:57 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-06-28 07:20:32 +0900 |
| commit | 3e8ae4a30536c54a187b935bc55887eadca2ea06 (patch) | |
| tree | c3c1f77550b160a0e5c6c54588f3b2174b23fa6b /crates/shirabe/tests | |
| parent | b3849c077fe19808afcace0753d37bdd91118ceb (diff) | |
| download | php-shirabe-3e8ae4a30536c54a187b935bc55887eadca2ea06.tar.gz php-shirabe-3e8ae4a30536c54a187b935bc55887eadca2ea06.tar.zst php-shirabe-3e8ae4a30536c54a187b935bc55887eadca2ea06.zip | |
test(downloader): port Fossil/Hg testRemove
The FilesystemMock seam (already used by FileDownloaderTest) intercepts
removeDirectoryAsync before any rm -rf, so the prior execute_async blocker
no longer applies. getDownloaderMock gains the optional filesystem param.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/tests')
| -rw-r--r-- | crates/shirabe/tests/downloader/fossil_downloader_test.rs | 58 | ||||
| -rw-r--r-- | crates/shirabe/tests/downloader/hg_downloader_test.rs | 55 |
2 files changed, 89 insertions, 24 deletions
diff --git a/crates/shirabe/tests/downloader/fossil_downloader_test.rs b/crates/shirabe/tests/downloader/fossil_downloader_test.rs index e403229..2c47ac9 100644 --- a/crates/shirabe/tests/downloader/fossil_downloader_test.rs +++ b/crates/shirabe/tests/downloader/fossil_downloader_test.rs @@ -9,7 +9,7 @@ use shirabe::downloader::fossil_downloader::FossilDownloader; use shirabe::io::IOInterface; use shirabe::package::handle::{CompletePackageHandle, PackageInterfaceHandle}; use shirabe::util::ProcessExecutor; -use shirabe::util::filesystem::Filesystem; +use shirabe::util::filesystem::{Filesystem, FilesystemMock}; use shirabe_php_shim::PhpMixed; use shirabe_semver::VersionParser; use tempfile::TempDir; @@ -72,6 +72,7 @@ fn get_downloader_mock( io: Option<Rc<RefCell<dyn IOInterface>>>, config: Option<Config>, process: Rc<RefCell<ProcessExecutor>>, + filesystem: Option<Rc<RefCell<Filesystem>>>, ) -> FossilDownloader { let io = io.unwrap_or_else(|| Rc::new(RefCell::new(IOStub::new())) as Rc<RefCell<dyn IOInterface>>); @@ -81,7 +82,7 @@ fn get_downloader_mock( .with("secure-http", PhpMixed::Bool(false)) .build() }))); - let fs = Rc::new(RefCell::new(Filesystem::new(None))); + let fs = filesystem.unwrap_or_else(|| Rc::new(RefCell::new(Filesystem::new(None)))); FossilDownloader::new(io, config, process, fs) } @@ -93,7 +94,7 @@ fn test_install_for_package_without_source_reference() { let package = get_package(None, None); let (process, _guard) = get_process_executor_mock(vec![], false, Default::default()); - let mut downloader = get_downloader_mock(None, None, process); + let mut downloader = get_downloader_mock(None, None, process, None); let path = format!("{}/path", working_dir.path().to_string_lossy()); let result = run(downloader.install(package, &path)); @@ -127,7 +128,7 @@ fn test_install() { Default::default(), ); - let mut downloader = get_downloader_mock(None, None, process); + let mut downloader = get_downloader_mock(None, None, process, None); run(downloader.install(package, &working_dir_str)).unwrap(); } @@ -140,7 +141,7 @@ fn test_updatefor_package_without_source_reference() { let source_package = get_package(None, None); let (process, _guard) = get_process_executor_mock(vec![], false, Default::default()); - let mut downloader = get_downloader_mock(None, None, process); + let mut downloader = get_downloader_mock(None, None, process, None); let result = run(async { downloader @@ -188,7 +189,7 @@ fn test_update() { Default::default(), ); - let mut downloader = get_downloader_mock(None, None, process); + let mut downloader = get_downloader_mock(None, None, process, None); run(async { downloader .prepare( @@ -210,15 +211,48 @@ fn test_update() { }); } -#[ignore = "PHP mocks Filesystem::removeDirectoryAsync; with a real Filesystem the actual \ - removeDirectoryAsync drives its own ProcessExecutor for `rm -rf` through the \ - unported execute_async mock seam"] #[test] fn test_remove() { let working_dir = set_up(); let _tear_down = TearDown::new(working_dir.path().to_path_buf()); - let _ = &working_dir; - todo!() + let working_dir_str = working_dir.path().to_string_lossy().into_owned(); + + // Ensure file exists + let file = format!("{}/.fslckout", working_dir_str); + std::fs::File::create(&file).unwrap(); + + let package = get_package(None, None); + + let (process, _guard) = get_process_executor_mock( + vec![crate::process_executor_mock::cmd(vec!["fossil", "changes"])], + true, + Default::default(), + ); + + let mut filesystem = Filesystem::new(None); + filesystem.__set_mock(FilesystemMock { + remove_directory_async_result: Some(true), + ..Default::default() + }); + let filesystem = Rc::new(RefCell::new(filesystem)); + + let mut downloader = get_downloader_mock(None, None, process, Some(filesystem.clone())); + run(async { + downloader + .prepare("uninstall", package.clone(), &working_dir_str, None) + .await + .unwrap(); + downloader + .remove(package.clone(), &working_dir_str) + .await + .unwrap(); + downloader + .cleanup("uninstall", package, &working_dir_str, None) + .await + .unwrap(); + }); + + assert_eq!(filesystem.borrow().__remove_directory_async_calls(), 1); } #[test] @@ -228,7 +262,7 @@ fn test_get_installation_source() { let _ = &working_dir; let (process, _guard) = get_process_executor_mock(vec![], false, Default::default()); - let downloader = get_downloader_mock(None, None, process); + let downloader = get_downloader_mock(None, None, process, None); assert_eq!("source", downloader.get_installation_source()); } diff --git a/crates/shirabe/tests/downloader/hg_downloader_test.rs b/crates/shirabe/tests/downloader/hg_downloader_test.rs index c331533..28483f5 100644 --- a/crates/shirabe/tests/downloader/hg_downloader_test.rs +++ b/crates/shirabe/tests/downloader/hg_downloader_test.rs @@ -9,7 +9,7 @@ use shirabe::downloader::hg_downloader::HgDownloader; use shirabe::io::IOInterface; use shirabe::package::handle::{CompletePackageHandle, PackageInterfaceHandle}; use shirabe::util::ProcessExecutor; -use shirabe::util::filesystem::Filesystem; +use shirabe::util::filesystem::{Filesystem, FilesystemMock}; use shirabe_semver::VersionParser; use tempfile::TempDir; @@ -74,13 +74,14 @@ fn get_downloader_mock( io: Option<Rc<RefCell<dyn IOInterface>>>, config: Option<Config>, process: Rc<RefCell<ProcessExecutor>>, + filesystem: Option<Rc<RefCell<Filesystem>>>, ) -> HgDownloader { let io = io.unwrap_or_else(|| Rc::new(RefCell::new(IOStub::new())) as Rc<RefCell<dyn IOInterface>>); let config = Rc::new(RefCell::new( config.unwrap_or_else(|| Config::new(false, None)), )); - let fs = Rc::new(RefCell::new(Filesystem::new(None))); + let fs = filesystem.unwrap_or_else(|| Rc::new(RefCell::new(Filesystem::new(None)))); HgDownloader::new(io, config, process, fs) } @@ -93,7 +94,7 @@ fn test_download_for_package_without_source_reference() { let package = get_package(None, None); let (process, _guard) = get_process_executor_mock(vec![], false, Default::default()); - let mut downloader = get_downloader_mock(None, None, process); + let mut downloader = get_downloader_mock(None, None, process, None); let result = run(downloader.install(package, "/path")); let e = result.expect_err("missing source reference should throw"); @@ -123,7 +124,7 @@ fn test_download() { Default::default(), ); - let mut downloader = get_downloader_mock(None, None, process); + let mut downloader = get_downloader_mock(None, None, process, None); run(downloader.install(package, &working_dir_str)).unwrap(); } @@ -137,7 +138,7 @@ fn test_updatefor_package_without_source_reference() { let source_package = get_package(None, None); let (process, _guard) = get_process_executor_mock(vec![], false, Default::default()); - let mut downloader = get_downloader_mock(None, None, process); + let mut downloader = get_downloader_mock(None, None, process, None); let result = run(async { downloader @@ -183,7 +184,7 @@ fn test_update() { Default::default(), ); - let mut downloader = get_downloader_mock(None, None, process); + let mut downloader = get_downloader_mock(None, None, process, None); run(async { downloader .prepare( @@ -205,15 +206,45 @@ fn test_update() { }); } -#[ignore = "PHP mocks Filesystem::removeDirectoryAsync; with a real Filesystem the actual \ - removeDirectoryAsync drives its own ProcessExecutor for `rm -rf` through the \ - unported execute_async mock seam"] #[test] fn test_remove() { let working_dir = set_up(); let _tear_down = TearDown::new(working_dir.path().to_path_buf()); - let _ = &working_dir; - todo!() + let working_dir_str = working_dir.path().to_string_lossy().into_owned(); + + let mut fs = Filesystem::new(None); + fs.ensure_directory_exists(&format!("{}/.hg", working_dir_str)) + .unwrap(); + + let package = get_package(None, None); + + let (process, _guard) = + get_process_executor_mock(vec![cmd(vec!["hg", "st"])], true, Default::default()); + + let mut filesystem = Filesystem::new(None); + filesystem.__set_mock(FilesystemMock { + remove_directory_async_result: Some(true), + ..Default::default() + }); + let filesystem = Rc::new(RefCell::new(filesystem)); + + let mut downloader = get_downloader_mock(None, None, process, Some(filesystem.clone())); + run(async { + downloader + .prepare("uninstall", package.clone(), &working_dir_str, None) + .await + .unwrap(); + downloader + .remove(package.clone(), &working_dir_str) + .await + .unwrap(); + downloader + .cleanup("uninstall", package, &working_dir_str, None) + .await + .unwrap(); + }); + + assert_eq!(filesystem.borrow().__remove_directory_async_calls(), 1); } #[test] @@ -223,7 +254,7 @@ fn test_get_installation_source() { let _ = &working_dir; let (process, _guard) = get_process_executor_mock(vec![], false, Default::default()); - let downloader = get_downloader_mock(None, None, process); + let downloader = get_downloader_mock(None, None, process, None); assert_eq!("source", downloader.get_installation_source()); } |
