use std::io::Cursor;
use super::{
ParsedUrl, base64_decode, base64_encode, parse_url, read_request, read_sse_event,
websocket_accept_value,
};
#[test]
fn parse_url_matrix_matches_transport_call_sites() {
assert_eq!(
parse_url("http://host:8080/sim/frame", "http", "/sim/frame").unwrap(),
ParsedUrl {
scheme: "http".to_owned(),
host: "host".to_owned(),
port: 8080,
path: "/sim/frame".to_owned(),
}
);
assert_eq!(
parse_url("http://host", "http", "/sim/frame").unwrap(),
ParsedUrl {
scheme: "http".to_owned(),
host: "host".to_owned(),
port: 80,
path: "/sim/frame".to_owned(),
}
);
assert_eq!(
parse_url("https://host:8443/v1/chat", "https", "/sim/frame").unwrap(),
ParsedUrl {
scheme: "https".to_owned(),
host: "host".to_owned(),
port: 8443,
path: "/v1/chat".to_owned(),
}
);
assert_eq!(
parse_url("ws://host", "ws", "/sim/ws").unwrap(),
ParsedUrl {
scheme: "ws".to_owned(),
host: "host".to_owned(),
port: 80,
path: "/sim/ws".to_owned(),
}
);
assert_eq!(
parse_url("ws://host:9001/sim/ws", "ws", "/sim/ws").unwrap(),
ParsedUrl {
scheme: "ws".to_owned(),
host: "host".to_owned(),
port: 9001,
path: "/sim/ws".to_owned(),
}
);
assert_eq!(
parse_url("http://host/a/b/", "http", "/sim/frame")
.unwrap()
.path,
"/a/b/"
);
assert!(parse_url("http://host/x", "ws", "/sim/ws").is_err());
}
#[test]
fn base64_round_trips() {
let encoded = base64_encode(b"hello");
assert_eq!(base64_decode(&encoded).unwrap(), b"hello");
}
#[test]
fn sse_single_data_event_is_unchanged() {
let input = "event: chunk\r\ndata: payload\r\n\r\n";
let mut reader = Cursor::new(input.as_bytes());
let event = read_sse_event(&mut reader).unwrap().unwrap();
assert_eq!(event, ("chunk".to_owned(), "payload".to_owned()));
}
#[test]
fn sse_folds_multiple_data_lines() {
let input = "event: message\r\ndata: one\r\ndata: two\r\n\r\n";
let mut reader = Cursor::new(input.as_bytes());
let event = read_sse_event(&mut reader).unwrap().unwrap();
assert_eq!(event, ("message".to_owned(), "one\ntwo".to_owned()));
}
#[test]
fn sse_round_trips_transport_end_event() {
let input = "event: end\r\ndata: \r\n\r\n";
let mut reader = Cursor::new(input.as_bytes());
let event = read_sse_event(&mut reader).unwrap().unwrap();
assert_eq!(event, ("end".to_owned(), String::new()));
}
#[test]
fn sse_eof_without_record_is_none() {
let mut reader = Cursor::new(b"".as_slice());
assert!(read_sse_event(&mut reader).unwrap().is_none());
}
#[test]
fn websocket_accept_matches_reference() {
let accept = websocket_accept_value("dGhlIHNhbXBsZSBub25jZQ==");
assert_eq!(accept, "s3pPLMBiTxaQ9kYGzzhZRbK+xOo=");
}
#[test]
fn oversized_content_length_is_rejected_before_body_allocation() {
let input = format!(
"POST /sim/frame HTTP/1.1\r\nContent-Length: {}\r\n\r\n",
usize::MAX
);
let err = read_request(&mut Cursor::new(input.into_bytes())).unwrap_err();
assert!(format!("{err}").contains("content-length exceeds"));
}