Add support for testing JSON serialization of the mcp API (#45)
* Add kotest-assertions-json dependency + ToolSerializationTest * ToolSerializationTest update
This commit is contained in:
parent
cd7de7a7a2
commit
0d6fa860cd
3 changed files with 60 additions and 2 deletions
|
|
@ -219,6 +219,7 @@ kotlin {
|
||||||
implementation(libs.ktor.server.test.host)
|
implementation(libs.ktor.server.test.host)
|
||||||
implementation(libs.kotlinx.coroutines.test)
|
implementation(libs.kotlinx.coroutines.test)
|
||||||
implementation(libs.kotlinx.coroutines.debug)
|
implementation(libs.kotlinx.coroutines.debug)
|
||||||
|
implementation(libs.kotest.assertions.json)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ logging = "7.0.0"
|
||||||
jreleaser = "1.15.0"
|
jreleaser = "1.15.0"
|
||||||
binaryCompatibilityValidatorPlugin = "0.17.0"
|
binaryCompatibilityValidatorPlugin = "0.17.0"
|
||||||
slf4j = "2.0.16"
|
slf4j = "2.0.16"
|
||||||
|
kotest = "5.9.1"
|
||||||
|
|
||||||
[libraries]
|
[libraries]
|
||||||
# Kotlinx libraries
|
# Kotlinx libraries
|
||||||
|
|
@ -32,8 +33,7 @@ kotlinx-coroutines-debug = { group = "org.jetbrains.kotlinx", name = "kotlinx-co
|
||||||
ktor-server-test-host = { group = "io.ktor", name = "ktor-server-test-host", version.ref = "ktor" }
|
ktor-server-test-host = { group = "io.ktor", name = "ktor-server-test-host", version.ref = "ktor" }
|
||||||
mockk = { group = "io.mockk", name = "mockk", version.ref = "mockk" }
|
mockk = { group = "io.mockk", name = "mockk", version.ref = "mockk" }
|
||||||
slf4j-simple = { group = "org.slf4j", name = "slf4j-simple", version.ref = "slf4j" }
|
slf4j-simple = { group = "org.slf4j", name = "slf4j-simple", version.ref = "slf4j" }
|
||||||
|
kotest-assertions-json = { group = "io.kotest", name = "kotest-assertions-json", version.ref = "kotest" }
|
||||||
|
|
||||||
|
|
||||||
[plugins]
|
[plugins]
|
||||||
kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
|
kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
|
||||||
|
|
|
||||||
57
src/commonTest/kotlin/ToolSerializationTest.kt
Normal file
57
src/commonTest/kotlin/ToolSerializationTest.kt
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
package io.modelcontextprotocol.kotlin.sdk
|
||||||
|
|
||||||
|
import io.kotest.assertions.json.shouldEqualJson
|
||||||
|
import io.modelcontextprotocol.kotlin.sdk.shared.McpJson
|
||||||
|
import kotlinx.serialization.encodeToString
|
||||||
|
import kotlinx.serialization.json.JsonPrimitive
|
||||||
|
import kotlinx.serialization.json.buildJsonObject
|
||||||
|
import kotlin.test.Test
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
class ToolSerializationTest {
|
||||||
|
|
||||||
|
// see https://docs.anthropic.com/en/docs/build-with-claude/tool-use
|
||||||
|
/* language=json */
|
||||||
|
private val getWeatherToolJson = """
|
||||||
|
{
|
||||||
|
"name": "get_weather",
|
||||||
|
"description": "Get the current weather in a given location",
|
||||||
|
"inputSchema": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"location": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "The city and state, e.g. San Francisco, CA"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["location"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
""".trimIndent()
|
||||||
|
|
||||||
|
val getWeatherTool = Tool(
|
||||||
|
name = "get_weather",
|
||||||
|
description = "Get the current weather in a given location",
|
||||||
|
inputSchema = Tool.Input(
|
||||||
|
properties = buildJsonObject {
|
||||||
|
put("location", buildJsonObject {
|
||||||
|
put("type", JsonPrimitive("string"))
|
||||||
|
put("description", JsonPrimitive("The city and state, e.g. San Francisco, CA"))
|
||||||
|
})
|
||||||
|
},
|
||||||
|
required = listOf("location")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `should serialize get_weather tool`() {
|
||||||
|
McpJson.encodeToString(getWeatherTool) shouldEqualJson getWeatherToolJson
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `should deserialize get_weather tool`() {
|
||||||
|
val tool = McpJson.decodeFromString<Tool>(getWeatherToolJson)
|
||||||
|
assertEquals(expected = getWeatherTool, actual = tool)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue