|
1 | 1 | package io.modelcontextprotocol.kotlin.sdk.client |
2 | 2 |
|
3 | 3 | import io.kotest.matchers.collections.shouldContain |
| 4 | +import io.ktor.http.HttpMethod |
4 | 5 | import io.ktor.http.HttpStatusCode |
5 | 6 | import io.ktor.sse.ServerSentEvent |
6 | 7 | import io.modelcontextprotocol.kotlin.sdk.ClientCapabilities |
@@ -148,4 +149,40 @@ internal class StreamableHttpClientTest : AbstractStreamableHttpClientTest() { |
148 | 149 |
|
149 | 150 | client.close() |
150 | 151 | } |
| 152 | + |
| 153 | + @Test |
| 154 | + fun `handle streaming not supported`() = runBlocking { |
| 155 | + val client = Client( |
| 156 | + clientInfo = Implementation(name = "client2", version = "1.0.0"), |
| 157 | + options = ClientOptions( |
| 158 | + capabilities = ClientCapabilities(), |
| 159 | + ), |
| 160 | + ) |
| 161 | + |
| 162 | + val sessionId = UUID.randomUUID().toString() |
| 163 | + |
| 164 | + mockMcp.onInitialize(clientName = "client2", sessionId = sessionId) |
| 165 | + |
| 166 | + mockMcp.handleJSONRPCRequest( |
| 167 | + jsonRpcMethod = "notifications/initialized", |
| 168 | + expectedSessionId = sessionId, |
| 169 | + sessionId = sessionId, |
| 170 | + statusCode = HttpStatusCode.Accepted, |
| 171 | + ) |
| 172 | + |
| 173 | + mockMcp.onSubscribe( |
| 174 | + httpMethod = HttpMethod.Get, |
| 175 | + sessionId = sessionId, |
| 176 | + ) respondsWith { |
| 177 | + headers += MCP_SESSION_ID_HEADER to sessionId |
| 178 | + body = null |
| 179 | + httpStatus = HttpStatusCode.UnsupportedMediaType |
| 180 | + } |
| 181 | + |
| 182 | + mockMcp.mockUnsubscribeRequest(sessionId = sessionId) |
| 183 | + |
| 184 | + connect(client) |
| 185 | + |
| 186 | + client.close() |
| 187 | + } |
151 | 188 | } |
0 commit comments