diff options
Diffstat (limited to 'crates/shirabe/tests/command/install_command_test.rs')
| -rw-r--r-- | crates/shirabe/tests/command/install_command_test.rs | 202 |
1 files changed, 194 insertions, 8 deletions
diff --git a/crates/shirabe/tests/command/install_command_test.rs b/crates/shirabe/tests/command/install_command_test.rs index a0586ab..c495b12 100644 --- a/crates/shirabe/tests/command/install_command_test.rs +++ b/crates/shirabe/tests/command/install_command_test.rs @@ -1,25 +1,211 @@ //! ref: composer/tests/Composer/Test/Command/InstallCommandTest.php +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: InstallCommandTest::errorCaseProvider +fn error_cases() -> Vec<( + &'static str, + serde_json::Value, + Vec<(&'static str, PhpMixed)>, + &'static str, +)> { + vec![ + ( + "it writes an error when the dev flag is passed", + serde_json::json!({ "repositories": [] }), + vec![("--dev", PhpMixed::from(true))], + r#"<warning>You are using the deprecated option "--dev". It has no effect and will break in Composer 3.</warning> +Installing dependencies from lock file (including require-dev) +Verifying lock file contents can be installed on current platform. +Nothing to install, update or remove +Generating autoload files"#, + ), + ( + "it writes an error when no-suggest flag passed", + serde_json::json!({ "repositories": [] }), + vec![("--no-suggest", PhpMixed::from(true))], + r#"<warning>You are using the deprecated option "--no-suggest". It has no effect and will break in Composer 3.</warning> +Installing dependencies from lock file (including require-dev) +Verifying lock file contents can be installed on current platform. +Nothing to install, update or remove +Generating autoload files"#, + ), + ( + "it writes an error when packages passed", + serde_json::json!({ "repositories": [] }), + vec![( + "packages", + PhpMixed::List(vec![PhpMixed::from("vendor/package")]), + )], + r#"Invalid argument vendor/package. Use "composer require vendor/package" instead to add packages to your composer.json."#, + ), + ( + "it writes an error when no-install flag is passed", + serde_json::json!({ "repositories": [] }), + vec![("--no-install", PhpMixed::from(true))], + r#"Invalid option "--no-install". Use "composer update --no-install" instead if you are trying to update the composer.lock file."#, + ), + ] +} + #[test] -#[ignore = "requires ApplicationTester and TestCase::initTempComposer/createComposerLock/createInstalledJson harness (not implemented)"] +#[serial] fn test_install_command_errors() { - todo!() + for (label, composer_json, command, expected) in error_cases() { + let _tear_down = init_temp_composer(Some(&composer_json), None, None, true); + + let packages = [get_package("vendor/package", "1.2.3")]; + let dev_packages = [get_package("vendor/devpackage", "2.3.4")]; + + create_composer_lock(&packages, &dev_packages); + create_installed_json(&packages, &dev_packages, true); + + let mut app_tester = get_application_tester(); + let mut args = vec![("command", PhpMixed::from("install"))]; + args.extend(command); + let _ = app_tester.run(input(args), RunOptions::default()); + + assert_eq!( + expected.trim(), + app_tester.get_display().trim(), + "case: {label}" + ); + } } #[test] -#[ignore = "requires ApplicationTester and TestCase::initTempComposer/createComposerLock harness (not implemented)"] +#[serial] +#[ignore = "Factory::create_default_installers is a Phase-C stub that registers no installers (pending the composer construction-ordering / shared-ownership rework), so the install step fails with \"Unknown installer type: metapackage\""] fn test_install_from_empty_vendor() { - todo!() + let composer_json = serde_json::json!({ + "require": { "root/req": "1.*" }, + "require-dev": { "root/another": "1.*" }, + }); + 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_package = get_package("root/another", "1.0.0"); + // Set as a metapackage so that we can do the whole post-remove update & install process without + // Composer trying to download them (DownloadManager::getDownloaderForPackage). + root_req_package.__set_type("metapackage".to_string()); + another_package.__set_type("metapackage".to_string()); + + create_composer_lock(&[root_req_package], &[another_package]); + + let mut app_tester = get_application_tester(); + app_tester + .run( + input(vec![ + ("command", PhpMixed::from("install")), + ("--no-progress", PhpMixed::from(true)), + ]), + RunOptions::default(), + ) + .unwrap(); + + assert_eq!( + "Installing dependencies from lock file (including require-dev) +Verifying lock file contents can be installed on current platform. +Package operations: 2 installs, 0 updates, 0 removals + - Installing root/another (1.0.0) + - Installing root/req (1.0.0) +Generating autoload files", + app_tester.get_display().trim() + ); } #[test] -#[ignore = "requires ApplicationTester and TestCase::initTempComposer/createComposerLock harness (not implemented)"] +#[serial] +#[ignore = "Factory::create_default_installers is a Phase-C stub that registers no installers (pending the composer construction-ordering / shared-ownership rework), so the install step fails with \"Unknown installer type: metapackage\""] fn test_install_from_empty_vendor_no_dev() { - todo!() + let composer_json = serde_json::json!({ + "require": { "root/req": "1.*" }, + "require-dev": { "root/another": "1.*" }, + }); + 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_package = get_package("root/another", "1.0.0"); + // Set as a metapackage so that we can do the whole post-remove update & install process without + // Composer trying to download them (DownloadManager::getDownloaderForPackage). + root_req_package.__set_type("metapackage".to_string()); + another_package.__set_type("metapackage".to_string()); + + create_composer_lock(&[root_req_package], &[another_package]); + + let mut app_tester = get_application_tester(); + app_tester + .run( + input(vec![ + ("command", PhpMixed::from("install")), + ("--no-progress", PhpMixed::from(true)), + ("--no-dev", PhpMixed::from(true)), + ]), + RunOptions::default(), + ) + .unwrap(); + + assert_eq!( + "Installing dependencies from lock file +Verifying lock file contents can be installed on current platform. +Package operations: 1 install, 0 updates, 0 removals + - Installing root/req (1.0.0) +Generating autoload files", + app_tester.get_display().trim() + ); } #[test] -#[ignore = "requires ApplicationTester and TestCase::initTempComposer/createComposerLock/createInstalledJson harness (not implemented)"] +#[serial] +#[ignore = "Factory::create_default_installers is a Phase-C stub that registers no installers (pending the composer construction-ordering / shared-ownership rework), so the install step fails with \"Unknown installer type: metapackage\""] fn test_install_new_packages_with_existing_partial_vendor() { - todo!() + let composer_json = serde_json::json!({ + "require": { + "root/req": "1.*", + "root/another": "1.*", + }, + }); + 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_package = get_package("root/another", "1.0.0"); + // Set as a metapackage so that we can do the whole post-remove update & install process without + // Composer trying to download them (DownloadManager::getDownloaderForPackage). + root_req_package.__set_type("metapackage".to_string()); + another_package.__set_type("metapackage".to_string()); + + create_composer_lock(&[root_req_package.clone(), another_package], &[]); + create_installed_json(&[root_req_package], &[], true); + + let mut app_tester = get_application_tester(); + app_tester + .run( + input(vec![ + ("command", PhpMixed::from("install")), + ("--no-progress", PhpMixed::from(true)), + ]), + RunOptions::default(), + ) + .unwrap(); + + assert_eq!( + "Installing dependencies from lock file (including require-dev) +Verifying lock file contents can be installed on current platform. +Package operations: 1 install, 0 updates, 0 removals + - Installing root/another (1.0.0) +Generating autoload files", + app_tester.get_display().trim() + ); } |
