102 lines
2.5 KiB
Rust
102 lines
2.5 KiB
Rust
//! SSE 增量解析器的集成测试。
|
|
//! Integration tests for the incremental SSE parser.
|
|
|
|
use focus_transport::sse::{SseEvent, SseParser};
|
|
|
|
fn collect(parser: &mut SseParser) -> Vec<SseEvent> {
|
|
let mut out = Vec::new();
|
|
while let Some(e) = parser.next_event() {
|
|
out.push(e);
|
|
}
|
|
out
|
|
}
|
|
|
|
#[test]
|
|
fn parses_single_event() {
|
|
let mut p = SseParser::new();
|
|
p.feed_str("data: hello\n\n");
|
|
let events = collect(&mut p);
|
|
assert_eq!(events.len(), 1);
|
|
assert_eq!(events[0].data, "hello");
|
|
assert_eq!(events[0].event, "message");
|
|
}
|
|
|
|
#[test]
|
|
fn parses_event_with_type() {
|
|
let mut p = SseParser::new();
|
|
p.feed_str("event: ping\ndata: 1\n\n");
|
|
let events = collect(&mut p);
|
|
assert_eq!(events[0].event, "ping");
|
|
assert_eq!(events[0].data, "1");
|
|
}
|
|
|
|
#[test]
|
|
fn joins_multiline_data() {
|
|
let mut p = SseParser::new();
|
|
p.feed_str("data: line1\ndata: line2\n\n");
|
|
let events = collect(&mut p);
|
|
assert_eq!(events[0].data, "line1\nline2");
|
|
}
|
|
|
|
#[test]
|
|
fn handles_crlf() {
|
|
let mut p = SseParser::new();
|
|
p.feed_str("data: hi\r\n\r\n");
|
|
let events = collect(&mut p);
|
|
assert_eq!(events[0].data, "hi");
|
|
}
|
|
|
|
#[test]
|
|
fn ignores_comments_and_unknown_fields() {
|
|
let mut p = SseParser::new();
|
|
p.feed_str(": this is a comment\ndata: ok\nfoo: bar\n\n");
|
|
let events = collect(&mut p);
|
|
assert_eq!(events[0].data, "ok");
|
|
}
|
|
|
|
#[test]
|
|
fn parses_id_and_retry() {
|
|
let mut p = SseParser::new();
|
|
p.feed_str("id: 42\nretry: 5000\ndata: x\n\n");
|
|
let events = collect(&mut p);
|
|
assert_eq!(events[0].id, "42");
|
|
assert_eq!(events[0].retry, Some(5000));
|
|
}
|
|
|
|
#[test]
|
|
fn handles_split_across_chunks() {
|
|
let mut p = SseParser::new();
|
|
p.feed_str("dat");
|
|
assert!(collect(&mut p).is_empty());
|
|
p.feed_str("a: hello\n\n");
|
|
let events = collect(&mut p);
|
|
assert_eq!(events[0].data, "hello");
|
|
}
|
|
|
|
#[test]
|
|
fn handles_split_across_line_boundary() {
|
|
let mut p = SseParser::new();
|
|
p.feed_str("data: first\n\ndata: sec");
|
|
assert_eq!(collect(&mut p).len(), 1);
|
|
p.feed_str("ond\n\n");
|
|
let events = collect(&mut p);
|
|
assert_eq!(events[0].data, "second");
|
|
}
|
|
|
|
#[test]
|
|
fn multiple_events_in_one_chunk() {
|
|
let mut p = SseParser::new();
|
|
p.feed_str("data: a\n\ndata: b\n\ndata: c\n\n");
|
|
let events = collect(&mut p);
|
|
assert_eq!(events.len(), 3);
|
|
assert_eq!(events[2].data, "c");
|
|
}
|
|
|
|
#[test]
|
|
fn empty_data_line() {
|
|
let mut p = SseParser::new();
|
|
p.feed_str("data:\n\n");
|
|
let events = collect(&mut p);
|
|
assert_eq!(events[0].data, "");
|
|
}
|