// // SSEParserTests.swift // Zyquo Atlas // // Author: Simon-Pierre Boucher // Mail: contact@spboucher.ai // import Testing @testable import ZyquoAtlas @Suite struct SSEParserTests { private func parse(_ lines: [String]) -> [SSEEvent] { var parser = SSEParser() var events: [SSEEvent] = [] for line in lines { if let event = parser.consume(line: line) { events.append(event) } } if let last = parser.consume(line: "") { events.append(last) } return events } @Test func openAIStyleDataEvents() { let events = parse([ #"data: {"choices":[{"delta":{"content":"Hel"}}]}"#, "", #"data: {"choices":[{"delta":{"content":"lo"}}]}"#, "", "data: [DONE]", "", ]) #expect(events.count == 3) #expect(events[0].data.contains("Hel")) #expect(events[2].data == "[DONE]") #expect(events[0].event == nil) } @Test func anthropicNamedEvents() { let events = parse([ "event: message_start", #"data: {"type":"message_start","message":{"usage":{"input_tokens":9}}}"#, "", "event: content_block_delta", #"data: {"type":"content_block_delta","delta":{"type":"text_delta","text":"OK"}}"#, "", "event: message_stop", #"data: {"type":"message_stop"}"#, "", ]) #expect(events.count == 3) #expect(events[0].event == "message_start") #expect(events[1].event == "content_block_delta") #expect(events[2].event == "message_stop") } @Test func commentAndKeepAliveLinesIgnored() { let events = parse([ ": keep-alive", "", #"data: {"x":1}"#, "", ": another comment", "", ]) #expect(events.count == 1) #expect(events[0].data == #"{"x":1}"#) } @Test func multiLineDataJoined() { let events = parse([ "data: line1", "data: line2", "", ]) #expect(events.count == 1) #expect(events[0].data == "line1\nline2") } @Test func trailingEventWithoutBlankLineFlushed() { var parser = SSEParser() #expect(parser.consume(line: "data: tail") == nil) let flushed = parser.consume(line: "") #expect(flushed?.data == "tail") } }