aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/tests/command/reinstall_command_test.rs
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-06-27 05:48:50 +0900
committernsfisis <nsfisis@gmail.com>2026-06-27 05:50:10 +0900
commit11746d43db626b07e0bbb8094bf121e03135d141 (patch)
tree371a7a5b93dc1993c05963218c645a738f4cfcbe /crates/shirabe/tests/command/reinstall_command_test.rs
parent067c2b3ab748735b9f0904b8048ccfb6678f3d25 (diff)
downloadphp-shirabe-11746d43db626b07e0bbb8094bf121e03135d141.tar.gz
php-shirabe-11746d43db626b07e0bbb8094bf121e03135d141.tar.zst
php-shirabe-11746d43db626b07e0bbb8094bf121e03135d141.zip
test(command): port install/reinstall/require/update tester tests
The ApplicationTester harness is in place, so port the four command test bodies that were todo!() stubs and replace the stale "requires ApplicationTester ... not implemented" ignore reasons with the actual remaining Phase-C blockers. test_install_command_errors now passes; the rest stay #[ignore] pending installer registration, the update command InputDefinition, and the InstallationManager::execute port. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/tests/command/reinstall_command_test.rs')
-rw-r--r--crates/shirabe/tests/command/reinstall_command_test.rs103
1 files changed, 101 insertions, 2 deletions
diff --git a/crates/shirabe/tests/command/reinstall_command_test.rs b/crates/shirabe/tests/command/reinstall_command_test.rs
index b420fd5..ba3d39a 100644
--- a/crates/shirabe/tests/command/reinstall_command_test.rs
+++ b/crates/shirabe/tests/command/reinstall_command_test.rs
@@ -1,7 +1,106 @@
//! ref: composer/tests/Composer/Test/Command/ReinstallCommandTest.php
-#[ignore = "missing TestCase::init_temp_composer, create_composer_lock, create_installed_json, and get_application_tester (ApplicationTester) infrastructure"]
+use crate::test_case::{
+ RunOptions, create_composer_lock, create_installed_json, get_application_tester, get_package,
+ init_temp_composer,
+};
+use serial_test::serial;
+use shirabe_php_shim::PhpMixed;
+
+fn input(pairs: Vec<(&str, PhpMixed)>) -> Vec<(PhpMixed, PhpMixed)> {
+ pairs
+ .into_iter()
+ .map(|(k, v)| (PhpMixed::from(k), v))
+ .collect()
+}
+
+/// ref: ReinstallCommandTest::caseProvider
+fn cases() -> Vec<(&'static str, Vec<(&'static str, PhpMixed)>, &'static str)> {
+ vec![
+ (
+ "reinstall a package by name",
+ vec![(
+ "packages",
+ PhpMixed::List(vec![
+ PhpMixed::from("root/req"),
+ PhpMixed::from("root/anotherreq*"),
+ ]),
+ )],
+ "- Removing root/req (1.0.0)
+ - Removing root/anotherreq2 (1.0.0)
+ - Removing root/anotherreq (1.0.0)
+ - Installing root/anotherreq (1.0.0)
+ - Installing root/anotherreq2 (1.0.0)
+ - Installing root/req (1.0.0)",
+ ),
+ (
+ "reinstall packages by type",
+ vec![(
+ "--type",
+ PhpMixed::List(vec![PhpMixed::from("metapackage")]),
+ )],
+ "- Removing root/req (1.0.0)
+ - Removing root/lala (1.0.0)
+ - Removing root/anotherreq2 (1.0.0)
+ - Removing root/anotherreq (1.0.0)
+ - Installing root/anotherreq (1.0.0)
+ - Installing root/anotherreq2 (1.0.0)
+ - Installing root/lala (1.0.0)
+ - Installing root/req (1.0.0)",
+ ),
+ (
+ "reinstall a package that is not installed",
+ vec![(
+ "packages",
+ PhpMixed::List(vec![PhpMixed::from("root/unknownreq")]),
+ )],
+ r#"<warning>Pattern "root/unknownreq" does not match any currently installed packages.</warning>
+<warning>Found no packages to reinstall, aborting.</warning>"#,
+ ),
+ ]
+}
+
#[test]
+#[serial]
+#[ignore = "ReinstallCommand::execute defers the two InstallationManager::execute(...) calls (Phase-C: needs a &mut InstalledRepositoryInterface view of local_repo, and InstallationManager::execute is itself todo!()), so no Removing/Installing lines are emitted and the output is empty. Only the \"not installed\" case, which aborts with warnings before reaching that code, would pass"]
fn test_reinstall_command() {
- todo!()
+ for (label, options, expected) in cases() {
+ let composer_json = serde_json::json!({
+ "require": { "root/req": "1.*" },
+ "require-dev": {
+ "root/anotherreq": "2.*",
+ "root/anotherreq2": "2.*",
+ "root/lala": "2.*",
+ },
+ });
+ let _tear_down = init_temp_composer(Some(&composer_json), None, None, true);
+
+ let root_req_package = get_package("root/req", "1.0.0");
+ let another_req_package = get_package("root/anotherreq", "1.0.0");
+ let another_req_package2 = get_package("root/anotherreq2", "1.0.0");
+ let another_req_package3 = get_package("root/lala", "1.0.0");
+ root_req_package.__set_type("metapackage".to_string());
+ another_req_package.__set_type("metapackage".to_string());
+ another_req_package2.__set_type("metapackage".to_string());
+ another_req_package3.__set_type("metapackage".to_string());
+
+ let dev = [
+ another_req_package.clone(),
+ another_req_package2.clone(),
+ another_req_package3.clone(),
+ ];
+ create_composer_lock(std::slice::from_ref(&root_req_package), &dev);
+ create_installed_json(std::slice::from_ref(&root_req_package), &dev, true);
+
+ let mut app_tester = get_application_tester();
+ let mut args = vec![
+ ("command", PhpMixed::from("reinstall")),
+ ("--no-progress", PhpMixed::from(true)),
+ ("--no-plugins", PhpMixed::from(true)),
+ ];
+ args.extend(options);
+ app_tester.run(input(args), RunOptions::default()).unwrap();
+
+ assert_eq!(expected, app_tester.get_display().trim(), "case: {label}");
+ }
}