//! SSE 增量解析器的集成测试。 //! Integration tests for the incremental SSE parser. use focus_transport::sse::{SseEvent, SseParser}; fn collect(parser: &mut SseParser) -> Vec { 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, ""); }