From 820ebf7760c9b468eb47c44fab680b08005eb43d Mon Sep 17 00:00:00 2001 From: overtrue Date: Sun, 16 Aug 2026 05:16:16 +0800 Subject: [PATCH] test(ilm): cover invalid lifecycle rule import --- crates/cli/src/commands/ilm/rule.rs | 40 +++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/crates/cli/src/commands/ilm/rule.rs b/crates/cli/src/commands/ilm/rule.rs index 38872be..2a0e292 100644 --- a/crates/cli/src/commands/ilm/rule.rs +++ b/crates/cli/src/commands/ilm/rule.rs @@ -1022,6 +1022,46 @@ mod tests { assert!(validate_expired_delete_marker_inputs(true, false, false).is_ok()); } + #[tokio::test] + async fn test_execute_import_rejects_invalid_marker_cleanup_before_alias_lookup() { + let temp_dir = tempfile::tempdir().expect("create lifecycle config directory"); + let config_path = temp_dir.path().join("rules.json"); + let config = LifecycleConfiguration { + rules: vec![LifecycleRule { + id: "invalid-marker-cleanup".to_string(), + status: LifecycleRuleStatus::Enabled, + prefix: None, + tags: None, + expiration: Some(LifecycleExpiration { + days: Some(30), + date: None, + }), + transition: None, + noncurrent_version_expiration: None, + noncurrent_version_transition: None, + abort_incomplete_multipart_upload_days: None, + expired_object_delete_marker: Some(true), + }], + }; + std::fs::write( + &config_path, + serde_json::to_string(&config).expect("serialize lifecycle configuration"), + ) + .expect("write lifecycle configuration"); + + let code = execute_import( + ImportRuleArgs { + path: "missing-alias/my-bucket".to_string(), + file: config_path.to_string_lossy().into_owned(), + force: false, + }, + OutputConfig::default(), + ) + .await; + + assert_eq!(code, ExitCode::UsageError); + } + #[tokio::test] async fn test_execute_remove_no_id_or_all_returns_usage_error() { let args = RemoveRuleArgs {