use std::io::{Read, Write};
use std::net::TcpListener;
use std::path::{Path, PathBuf};
use std::process::{Command, Output, Stdio};
fn bin() -> PathBuf {
PathBuf::from(env!("CARGO_BIN_EXE_supercode"))
}
fn fresh_home(tag: &str) -> PathBuf {
let nanos = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_nanos();
let dir = std::env::temp_dir().join(format!(
"supercode-ux38-quiet-{tag}-{}-{nanos}",
std::process::id()
));
std::fs::create_dir_all(&dir).unwrap();
dir
}
fn spawn_sse_stub() -> (std::net::SocketAddr, std::thread::JoinHandle<()>) {
let listener = TcpListener::bind("127.0.0.1:0").expect("bind stub listener");
let addr = listener.local_addr().unwrap();
let handle = std::thread::spawn(move || {
let (mut sock, _) = listener.accept().expect("accept one connection");
let mut buf = [0u8; 4096];
let _ = sock.read(&mut buf);
let sse = "data: {\"choices\":[{\"delta\":{\"content\":\"hel\"}}]}\n\n\
data: {\"choices\":[{\"delta\":{\"content\":\"lo there\"}}]}\n\n\
data: [DONE]\n\n";
let resp = format!(
"HTTP/1.1 200 OK\r\nContent-Type: text/event-stream\r\nContent-Length: {}\r\nConnection: close\r\n\r\n{}",
sse.len(),
sse
);
sock.write_all(resp.as_bytes())
.expect("write stub response");
sock.flush().ok();
});
(addr, handle)
}
fn run_piped(home: &Path, base_url: &str, extra: &[&str], quiet_env: bool) -> Output {
let mut args = vec!["--api-key", "x", "--base-url", base_url];
args.extend_from_slice(extra);
let mut cmd = Command::new(bin());
cmd.env("SUPERCODE_HOME", home)
.env_remove("OPENROUTER_API_KEY")
.env_remove("OPENAI_API_KEY")
.env_remove("ANTHROPIC_API_KEY")
.env_remove("NO_COLOR");
if quiet_env {
cmd.env("SUPERCODE_QUIET", "1");
} else {
cmd.env_remove("SUPERCODE_QUIET");
}
cmd.args(&args)
.stdin(Stdio::null())
.stdout(Stdio::piped())
.stderr(Stdio::piped())
.spawn()
.expect("failed to spawn the supercode binary")
.wait_with_output()
.expect("child process failed")
}
const BANNER_MARKER: &str = "workspace-write / never";
#[test]
fn non_quiet_run_shows_the_safety_banner_and_the_reply() {
let (addr, server) = spawn_sse_stub();
let home = fresh_home("chrome-on");
let out = run_piped(&home, &format!("http://{addr}"), &["run", "say hi"], false);
assert!(
out.status.success(),
"run failed: status={:?} stdout={} stderr={}",
out.status,
String::from_utf8_lossy(&out.stdout),
String::from_utf8_lossy(&out.stderr)
);
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(
stderr.contains(BANNER_MARKER),
"expected the safety banner on stderr without --quiet, got: {stderr}"
);
assert!(
String::from_utf8_lossy(&out.stdout).contains("hello there"),
"expected the streamed reply on stdout, got: {}",
String::from_utf8_lossy(&out.stdout)
);
server.join().expect("stub server thread panicked");
}
#[test]
fn quiet_flag_suppresses_the_banner_but_keeps_the_reply() {
let (addr, server) = spawn_sse_stub();
let home = fresh_home("chrome-off-flag");
let out = run_piped(
&home,
&format!("http://{addr}"),
&["--quiet", "run", "say hi"],
false,
);
assert!(
out.status.success(),
"run --quiet failed: status={:?} stdout={} stderr={}",
out.status,
String::from_utf8_lossy(&out.stdout),
String::from_utf8_lossy(&out.stderr)
);
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(
!stderr.contains(BANNER_MARKER),
"--quiet must suppress the safety banner, got stderr: {stderr}"
);
let stdout = String::from_utf8_lossy(&out.stdout);
assert!(
stdout.contains("hello there"),
"the actual result must never be suppressed by --quiet, got stdout: {stdout}"
);
server.join().expect("stub server thread panicked");
}
#[test]
fn supercode_quiet_env_var_has_the_same_effect_as_the_flag() {
let (addr, server) = spawn_sse_stub();
let home = fresh_home("chrome-off-env");
let out = run_piped(&home, &format!("http://{addr}"), &["run", "say hi"], true);
assert!(
out.status.success(),
"SUPERCODE_QUIET=1 run failed: status={:?} stdout={} stderr={}",
out.status,
String::from_utf8_lossy(&out.stdout),
String::from_utf8_lossy(&out.stderr)
);
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(
!stderr.contains(BANNER_MARKER),
"SUPERCODE_QUIET=1 must suppress the safety banner exactly like --quiet, got stderr: {stderr}"
);
assert!(
String::from_utf8_lossy(&out.stdout).contains("hello there"),
"the actual result must never be suppressed by SUPERCODE_QUIET, got stdout: {}",
String::from_utf8_lossy(&out.stdout)
);
server.join().expect("stub server thread panicked");
}
#[test]
fn quiet_does_not_swallow_errors() {
let home = fresh_home("quiet-errors");
let missing = home.join("does-not-exist.jsonl");
let out = Command::new(bin())
.env("SUPERCODE_HOME", &home)
.env("OPENROUTER_API_KEY", "x")
.env_remove("SUPERCODE_QUIET")
.env_remove("NO_COLOR")
.args(["--quiet", "resume", missing.to_str().unwrap()])
.stdin(Stdio::null())
.stdout(Stdio::piped())
.stderr(Stdio::piped())
.output()
.expect("failed to spawn the supercode binary");
assert!(
!out.status.success(),
"resuming a missing session must fail even under --quiet"
);
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(
!stderr.trim().is_empty(),
"the genuine error must still be printed to stderr under --quiet"
);
assert!(
!stderr.contains(BANNER_MARKER),
"an error run under --quiet must still suppress the (irrelevant, pre-error) banner if it \
were ever reached, got stderr: {stderr}"
);
}