| package stream |
|
|
| import ( |
| "context" |
| "strings" |
| "testing" |
|
|
| "ds2api/internal/sse" |
| ) |
|
|
| func TestConsumeSSEPrefersContextCancellationOverReadyParsedLines(t *testing.T) { |
| ctx, cancel := context.WithCancel(context.Background()) |
| cancel() |
|
|
| var finalized bool |
| var contextDone bool |
| var parsedCalled bool |
|
|
| ConsumeSSE(ConsumeConfig{ |
| Context: ctx, |
| Body: strings.NewReader("data: {\"p\":\"response/content\",\"v\":\"hello\"}\n\ndata: [DONE]\n"), |
| ThinkingEnabled: false, |
| InitialType: "text", |
| KeepAliveInterval: 0, |
| }, ConsumeHooks{ |
| OnParsed: func(_ sse.LineResult) ParsedDecision { |
| parsedCalled = true |
| return ParsedDecision{} |
| }, |
| OnFinalize: func(_ StopReason, _ error) { |
| finalized = true |
| }, |
| OnContextDone: func() { |
| contextDone = true |
| }, |
| }) |
|
|
| if !contextDone { |
| t.Fatal("expected OnContextDone to run for an already-cancelled context") |
| } |
| if finalized { |
| t.Fatal("expected OnFinalize not to run after context cancellation wins") |
| } |
| if parsedCalled { |
| t.Fatal("expected parsed lines not to be processed after context cancellation wins") |
| } |
| } |
|
|