@@ -379,8 +379,13 @@ public async Task SendMessageStreamAsync_MapsRequestParamsCorrectly()
379379 } ;
380380
381381 HttpRequestMessage ? capturedRequest = null ;
382- // Simulate a minimal valid SSE response (empty event stream)
383- var sseStream = new MemoryStream ( Encoding . UTF8 . GetBytes ( "event: message\n data: {}\n \n " ) ) ;
382+ // Simulate a minimal valid SSE response
383+ var jsonRpcResponse = JsonSerializer . Serialize ( new JsonRpcResponse
384+ {
385+ Id = "test-id" ,
386+ Result = JsonSerializer . SerializeToNode ( new { } )
387+ } ) ;
388+ var sseStream = new MemoryStream ( Encoding . UTF8 . GetBytes ( $ "event: message\n data: { jsonRpcResponse } \n \n ") ) ;
384389 var response = new HttpResponseMessage ( HttpStatusCode . OK )
385390 {
386391 Content = new StreamContent ( sseStream )
@@ -436,9 +441,12 @@ public async Task SendMessageStreamAsync_MapsResponseCorrectly()
436441 TaskId = "task-456" ,
437442 ContextId = "ctx-789"
438443 } ;
439- var sseEventJson = JsonSerializer . Serialize < A2AEvent > ( expectedMessage , A2AJsonUtilities . DefaultOptions ) ;
440- var sseData = $ "event: message\n data: { sseEventJson } \n \n ";
441- var sseStream = new MemoryStream ( Encoding . UTF8 . GetBytes ( sseData ) ) ;
444+ var jsonRpcResponse = JsonSerializer . Serialize ( new JsonRpcResponse
445+ {
446+ Id = "test-id" ,
447+ Result = JsonSerializer . SerializeToNode < A2AEvent > ( expectedMessage , A2AJsonUtilities . DefaultOptions )
448+ } ) ;
449+ var sseStream = new MemoryStream ( Encoding . UTF8 . GetBytes ( $ "event: message\n data: { jsonRpcResponse } \n \n ") ) ;
442450 var response = new HttpResponseMessage ( HttpStatusCode . OK )
443451 {
444452 Content = new StreamContent ( sseStream )
@@ -477,8 +485,13 @@ public async Task ResubscribeToTaskAsync_MapsRequestParamsCorrectly()
477485 // Arrange
478486 var taskId = "task-123" ;
479487 HttpRequestMessage ? capturedRequest = null ;
480- // Simulate a minimal valid SSE response (empty event stream)
481- var sseStream = new MemoryStream ( Encoding . UTF8 . GetBytes ( "event: message\n data: {}\n \n " ) ) ;
488+ // Simulate a minimal valid SSE response
489+ var jsonRpcResponse = JsonSerializer . Serialize ( new JsonRpcResponse
490+ {
491+ Id = "test-id" ,
492+ Result = JsonSerializer . SerializeToNode ( new { } )
493+ } ) ;
494+ var sseStream = new MemoryStream ( Encoding . UTF8 . GetBytes ( $ "event: message\n data: { jsonRpcResponse } \n \n ") ) ;
482495 var response = new HttpResponseMessage ( HttpStatusCode . OK )
483496 {
484497 Content = new StreamContent ( sseStream )
@@ -520,9 +533,12 @@ public async Task ResubscribeToTaskAsync_MapsResponseCorrectly()
520533 TaskId = "task-456" ,
521534 ContextId = "ctx-789"
522535 } ;
523- var sseEventJson = JsonSerializer . Serialize < A2AEvent > ( expectedMessage , A2AJsonUtilities . DefaultOptions ) ;
524- var sseData = $ "event: message\n data: { sseEventJson } \n \n ";
525- var sseStream = new MemoryStream ( Encoding . UTF8 . GetBytes ( sseData ) ) ;
536+ var jsonRpcResponse = JsonSerializer . Serialize ( new JsonRpcResponse
537+ {
538+ Id = "test-id" ,
539+ Result = JsonSerializer . SerializeToNode < A2AEvent > ( expectedMessage , A2AJsonUtilities . DefaultOptions )
540+ } ) ;
541+ var sseStream = new MemoryStream ( Encoding . UTF8 . GetBytes ( $ "event: message\n data: { jsonRpcResponse } \n \n ") ) ;
526542 var response = new HttpResponseMessage ( HttpStatusCode . OK )
527543 {
528544 Content = new StreamContent ( sseStream )
@@ -554,6 +570,55 @@ public async Task ResubscribeToTaskAsync_MapsResponseCorrectly()
554570 Assert . Equal ( expectedMessage . ContextId , message . ContextId ) ;
555571 }
556572
573+ [ Fact ]
574+ public async Task SendMessageStreamAsync_ThrowsOnJsonRpcError ( )
575+ {
576+ // Arrange
577+ var jsonRpcErrorResponse = JsonSerializer . Serialize ( JsonRpcResponse . InvalidParamsResponse ( "test-id" ) ) ;
578+ var sseStream = new MemoryStream ( Encoding . UTF8 . GetBytes ( $ "event: message\n data: { jsonRpcErrorResponse } \n \n ") ) ;
579+ var response = new HttpResponseMessage ( HttpStatusCode . OK )
580+ {
581+ Content = new StreamContent ( sseStream )
582+ } ;
583+ response . Content . Headers . ContentType = new System . Net . Http . Headers . MediaTypeHeaderValue ( "text/event-stream" ) ;
584+ var sut = CreateA2AClient ( response ) ;
585+ var sendParams = new MessageSendParams ( ) ;
586+
587+ // Act & Assert
588+ var exception = await Assert . ThrowsAsync < InvalidOperationException > ( async ( ) =>
589+ {
590+ await foreach ( var _ in sut . SendMessageStreamAsync ( sendParams ) )
591+ {
592+ // Should throw before yielding any items
593+ }
594+ } ) ;
595+
596+ Assert . Contains ( "-32602" , exception . Message ) ;
597+ Assert . Contains ( "Invalid parameters" , exception . Message ) ;
598+ }
599+
600+ [ Fact ]
601+ public async Task SendMessageAsync_ThrowsOnJsonRpcError ( )
602+ {
603+ // Arrange
604+ var jsonRpcErrorResponse = JsonSerializer . Serialize ( JsonRpcResponse . MethodNotFoundResponse ( "test-id" ) ) ;
605+ var response = new HttpResponseMessage ( HttpStatusCode . OK )
606+ {
607+ Content = new StringContent ( jsonRpcErrorResponse , Encoding . UTF8 , "application/json" )
608+ } ;
609+ var sut = CreateA2AClient ( response ) ;
610+ var sendParams = new MessageSendParams ( ) ;
611+
612+ // Act & Assert
613+ var exception = await Assert . ThrowsAsync < InvalidOperationException > ( async ( ) =>
614+ {
615+ await sut . SendMessageAsync ( sendParams ) ;
616+ } ) ;
617+
618+ Assert . Contains ( "-32601" , exception . Message ) ;
619+ Assert . Contains ( "Method not found" , exception . Message ) ;
620+ }
621+
557622 private static A2AClient CreateA2AClient < T > ( T result , Action < HttpRequestMessage > ? onRequest = null )
558623 {
559624 var jsonResponse = JsonSerializer . Serialize ( new JsonRpcResponse
0 commit comments