typeduck-codex-web 0.4.0

A standalone browser interface and Codex runtime
Documentation
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");
}