use std::path::PathBuf;
use std::process::Command;
fn fixtures() -> PathBuf {
PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.join("../harness/tests/fixtures")
.canonicalize()
.unwrap()
}
fn command() -> Command {
let fixtures = fixtures();
let mut command = Command::new(env!("CARGO_BIN_EXE_supercode"));
command
.env("HERMES_HOME", fixtures.join("hermes_home"))
.env("OPENCLAW_STATE_DIR", fixtures.join("openclaw_home"));
command
}
#[test]
fn triggers_list_json_and_table_never_emit_secrets() {
for args in [
vec!["triggers", "list", "--json"],
vec!["triggers", "list"],
vec!["triggers", "list", "--harness", "openclaw"],
] {
let output = command().args(&args).output().unwrap();
assert!(
output.status.success(),
"{}",
String::from_utf8_lossy(&output.stderr)
);
let text = String::from_utf8_lossy(&output.stdout);
for secret in [
"FAKE-WEBHOOK-HMAC-DO-NOT-EMIT",
"FAKE-HOOK-TOKEN-DO-NOT-EMIT",
] {
assert!(!text.contains(secret), "{text}");
}
if args.contains(&"--json") {
let value: serde_json::Value = serde_json::from_str(&text).unwrap();
assert_eq!(value["schema"], "supercode.triggers.v1");
let rows = value["triggers"].as_array().unwrap();
assert!(rows
.iter()
.any(|r| r["name"] == "deploys" && r["harness"] == "hermes"));
assert!(rows
.iter()
.any(|r| r["name"] == "gmail" && r["harness"] == "openclaw"));
} else {
assert!(text.contains("deploys") || text.contains("gmail"), "{text}");
}
}
}
#[test]
fn a_core_harness_is_refused_not_emptied() {
let output = command()
.args(["triggers", "list", "--harness", "claude-code"])
.output()
.unwrap();
assert!(!output.status.success());
assert!(String::from_utf8_lossy(&output.stderr).contains("triggers.list"));
}