@@ -33,7 +33,11 @@ struct RoundtripTests {
3333 let server = Server (
3434 name: " TestServer " ,
3535 version: " 1.0.0 " ,
36- capabilities: . init( prompts: . init( ) , tools: . init( ) )
36+ capabilities: . init(
37+ prompts: . init( ) ,
38+ resources: . init( ) ,
39+ tools: . init( )
40+ )
3741 )
3842 await server. withMethodHandler ( ListTools . self) { _ in
3943 return ListTools . Result ( tools: [
@@ -61,6 +65,32 @@ struct RoundtripTests {
6165 return CallTool . Result ( content: [ . text( " \( a + b) " ) ] )
6266 }
6367
68+ // Add resource handlers to server
69+ await server. withMethodHandler ( ListResources . self) { _ in
70+ return ListResources . Result ( resources: [
71+ Resource (
72+ name: " Example Text " ,
73+ uri: " test://example.txt " ,
74+ description: " A test resource " ,
75+ mimeType: " text/plain "
76+ ) ,
77+ Resource (
78+ name: " Test Data " ,
79+ uri: " test://data.json " ,
80+ description: " JSON test data " ,
81+ mimeType: " application/json "
82+ ) ,
83+ ] )
84+ }
85+
86+ await server. withMethodHandler ( ReadResource . self) { request in
87+ guard request. uri == " test://example.txt " else {
88+ return ReadResource . Result ( contents: [ . text( " Resource not found " , uri: request. uri) ]
89+ )
90+ }
91+ return ReadResource . Result ( contents: [ . text( " Hello, World! " , uri: request. uri) ] )
92+ }
93+
6494 let client = Client ( name: " TestClient " , version: " 1.0 " )
6595
6696 try await server. start ( transport: serverTransport)
@@ -104,15 +134,53 @@ struct RoundtripTests {
104134 group. addTask {
105135 try await Task . sleep ( for: . seconds( 1 ) )
106136 listToolsTask. cancel ( )
137+ callToolTask. cancel ( )
107138 throw CancellationError ( )
108139 }
140+ group. addTask {
141+ try await listToolsTask. value
142+ }
109143 group. addTask {
110144 try await callToolTask. value
111145 }
112146 try await group. next ( )
113147 group. cancelAll ( )
114148 }
115149
150+ // Test listing resources
151+ let listResourcesTask = Task {
152+ let result = try await client. listResources ( )
153+ #expect( result. resources. count == 2 )
154+ #expect( result. resources [ 0 ] . uri == " test://example.txt " )
155+ #expect( result. resources [ 0 ] . name == " Example Text " )
156+ #expect( result. resources [ 1 ] . uri == " test://data.json " )
157+ #expect( result. resources [ 1 ] . name == " Test Data " )
158+ }
159+
160+ // Test reading a resource
161+ let readResourceTask = Task {
162+ let result = try await client. readResource ( uri: " test://example.txt " )
163+ #expect( result. count == 1 )
164+ #expect( result [ 0 ] == . text( " Hello, World! " , uri: " test://example.txt " ) )
165+ }
166+
167+ try await withThrowingTaskGroup ( of: Void . self) { group in
168+ group. addTask {
169+ try await Task . sleep ( for: . seconds( 1 ) )
170+ listResourcesTask. cancel ( )
171+ readResourceTask. cancel ( )
172+ throw CancellationError ( )
173+ }
174+ group. addTask {
175+ try await listResourcesTask. value
176+ }
177+ group. addTask {
178+ try await readResourceTask. value
179+ }
180+ try await group. next ( )
181+ group. cancelAll ( )
182+ }
183+
116184 await server. stop ( )
117185 await client. disconnect ( )
118186 try ? clientToServerRead. close ( )
0 commit comments