22using Microsoft . Extensions . DependencyInjection ;
33using ModelContextProtocol . Protocol ;
44using ModelContextProtocol . Server ;
5- using Moq ;
5+ using ModelContextProtocol . Tests . Utils ;
66using System . Reflection ;
77using System . Runtime . InteropServices ;
88using System . Text . Json . Serialization ;
@@ -21,6 +21,9 @@ private static JsonRpcRequest CreateTestJsonRpcRequest()
2121 } ;
2222 }
2323
24+ private static McpServer CreateTestServer ( IServiceProvider ? services = null ) =>
25+ McpServer . Create ( new TestServerTransport ( ) , new McpServerOptions ( ) , serviceProvider : services ) ;
26+
2427 public McpServerResourceTests ( )
2528 {
2629#if ! NET
@@ -143,7 +146,7 @@ public async Task UriTemplate_CreatedFromParameters_LotsOfTypesSupported()
143146
144147 McpServerResource t ;
145148 ReadResourceResult result ;
146- McpServer server = new Mock < McpServer > ( ) . Object ;
149+ McpServer server = CreateTestServer ( ) ;
147150
148151 t = McpServerResource . Create ( ( ) => "42" , new ( ) { Name = Name } ) ;
149152 Assert . Equal ( "resource://mcp/Hello" , t . ProtocolResourceTemplate . UriTemplate ) ;
@@ -288,7 +291,7 @@ public async Task UriTemplate_NonMatchingUri_DoesNotMatch(string uri)
288291 Assert . Equal ( "resource://mcp/Hello{?arg1}" , t . ProtocolResourceTemplate . UriTemplate ) ;
289292 Assert . False ( t . IsMatch ( uri ) ) ;
290293 await Assert . ThrowsAsync < InvalidOperationException > ( async ( ) => await t . ReadAsync (
291- new RequestContext < ReadResourceRequestParams > ( new Mock < McpServer > ( ) . Object , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = uri } } ,
294+ new RequestContext < ReadResourceRequestParams > ( CreateTestServer ( ) , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = uri } } ,
292295 TestContext . Current . CancellationToken ) ) ;
293296 }
294297
@@ -299,7 +302,7 @@ public async Task UriTemplate_IsHostCaseInsensitive(string actualUri, string que
299302 {
300303 McpServerResource t = McpServerResource . Create ( ( ) => "resource" , new ( ) { UriTemplate = actualUri } ) ;
301304 Assert . NotNull ( await t . ReadAsync (
302- new RequestContext < ReadResourceRequestParams > ( new Mock < McpServer > ( ) . Object , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = queriedUri } } ,
305+ new RequestContext < ReadResourceRequestParams > ( CreateTestServer ( ) , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = queriedUri } } ,
303306 TestContext . Current . CancellationToken ) ) ;
304307 }
305308
@@ -328,7 +331,7 @@ public async Task UriTemplate_MissingParameter_Throws(string uri)
328331 McpServerResource t = McpServerResource . Create ( ( string arg1 , int arg2 ) => arg1 , new ( ) { Name = "Hello" } ) ;
329332 Assert . Equal ( "resource://mcp/Hello{?arg1,arg2}" , t . ProtocolResourceTemplate . UriTemplate ) ;
330333 await Assert . ThrowsAsync < ArgumentException > ( async ( ) => await t . ReadAsync (
331- new RequestContext < ReadResourceRequestParams > ( new Mock < McpServer > ( ) . Object , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = uri } } ,
334+ new RequestContext < ReadResourceRequestParams > ( CreateTestServer ( ) , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = uri } } ,
332335 TestContext . Current . CancellationToken ) ) ;
333336 }
334337
@@ -341,25 +344,25 @@ public async Task UriTemplate_MissingOptionalParameter_Succeeds()
341344 ReadResourceResult result ;
342345
343346 result = await t . ReadAsync (
344- new RequestContext < ReadResourceRequestParams > ( new Mock < McpServer > ( ) . Object , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "resource://mcp/Hello" } } ,
347+ new RequestContext < ReadResourceRequestParams > ( CreateTestServer ( ) , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "resource://mcp/Hello" } } ,
345348 TestContext . Current . CancellationToken ) ;
346349 Assert . NotNull ( result ) ;
347350 Assert . Equal ( "" , ( ( TextResourceContents ) result . Contents [ 0 ] ) . Text ) ;
348351
349352 result = await t . ReadAsync (
350- new RequestContext < ReadResourceRequestParams > ( new Mock < McpServer > ( ) . Object , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "resource://mcp/Hello?arg1=first" } } ,
353+ new RequestContext < ReadResourceRequestParams > ( CreateTestServer ( ) , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "resource://mcp/Hello?arg1=first" } } ,
351354 TestContext . Current . CancellationToken ) ;
352355 Assert . NotNull ( result ) ;
353356 Assert . Equal ( "first" , ( ( TextResourceContents ) result . Contents [ 0 ] ) . Text ) ;
354357
355358 result = await t . ReadAsync (
356- new RequestContext < ReadResourceRequestParams > ( new Mock < McpServer > ( ) . Object , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "resource://mcp/Hello?arg2=42" } } ,
359+ new RequestContext < ReadResourceRequestParams > ( CreateTestServer ( ) , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "resource://mcp/Hello?arg2=42" } } ,
357360 TestContext . Current . CancellationToken ) ;
358361 Assert . NotNull ( result ) ;
359362 Assert . Equal ( "42" , ( ( TextResourceContents ) result . Contents [ 0 ] ) . Text ) ;
360363
361364 result = await t . ReadAsync (
362- new RequestContext < ReadResourceRequestParams > ( new Mock < McpServer > ( ) . Object , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "resource://mcp/Hello?arg1=first&arg2=42" } } ,
365+ new RequestContext < ReadResourceRequestParams > ( CreateTestServer ( ) , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "resource://mcp/Hello?arg1=first&arg2=42" } } ,
363366 TestContext . Current . CancellationToken ) ;
364367 Assert . NotNull ( result ) ;
365368 Assert . Equal ( "first42" , ( ( TextResourceContents ) result . Contents [ 0 ] ) . Text ) ;
@@ -368,16 +371,16 @@ public async Task UriTemplate_MissingOptionalParameter_Succeeds()
368371 [ Fact ]
369372 public async Task SupportsMcpServer ( )
370373 {
371- Mock < McpServer > mockServer = new ( ) ;
374+ McpServer testServer = CreateTestServer ( ) ;
372375
373376 McpServerResource resource = McpServerResource . Create ( ( McpServer server ) =>
374377 {
375- Assert . Same ( mockServer . Object , server ) ;
378+ Assert . Same ( testServer , server ) ;
376379 return "42" ;
377380 } , new ( ) { Name = "Test" } ) ;
378381
379382 var result = await resource . ReadAsync (
380- new RequestContext < ReadResourceRequestParams > ( mockServer . Object , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "resource://mcp/Test" } } ,
383+ new RequestContext < ReadResourceRequestParams > ( testServer , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "resource://mcp/Test" } } ,
381384 TestContext . Current . CancellationToken ) ;
382385 Assert . NotNull ( result ) ;
383386 Assert . Equal ( "42" , ( ( TextResourceContents ) result . Contents [ 0 ] ) . Text ) ;
@@ -392,8 +395,7 @@ public async Task SupportsCtorInjection()
392395 sc . AddSingleton ( expectedMyService ) ;
393396 IServiceProvider services = sc . BuildServiceProvider ( ) ;
394397
395- Mock < McpServer > mockServer = new ( ) ;
396- mockServer . SetupGet ( s => s . Services ) . Returns ( services ) ;
398+ McpServer testServer = CreateTestServer ( services ) ;
397399
398400 MethodInfo ? testMethod = typeof ( HasCtorWithSpecialParameters ) . GetMethod ( nameof ( HasCtorWithSpecialParameters . TestResource ) ) ;
399401 Assert . NotNull ( testMethod ) ;
@@ -404,7 +406,7 @@ public async Task SupportsCtorInjection()
404406 } , new ( ) { Services = services } ) ;
405407
406408 var result = await tool . ReadAsync (
407- new RequestContext < ReadResourceRequestParams > ( mockServer . Object , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "https://something" } } ,
409+ new RequestContext < ReadResourceRequestParams > ( testServer , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "https://something" } } ,
408410 TestContext . Current . CancellationToken ) ;
409411 Assert . NotNull ( result ) ;
410412 Assert . NotNull ( result . Contents ) ;
@@ -478,14 +480,14 @@ public async Task SupportsServiceFromDI(ServiceLifetime injectedArgumentLifetime
478480
479481 McpServerResource resource = services . GetRequiredService < McpServerResource > ( ) ;
480482
481- Mock < McpServer > mockServer = new ( ) ;
483+ McpServer testServer = CreateTestServer ( ) ;
482484
483485 await Assert . ThrowsAnyAsync < ArgumentException > ( async ( ) => await resource . ReadAsync (
484- new RequestContext < ReadResourceRequestParams > ( mockServer . Object , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "resource://mcp/Test" } } ,
486+ new RequestContext < ReadResourceRequestParams > ( testServer , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "resource://mcp/Test" } } ,
485487 TestContext . Current . CancellationToken ) ) ;
486488
487489 var result = await resource . ReadAsync (
488- new RequestContext < ReadResourceRequestParams > ( mockServer . Object , CreateTestJsonRpcRequest ( ) ) { Services = services , Params = new ( ) { Uri = "resource://mcp/Test" } } ,
490+ new RequestContext < ReadResourceRequestParams > ( testServer , CreateTestJsonRpcRequest ( ) ) { Services = services , Params = new ( ) { Uri = "resource://mcp/Test" } } ,
489491 TestContext . Current . CancellationToken ) ;
490492 Assert . NotNull ( result ) ;
491493 Assert . Equal ( "42" , ( ( TextResourceContents ) result . Contents [ 0 ] ) . Text ) ;
@@ -507,7 +509,7 @@ public async Task SupportsOptionalServiceFromDI()
507509 } , new ( ) { Services = services , Name = "Test" } ) ;
508510
509511 var result = await resource . ReadAsync (
510- new RequestContext < ReadResourceRequestParams > ( new Mock < McpServer > ( ) . Object , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "resource://mcp/Test" } } ,
512+ new RequestContext < ReadResourceRequestParams > ( CreateTestServer ( ) , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "resource://mcp/Test" } } ,
511513 TestContext . Current . CancellationToken ) ;
512514 Assert . NotNull ( result ) ;
513515 Assert . Equal ( "42" , ( ( TextResourceContents ) result . Contents [ 0 ] ) . Text ) ;
@@ -523,7 +525,7 @@ public async Task SupportsDisposingInstantiatedDisposableTargets()
523525 _ => new DisposableResourceType ( ) ) ;
524526
525527 var result = await resource1 . ReadAsync (
526- new RequestContext < ReadResourceRequestParams > ( new Mock < McpServer > ( ) . Object , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "test://static/resource/instanceMethod" } } ,
528+ new RequestContext < ReadResourceRequestParams > ( CreateTestServer ( ) , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "test://static/resource/instanceMethod" } } ,
527529 TestContext . Current . CancellationToken ) ;
528530 Assert . NotNull ( result ) ;
529531 Assert . Equal ( "0" , ( ( TextResourceContents ) result . Contents [ 0 ] ) . Text ) ;
@@ -534,14 +536,14 @@ public async Task SupportsDisposingInstantiatedDisposableTargets()
534536 [ Fact ]
535537 public async Task CanReturnReadResult ( )
536538 {
537- Mock < McpServer > mockServer = new ( ) ;
539+ McpServer testServer = CreateTestServer ( ) ;
538540 McpServerResource resource = McpServerResource . Create ( ( McpServer server ) =>
539541 {
540- Assert . Same ( mockServer . Object , server ) ;
542+ Assert . Same ( testServer , server ) ;
541543 return new ReadResourceResult { Contents = [ new TextResourceContents { Text = "hello" , Uri = "" } ] } ;
542544 } , new ( ) { Name = "Test" } ) ;
543545 var result = await resource . ReadAsync (
544- new RequestContext < ReadResourceRequestParams > ( mockServer . Object , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "resource://mcp/Test" } } ,
546+ new RequestContext < ReadResourceRequestParams > ( testServer , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "resource://mcp/Test" } } ,
545547 TestContext . Current . CancellationToken ) ;
546548 Assert . NotNull ( result ) ;
547549 Assert . Single ( result . Contents ) ;
@@ -551,14 +553,14 @@ public async Task CanReturnReadResult()
551553 [ Fact ]
552554 public async Task CanReturnResourceContents ( )
553555 {
554- Mock < McpServer > mockServer = new ( ) ;
556+ McpServer testServer = CreateTestServer ( ) ;
555557 McpServerResource resource = McpServerResource . Create ( ( McpServer server ) =>
556558 {
557- Assert . Same ( mockServer . Object , server ) ;
559+ Assert . Same ( testServer , server ) ;
558560 return new TextResourceContents { Text = "hello" , Uri = "" } ;
559561 } , new ( ) { Name = "Test" , SerializerOptions = JsonContext6 . Default . Options } ) ;
560562 var result = await resource . ReadAsync (
561- new RequestContext < ReadResourceRequestParams > ( mockServer . Object , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "resource://mcp/Test" } } ,
563+ new RequestContext < ReadResourceRequestParams > ( testServer , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "resource://mcp/Test" } } ,
562564 TestContext . Current . CancellationToken ) ;
563565 Assert . NotNull ( result ) ;
564566 Assert . Single ( result . Contents ) ;
@@ -568,18 +570,18 @@ public async Task CanReturnResourceContents()
568570 [ Fact ]
569571 public async Task CanReturnCollectionOfResourceContents ( )
570572 {
571- Mock < McpServer > mockServer = new ( ) ;
573+ McpServer testServer = CreateTestServer ( ) ;
572574 McpServerResource resource = McpServerResource . Create ( ( McpServer server ) =>
573575 {
574- Assert . Same ( mockServer . Object , server ) ;
576+ Assert . Same ( testServer , server ) ;
575577 return ( IList < ResourceContents > )
576578 [
577579 new TextResourceContents { Text = "hello" , Uri = "" } ,
578580 BlobResourceContents . FromBytes ( ( byte [ ] ) [ 1 , 2 , 3 ] , "" ) ,
579581 ] ;
580582 } , new ( ) { Name = "Test" } ) ;
581583 var result = await resource . ReadAsync (
582- new RequestContext < ReadResourceRequestParams > ( mockServer . Object , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "resource://mcp/Test" } } ,
584+ new RequestContext < ReadResourceRequestParams > ( testServer , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "resource://mcp/Test" } } ,
583585 TestContext . Current . CancellationToken ) ;
584586 Assert . NotNull ( result ) ;
585587 Assert . Equal ( 2 , result . Contents . Count ) ;
@@ -590,14 +592,14 @@ public async Task CanReturnCollectionOfResourceContents()
590592 [ Fact ]
591593 public async Task CanReturnString ( )
592594 {
593- Mock < McpServer > mockServer = new ( ) ;
595+ McpServer testServer = CreateTestServer ( ) ;
594596 McpServerResource resource = McpServerResource . Create ( ( McpServer server ) =>
595597 {
596- Assert . Same ( mockServer . Object , server ) ;
598+ Assert . Same ( testServer , server ) ;
597599 return "42" ;
598600 } , new ( ) { Name = "Test" } ) ;
599601 var result = await resource . ReadAsync (
600- new RequestContext < ReadResourceRequestParams > ( mockServer . Object , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "resource://mcp/Test" } } ,
602+ new RequestContext < ReadResourceRequestParams > ( testServer , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "resource://mcp/Test" } } ,
601603 TestContext . Current . CancellationToken ) ;
602604 Assert . NotNull ( result ) ;
603605 Assert . Single ( result . Contents ) ;
@@ -607,14 +609,14 @@ public async Task CanReturnString()
607609 [ Fact ]
608610 public async Task CanReturnCollectionOfStrings ( )
609611 {
610- Mock < McpServer > mockServer = new ( ) ;
612+ McpServer testServer = CreateTestServer ( ) ;
611613 McpServerResource resource = McpServerResource . Create ( ( McpServer server ) =>
612614 {
613- Assert . Same ( mockServer . Object , server ) ;
615+ Assert . Same ( testServer , server ) ;
614616 return new List < string > { "42" , "43" } ;
615617 } , new ( ) { Name = "Test" , SerializerOptions = JsonContext6 . Default . Options } ) ;
616618 var result = await resource . ReadAsync (
617- new RequestContext < ReadResourceRequestParams > ( mockServer . Object , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "resource://mcp/Test" } } ,
619+ new RequestContext < ReadResourceRequestParams > ( testServer , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "resource://mcp/Test" } } ,
618620 TestContext . Current . CancellationToken ) ;
619621 Assert . NotNull ( result ) ;
620622 Assert . Equal ( 2 , result . Contents . Count ) ;
@@ -625,14 +627,14 @@ public async Task CanReturnCollectionOfStrings()
625627 [ Fact ]
626628 public async Task CanReturnDataContent ( )
627629 {
628- Mock < McpServer > mockServer = new ( ) ;
630+ McpServer testServer = CreateTestServer ( ) ;
629631 McpServerResource resource = McpServerResource . Create ( ( McpServer server ) =>
630632 {
631- Assert . Same ( mockServer . Object , server ) ;
633+ Assert . Same ( testServer , server ) ;
632634 return new DataContent ( new byte [ ] { 0 , 1 , 2 } , "application/octet-stream" ) ;
633635 } , new ( ) { Name = "Test" } ) ;
634636 var result = await resource . ReadAsync (
635- new RequestContext < ReadResourceRequestParams > ( mockServer . Object , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "resource://mcp/Test" } } ,
637+ new RequestContext < ReadResourceRequestParams > ( testServer , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "resource://mcp/Test" } } ,
636638 TestContext . Current . CancellationToken ) ;
637639 Assert . NotNull ( result ) ;
638640 Assert . Single ( result . Contents ) ;
@@ -643,18 +645,18 @@ public async Task CanReturnDataContent()
643645 [ Fact ]
644646 public async Task CanReturnCollectionOfAIContent ( )
645647 {
646- Mock < McpServer > mockServer = new ( ) ;
648+ McpServer testServer = CreateTestServer ( ) ;
647649 McpServerResource resource = McpServerResource . Create ( ( McpServer server ) =>
648650 {
649- Assert . Same ( mockServer . Object , server ) ;
651+ Assert . Same ( testServer , server ) ;
650652 return new List < AIContent >
651653 {
652654 new TextContent ( "hello!" ) ,
653655 new DataContent ( new byte [ ] { 4 , 5 , 6 } , "application/json" ) ,
654656 } ;
655657 } , new ( ) { Name = "Test" , SerializerOptions = JsonContext6 . Default . Options } ) ;
656658 var result = await resource . ReadAsync (
657- new RequestContext < ReadResourceRequestParams > ( mockServer . Object , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "resource://mcp/Test" } } ,
659+ new RequestContext < ReadResourceRequestParams > ( testServer , CreateTestJsonRpcRequest ( ) ) { Params = new ( ) { Uri = "resource://mcp/Test" } } ,
658660 TestContext . Current . CancellationToken ) ;
659661 Assert . NotNull ( result ) ;
660662 Assert . Equal ( 2 , result . Contents . Count ) ;
0 commit comments