aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/tests/command/check_platform_reqs_command_test.rs
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-06-26 02:23:58 +0900
committernsfisis <nsfisis@gmail.com>2026-06-26 02:23:58 +0900
commit6c89c720d9e4728c288e3c66ffb7dcb4cba5121c (patch)
tree4697f897302425df1b57eb87bf9441308530d0bf /crates/shirabe/tests/command/check_platform_reqs_command_test.rs
parent4bd544608e4934fff4463fd6b104d06162a51ba0 (diff)
downloadphp-shirabe-6c89c720d9e4728c288e3c66ffb7dcb4cba5121c.tar.gz
php-shirabe-6c89c720d9e4728c288e3c66ffb7dcb4cba5121c.tar.zst
php-shirabe-6c89c720d9e4728c288e3c66ffb7dcb4cba5121c.zip
test(command): port show/remove/global/audit/check-platform-reqs/status/self-update/validate tests
Faithfully port the remaining stubbed command test bodies from their PHP counterparts (expected values verbatim). Newly passing: remove (6), global (2), check-platform-reqs (1), status (1), audit (1), self-update (1). Tests whose ported bodies reach a genuine unported src path keep faithful bodies but stay #[ignore] with precise reasons. Dominant blockers surfaced: - ShowCommand::configure stub (empty set_definition) blocks all 42 show tests - Composer-handle RefCell re-entrancy in the Installer (composer.rs:500) and Factory::create_composer (composer.rs:446) paths - check_platform_reqs nests InstalledRepository in InstalledRepository - audit's non-locked branch (audit_command.rs:285) and write_error3 re-entrancy Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/tests/command/check_platform_reqs_command_test.rs')
-rw-r--r--crates/shirabe/tests/command/check_platform_reqs_command_test.rs172
1 files changed, 160 insertions, 12 deletions
diff --git a/crates/shirabe/tests/command/check_platform_reqs_command_test.rs b/crates/shirabe/tests/command/check_platform_reqs_command_test.rs
index 47f89b9..1e19259 100644
--- a/crates/shirabe/tests/command/check_platform_reqs_command_test.rs
+++ b/crates/shirabe/tests/command/check_platform_reqs_command_test.rs
@@ -1,25 +1,173 @@
//! ref: composer/tests/Composer/Test/Command/CheckPlatformReqsCommandTest.php
+use crate::test_case::{
+ RunOptions, create_composer_lock, create_installed_json, get_application_tester,
+ get_complete_package, init_temp_composer,
+};
+use serial_test::serial;
+use shirabe::package::handle::PackageInterfaceHandle;
+use shirabe_php_shim::PhpMixed;
+
+/// ref: CheckPlatformReqsCommandTest::testPlatformReqsAreSatisfied (data provider rolled into one body).
+fn run_platform_reqs_are_satisfied_case(
+ composer_json: serde_json::Value,
+ command: &[(&str, PhpMixed)],
+ expected: &str,
+ lock: bool,
+) {
+ let tear_down = init_temp_composer(Some(&composer_json), None, None, false);
+
+ let packages: Vec<PackageInterfaceHandle> =
+ vec![get_complete_package("ext-foobar", "2.3.4").into()];
+ let dev_packages: Vec<PackageInterfaceHandle> =
+ vec![get_complete_package("ext-barbaz", "2.3.4.5").into()];
+
+ create_installed_json(&packages, &dev_packages, true);
+
+ if lock {
+ create_composer_lock(&packages, &dev_packages);
+ }
+
+ let mut input: Vec<(PhpMixed, PhpMixed)> = vec![(
+ PhpMixed::from("command"),
+ PhpMixed::from("check-platform-reqs"),
+ )];
+ for (k, v) in command {
+ input.push((PhpMixed::from(*k), v.clone()));
+ }
+
+ let mut app_tester = get_application_tester();
+ let status_code = app_tester.run(input, RunOptions::default()).unwrap();
+
+ // assertCommandIsSuccessful
+ assert_eq!(0, status_code, "{}", app_tester.get_display());
+ assert_eq!(expected.trim(), app_tester.get_display().trim());
+
+ drop(tear_down);
+}
+
#[test]
-#[ignore = "needs create_installed_json / create_composer_lock helpers (InstalledFilesystemRepository \
- / Locker::set_lock_data), and require_composer -> Factory reaches ProcessExecutor (git) \
- -> shirabe-php-shim stream_set_blocking (stream.rs todo!(), requires fcntl(2))"]
+#[serial]
+#[ignore = "src porting bug: check_platform_reqs_command.rs:288-294 wraps the existing \
+ InstalledRepository inside a SECOND InstalledRepository (instead of PHP line 89 \
+ `$installedRepo->addRepository(new PlatformRepository(...))`), tripping the \
+ add_repository assertion at installed_repository.rs:367 (\"An InstalledRepository can \
+ not contain a repository of type installed repo ...\"). Cannot fix from test files."]
fn test_platform_reqs_are_satisfied() {
- todo!()
+ // 'Disables checking of require-dev packages requirements.'
+ run_platform_reqs_are_satisfied_case(
+ serde_json::json!({
+ "require": { "ext-foobar": "^2.0" },
+ "require-dev": { "ext-barbaz": "~4.0" },
+ }),
+ &[("--no-dev", PhpMixed::from(true))],
+ "Checking non-dev platform requirements for packages in the vendor dir
+ext-foobar 2.3.4 success",
+ true,
+ );
+
+ // 'Checks requirements only from the lock file, not from installed packages.'
+ run_platform_reqs_are_satisfied_case(
+ serde_json::json!({
+ "require": { "ext-foobar": "^2.3" },
+ "require-dev": { "ext-barbaz": "~2.0" },
+ }),
+ &[("--lock", PhpMixed::from(true))],
+ "Checking platform requirements using the lock file\next-barbaz 2.3.4.5 success \next-foobar 2.3.4 success",
+ true,
+ );
}
#[test]
-#[ignore = "check-platform-reqs calls require_composer -> Factory, reaching ProcessExecutor (git) \
- -> shirabe-php-shim stream_set_blocking (stream.rs todo!(), requires fcntl(2)) before \
- the missing-lockfile LogicException can be thrown"]
+#[serial]
fn test_exception_thrown_if_no_lockfile_found() {
- todo!()
+ let tear_down = init_temp_composer(Some(&serde_json::json!({})), None, None, false);
+
+ let mut app_tester = get_application_tester();
+ let err = app_tester
+ .run(
+ vec![(
+ PhpMixed::from("command"),
+ PhpMixed::from("check-platform-reqs"),
+ )],
+ RunOptions::default(),
+ )
+ .expect_err("expected LogicException for missing lockfile");
+ assert!(
+ err.to_string()
+ .contains("No lockfile found. Unable to read locked packages"),
+ "got: {}",
+ err
+ );
+
+ drop(tear_down);
}
#[test]
-#[ignore = "needs create_installed_json / create_composer_lock helpers (InstalledFilesystemRepository \
- / Locker::set_lock_data), and require_composer -> Factory reaches ProcessExecutor (git) \
- -> shirabe-php-shim stream_set_blocking (stream.rs todo!(), requires fcntl(2))"]
+#[serial]
+#[ignore = "src porting bug: check_platform_reqs_command.rs:288-294 wraps the existing \
+ InstalledRepository inside a SECOND InstalledRepository (instead of PHP line 89 \
+ `$installedRepo->addRepository(new PlatformRepository(...))`), tripping the \
+ add_repository assertion at installed_repository.rs:367 (\"An InstalledRepository can \
+ not contain a repository of type installed repo ...\"). Cannot fix from test files."]
fn test_failed_platform_requirement() {
- todo!()
+ let tear_down = init_temp_composer(
+ Some(&serde_json::json!({
+ "require": { "ext-foobar": "^0.3" },
+ "require-dev": { "ext-barbaz": "^2.3" },
+ })),
+ None,
+ None,
+ false,
+ );
+
+ let packages: Vec<PackageInterfaceHandle> =
+ vec![get_complete_package("ext-foobar", "2.3.4").into()];
+ let dev_packages: Vec<PackageInterfaceHandle> =
+ vec![get_complete_package("ext-barbaz", "2.3.4.5").into()];
+
+ create_installed_json(&packages, &dev_packages, true);
+
+ create_composer_lock(&packages, &dev_packages);
+
+ let mut app_tester = get_application_tester();
+ app_tester
+ .run(
+ vec![
+ (
+ PhpMixed::from("command"),
+ PhpMixed::from("check-platform-reqs"),
+ ),
+ (PhpMixed::from("--format"), PhpMixed::from("json")),
+ ],
+ RunOptions::default(),
+ )
+ .unwrap();
+
+ let expected = r#"Checking platform requirements for packages in the vendor dir
+[
+ {
+ "name": "ext-barbaz",
+ "version": "2.3.4.5",
+ "status": "success",
+ "failed_requirement": null,
+ "provider": null
+ },
+ {
+ "name": "ext-foobar",
+ "version": "2.3.4",
+ "status": "failed",
+ "failed_requirement": {
+ "source": "__root__",
+ "type": "requires",
+ "target": "ext-foobar",
+ "constraint": "^0.3"
+ },
+ "provider": null
+ }
+]"#;
+
+ assert_eq!(expected.trim(), app_tester.get_display().trim());
+
+ drop(tear_down);
}