use std::net::SocketAddr;
use pretty_assertions::assert_eq;
use super::mcp_callback_url;
use super::page_workspace_cwd;
use super::valid_callback_id;
#[test]
fn oauth_callback_id_accepts_only_bound_base64url_identifier() {
assert!(valid_callback_id("Abc_123-xYz9"));
assert!(!valid_callback_id("short"));
assert!(!valid_callback_id("abcdefghijkl%0d%0a"));
assert!(!valid_callback_id("abcdefghijk\n"));
}
#[test]
fn mcp_callback_prefers_tailnet_ipv4() {
let addresses = [
"127.0.0.1:34261"
.parse::<SocketAddr>()
.expect("IPv4 loopback"),
"[fd7a:115c:a1e0::1]:34261"
.parse::<SocketAddr>()
.expect("tailnet IPv6"),
"100.71.13.123:34261"
.parse::<SocketAddr>()
.expect("tailnet IPv4"),
];
assert_eq!(
mcp_callback_url(&addresses),
Some("http://100.71.13.123:34261/oauth/callback".to_string())
);
}
#[test]
fn mcp_callback_stays_local_without_tailnet() {
let addresses = [
"127.0.0.1:34261"
.parse::<SocketAddr>()
.expect("IPv4 loopback"),
"[::1]:34261".parse::<SocketAddr>().expect("IPv6 loopback"),
];
assert_eq!(mcp_callback_url(&addresses), None);
}
#[test]
fn page_workspace_prefers_the_active_thread_directory() {
let thread = serde_json::json!({ "cwd": "/projects/thread" });
assert_eq!(
page_workspace_cwd(Some(&thread), Some("/projects/selected"), "/daemon"),
"/projects/thread"
);
assert_eq!(
page_workspace_cwd(None, Some("/projects/selected"), "/daemon"),
"/projects/selected"
);
assert_eq!(page_workspace_cwd(None, None, "/daemon"), "/daemon");
}