executeSSESequence handles SSE streaming sequences
(ctx context.Context, t *testing.T, scenario Scenario)
| 311 | |
| 312 | // executeSSESequence handles SSE streaming sequences |
| 313 | func (e *executor) executeSSESequence(ctx context.Context, t *testing.T, scenario Scenario) { |
| 314 | t.Helper() |
| 315 | |
| 316 | // SSE only supports server-to-client streaming |
| 317 | require.True(t, scenario.Request.Params != nil || scenario.Request.ID != nil, "SSE requires an initial request") |
| 318 | |
| 319 | client, err := harness.NewClient(e.serverURL, nil) |
| 320 | require.NoError(t, err, "Failed to create client") |
| 321 | |
| 322 | // Send request and get SSE events |
| 323 | method := scenario.Request.GetMethod(scenario.Method) |
| 324 | req := harness.JSONRPCRequest{ |
| 325 | Method: method, |
| 326 | Params: scenario.Request.Params, |
| 327 | ID: scenario.Request.ID, |
| 328 | } |
| 329 | // Handle JSONRPC field: |
| 330 | // - Not specified (empty string) → Use default "2.0" |
| 331 | // - "-" → Omit the field entirely |
| 332 | // - Any other value → Use that value |
| 333 | if scenario.Request.JSONRPC == "-" { |
| 334 | // Special value to omit the field |
| 335 | emptyStr := "" |
| 336 | req.JSONRPC = &emptyStr |
| 337 | } else if scenario.Request.JSONRPC != "" { |
| 338 | // Custom value specified |
| 339 | req.JSONRPC = &scenario.Request.JSONRPC |
| 340 | } |
| 341 | // If JSONRPC is empty string (not specified), req.JSONRPC remains nil and defaults to "2.0" |
| 342 | events, err := client.CallSSE(ctx, req) |
| 343 | require.NoError(t, err, "SSE request failed") |
| 344 | |
| 345 | // Validate sequence |
| 346 | require.Len(t, events, len(scenario.Sequence), "Event count mismatch") |
| 347 | |
| 348 | for i, step := range scenario.Sequence { |
| 349 | require.Equalf(t, "receive", step.Type, "SSE only supports 'receive' steps, got %s", step.Type) |
| 350 | |
| 351 | require.Lessf(t, i, len(events), "Expected event at step %d, but no more events", i) |
| 352 | |
| 353 | // Parse and validate the event |
| 354 | var response map[string]any |
| 355 | err := json.Unmarshal(events[i], &response) |
| 356 | require.NoErrorf(t, err, "Failed to unmarshal event %d", i) |
| 357 | |
| 358 | // For SSE streaming, step.Expect contains the full expected JSON-RPC message |
| 359 | expectedMsg, ok := step.Expect.(map[string]any) |
| 360 | require.True(t, ok, "Step %d: invalid expect format", i) |
| 361 | |
| 362 | // Compare the messages |
| 363 | e.compareJSONRPCMessages(t, response, expectedMsg) |
| 364 | } |
| 365 | } |
| 366 | |
| 367 | // executeBatch handles batch request scenarios |
| 368 | func (e *executor) executeBatch(t *testing.T, scenario Scenario) { |
no test coverage detected