use super::{Cli, Command};
use clap::Parser;
#[test]
fn serve_bare_sets_no_transport_flag() {
let cli = Cli::try_parse_from(["trusty-memory", "serve"]).expect("parse ok");
let Command::Serve {
http,
stdio,
foreground,
..
} = cli.command
else {
panic!("expected Serve");
};
assert!(http.is_none(), "bare serve: http must be None");
assert!(!stdio, "bare serve: stdio must be false");
assert!(!foreground, "bare serve: foreground must be false");
}
#[test]
fn serve_http_bare_parses_as_some_none() {
let cli = Cli::try_parse_from(["trusty-memory", "serve", "--http"]).expect("--http bare ok");
let Command::Serve { http, stdio, .. } = cli.command else {
panic!("expected Serve");
};
assert_eq!(http, Some(None), "--http (bare) must parse as Some(None)");
assert!(!stdio, "--http bare: stdio must be false");
assert!(
http.flatten().is_none(),
"--http bare flattened must be None (dynamic port)"
);
}
#[test]
fn serve_http_with_addr_parses_as_some_some() {
let cli = Cli::try_parse_from(["trusty-memory", "serve", "--http", "127.0.0.1:7070"])
.expect("--http ADDR ok");
let Command::Serve { http, .. } = cli.command else {
panic!("expected Serve");
};
let addr: std::net::SocketAddr = "127.0.0.1:7070".parse().unwrap();
assert_eq!(
http,
Some(Some(addr)),
"--http ADDR must parse as Some(Some(addr))"
);
assert_eq!(
http.flatten(),
Some(addr),
"--http ADDR flattened must return the address"
);
}
#[test]
fn serve_http_and_stdio_together_is_error() {
let result = Cli::try_parse_from(["trusty-memory", "serve", "--http", "--stdio"]);
assert!(
result.is_err(),
"--http and --stdio together must be rejected by clap"
);
}
use super::{serve_mode, ServeMode};
fn mode_of(args: &[&str]) -> ServeMode {
let cli = Cli::try_parse_from(args).expect("parse ok");
let Command::Serve {
http,
stdio,
foreground,
..
} = cli.command
else {
panic!("expected Serve");
};
serve_mode(&http, foreground, stdio)
}
#[test]
fn serve_mode_bare_is_stdio() {
assert_eq!(
mode_of(&["trusty-memory", "serve"]),
ServeMode::Stdio { notify: true },
"bare `serve` must speak MCP stdio (#5267)"
);
}
#[test]
fn serve_mode_explicit_stdio() {
assert_eq!(
mode_of(&["trusty-memory", "serve", "--stdio"]),
ServeMode::Stdio { notify: false },
"`serve --stdio` must stay stdio and stay silent"
);
}
#[test]
fn serve_mode_daemon_bare() {
assert_eq!(
mode_of(&["trusty-memory", "serve", "--http"]),
ServeMode::Daemon
);
}
#[test]
fn serve_mode_daemon_addr() {
assert_eq!(
mode_of(&["trusty-memory", "serve", "--http", "127.0.0.1:7070"]),
ServeMode::Daemon
);
}
#[test]
fn serve_mode_foreground_is_daemon() {
assert_eq!(
mode_of(&["trusty-memory", "serve", "--foreground"]),
ServeMode::Daemon,
"`serve --foreground` is the launchd/`start` daemon path"
);
}
#[test]
fn serve_mode_palace_only_is_stdio() {
assert_eq!(
mode_of(&["trusty-memory", "serve", "--palace", "demo"]),
ServeMode::Stdio { notify: true }
);
}
#[test]
fn serve_rejects_unknown_flag() {
assert!(
Cli::try_parse_from(["trusty-memory", "serve", "--not-a-real-flag"]).is_err(),
"unknown flags must still be rejected"
);
}
#[test]
fn serve_foreground_conflicts_with_stdio() {
assert!(
Cli::try_parse_from(["trusty-memory", "serve", "--foreground", "--stdio"]).is_err(),
"--foreground and --stdio must remain mutually exclusive"
);
}