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 {
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(())
}