use mcp_execution_core::cli::ServerConnectionString;
#[test]
#[allow(clippy::similar_names)]
fn test_zero_width_unicode_rejected() {
let zwj = "server\u{200D}malicious";
assert!(
ServerConnectionString::new(zwj).is_err(),
"Zero-width joiner should be rejected"
);
let zws = "server\u{200B}malicious";
assert!(
ServerConnectionString::new(zws).is_err(),
"Zero-width space should be rejected"
);
let zwnj = "server\u{200C}evil";
assert!(
ServerConnectionString::new(zwnj).is_err(),
"Zero-width non-joiner should be rejected"
);
}
#[test]
fn test_bidi_override_rejected() {
let bidi = "server\u{202E}evil";
assert!(
ServerConnectionString::new(bidi).is_err(),
"Bidi override should be rejected"
);
}
#[test]
fn test_url_encoding_rejected() {
let url_encoded = "server%26%26rm";
assert!(
ServerConnectionString::new(url_encoded).is_err(),
"URL encoded characters should be rejected"
);
let slash = "server%2Fetc%2Fpasswd";
assert!(
ServerConnectionString::new(slash).is_err(),
"URL encoded slashes should be rejected"
);
}
#[test]
fn test_escape_sequences_rejected() {
let hex = "server\\x26\\x26";
assert!(
ServerConnectionString::new(hex).is_err(),
"Hex escapes should be rejected"
);
let octal = "server\\046\\046";
assert!(
ServerConnectionString::new(octal).is_err(),
"Octal escapes should be rejected"
);
}
#[test]
fn test_length_boundaries() {
let len_255 = "a".repeat(255);
assert!(
ServerConnectionString::new(&len_255).is_ok(),
"255 characters should be allowed"
);
let len_256 = "a".repeat(256);
assert!(
ServerConnectionString::new(&len_256).is_ok(),
"256 characters should be allowed"
);
let len_257 = "a".repeat(257);
assert!(
ServerConnectionString::new(&len_257).is_err(),
"257 characters should be rejected"
);
}
#[test]
fn test_all_control_chars_rejected() {
let controls = vec![
("\x00", "null"),
("\x01", "SOH"),
("\x07", "bell"),
("\x08", "backspace"),
("\x09", "tab"),
("\x0A", "LF"),
("\x0D", "CR"),
("\x1B", "escape"),
("\x7F", "delete"),
];
for (control, name) in controls {
let input = format!("server{control}");
assert!(
ServerConnectionString::new(&input).is_err(),
"Control character {name} should be rejected"
);
}
}
#[test]
fn test_space_handling() {
let with_spaces = " server ";
let result = ServerConnectionString::new(with_spaces).unwrap();
assert_eq!(result.as_str(), "server");
let only_spaces = " ";
assert!(
ServerConnectionString::new(only_spaces).is_err(),
"Only spaces should be rejected after trimming"
);
}