mirror of
https://github.com/coralogix/cx-cli.git
synced 2026-09-14 16:15:45 +08:00
259 lines
5.5 KiB
Rust
259 lines
5.5 KiB
Rust
use assert_cmd::Command;
|
|
use std::sync::atomic::{AtomicU32, Ordering};
|
|
|
|
static COUNTER: AtomicU32 = AtomicU32::new(0);
|
|
|
|
fn temp_home() -> std::path::PathBuf {
|
|
let id = COUNTER.fetch_add(1, Ordering::SeqCst);
|
|
let dir = std::env::temp_dir().join(format!("cx_wgate_test_{}_{id}", std::process::id()));
|
|
let _ = std::fs::remove_dir_all(&dir);
|
|
std::fs::create_dir_all(&dir).unwrap();
|
|
dir
|
|
}
|
|
|
|
fn cx_agent(args: &[&str]) -> (bool, String) {
|
|
let mut cmd = Command::cargo_bin("cx").expect("cx binary should build");
|
|
cmd.env("CX_HOME", temp_home());
|
|
cmd.env("CX_AGENT_MODE", "1");
|
|
cmd.env_remove("CLAUDECODE");
|
|
cmd.env_remove("CLAUDE_CODE");
|
|
cmd.args(["--api-key", "fake", "--region", "us1"]);
|
|
cmd.args(args);
|
|
let output = cmd.output().expect("failed to run cx");
|
|
let stderr = String::from_utf8_lossy(&output.stderr).to_string();
|
|
(!output.status.success(), stderr)
|
|
}
|
|
|
|
fn assert_gated(args: &[&str], label: &str) {
|
|
let (failed, stderr) = cx_agent(args);
|
|
assert!(
|
|
failed && stderr.contains("requires user confirmation"),
|
|
"{label}: expected confirmation gate, stderr: {stderr}"
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn iam_api_keys_delete() {
|
|
assert_gated(
|
|
&["iam", "api-keys", "delete", "nonexistent"],
|
|
"iam api-keys delete",
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn iam_roles_delete() {
|
|
assert_gated(
|
|
&["iam", "roles", "delete", "nonexistent"],
|
|
"iam roles delete",
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn iam_scopes_delete() {
|
|
assert_gated(
|
|
&["iam", "scopes", "delete", "nonexistent"],
|
|
"iam scopes delete",
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn iam_users_set_status() {
|
|
assert_gated(
|
|
&[
|
|
"iam",
|
|
"users",
|
|
"set-status",
|
|
"--user-ids",
|
|
"nonexistent",
|
|
"--status",
|
|
"active",
|
|
],
|
|
"iam users set-status",
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn iam_team_groups_delete() {
|
|
assert_gated(
|
|
&["iam", "groups", "delete", "nonexistent"],
|
|
"iam groups delete",
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn iam_ip_access_delete() {
|
|
assert_gated(&["iam", "ip-access", "delete"], "iam ip-access delete");
|
|
}
|
|
|
|
#[test]
|
|
fn archive_metrics_enable() {
|
|
assert_gated(&["archive", "metrics", "enable"], "archive metrics enable");
|
|
}
|
|
|
|
#[test]
|
|
fn archive_logs_set() {
|
|
assert_gated(
|
|
&["archive", "logs", "set", "--from-file", "/dev/null"],
|
|
"archive logs set",
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn dashboards_create() {
|
|
assert_gated(
|
|
&["dashboards", "create", "--from-file", "/dev/null"],
|
|
"dashboards create",
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn alerts_create() {
|
|
assert_gated(
|
|
&["alerts", "create", "--from-file", "/dev/null"],
|
|
"alerts create",
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn alerts_suppression_rules_delete() {
|
|
assert_gated(
|
|
&["alerts", "suppression-rules", "delete", "nonexistent"],
|
|
"alerts suppression-rules delete",
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn notifications_connectors_delete() {
|
|
assert_gated(
|
|
&["notifications", "connectors", "delete", "nonexistent"],
|
|
"notifications connectors delete",
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn notifications_routers_delete() {
|
|
assert_gated(
|
|
&["notifications", "routers", "delete", "nonexistent"],
|
|
"notifications routers delete",
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn notifications_presets_delete() {
|
|
assert_gated(
|
|
&["notifications", "presets", "delete", "nonexistent"],
|
|
"notifications presets delete",
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn tco_delete() {
|
|
assert_gated(&["tco", "delete", "nonexistent"], "tco delete");
|
|
}
|
|
|
|
#[test]
|
|
fn retentions_update() {
|
|
assert_gated(
|
|
&["retentions", "update", "--from-file", "/dev/null"],
|
|
"retentions update",
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn e2m_delete() {
|
|
assert_gated(&["e2m", "delete", "nonexistent"], "e2m delete");
|
|
}
|
|
|
|
#[test]
|
|
fn recording_rules_delete() {
|
|
assert_gated(
|
|
&["recording-rules", "delete", "nonexistent"],
|
|
"recording-rules delete",
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn parsing_rules_delete() {
|
|
assert_gated(
|
|
&["parsing-rules", "delete", "nonexistent"],
|
|
"parsing-rules delete",
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn enrichments_add() {
|
|
assert_gated(
|
|
&["enrichments", "add", "--from-file", "/dev/null"],
|
|
"enrichments add",
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn enrichments_custom_delete() {
|
|
assert_gated(
|
|
&["enrichments", "custom", "delete", "nonexistent"],
|
|
"enrichments custom delete",
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn integrations_delete() {
|
|
assert_gated(
|
|
&["integrations", "delete", "nonexistent"],
|
|
"integrations delete",
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn integrations_extensions_deploy() {
|
|
assert_gated(
|
|
&[
|
|
"integrations",
|
|
"extensions",
|
|
"deploy",
|
|
"--from-file",
|
|
"/dev/null",
|
|
],
|
|
"integrations extensions deploy",
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn integrations_contextual_data_delete() {
|
|
assert_gated(
|
|
&["integrations", "contextual-data", "delete", "nonexistent"],
|
|
"integrations contextual-data delete",
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn webhooks_delete() {
|
|
assert_gated(&["webhooks", "delete", "nonexistent"], "webhooks delete");
|
|
}
|
|
|
|
#[test]
|
|
fn webhooks_actions_delete() {
|
|
assert_gated(
|
|
&["webhooks", "actions", "delete", "nonexistent"],
|
|
"webhooks actions delete",
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn views_delete() {
|
|
assert_gated(&["views", "delete", "nonexistent"], "views delete");
|
|
}
|
|
|
|
#[test]
|
|
fn views_folders_delete() {
|
|
assert_gated(
|
|
&["views", "folders", "delete", "nonexistent"],
|
|
"views folders delete",
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn slos_delete() {
|
|
assert_gated(&["slos", "delete", "nonexistent"], "slos delete");
|
|
}
|