liminal-cli 0.3.2

The liminal command: serve the network, maintain its stores, or serve its discovery MCP over stdio
Documentation
use std::net::TcpListener;

use super::{Subscription, is_websocket};

type TestResult = Result<(), Box<dyn std::error::Error>>;

#[test]
fn only_a_ws_or_wss_address_names_the_websocket_door() {
    for (address, door) in [
        ("ws://127.0.0.1:7602/ws", true),
        ("wss://liminal.ablative.com.au/ws", true),
        ("127.0.0.1:7600", false),
        ("liminal.ablative.com.au:7600", false),
        ("https://liminal.ablative.com.au/ws", false),
        ("WSS://upper.example/ws", false),
    ] {
        assert_eq!(is_websocket(address), door, "{address}");
    }
}

#[test]
fn a_refused_websocket_door_is_never_retried_on_the_raw_wire() -> TestResult {
    // A raw listener that never speaks WebSocket: a fallback to the raw wire
    // would subscribe here; the door refuses its handshake instead.
    let listener = TcpListener::bind("127.0.0.1:0")?;
    let port = listener.local_addr()?.port();
    let raw = std::thread::spawn(move || listener.accept().map(|(socket, _)| drop(socket)));
    let refused = Subscription::open(&format!("ws://127.0.0.1:{port}/ws"), "c", b"");
    let Err(error) = refused else {
        return Err("a raw listener accepted a websocket subscription".into());
    };
    assert!(error.to_string().contains("websocket"), "{error}");
    raw.join().map_err(|_| "the raw listener panicked")??;
    Ok(())
}