Skip to content

Commit 0f03d15

Browse files
committed
fixup! Introduce Kotlin integration tests
Signed-off-by: Sergey Karpov <sergey.karpov@jetbrains.com>
1 parent 17a3694 commit 0f03d15

File tree

2 files changed

+86
-21
lines changed

2 files changed

+86
-21
lines changed

kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/kotlin/PromptIntegrationTest.kt

Lines changed: 58 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ class PromptIntegrationTest : KotlinTestBase() {
100100
if (includeImage) {
101101
assistantContents.add(
102102
ImageContent(
103-
data = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
103+
data = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BmMIQAAAABJRU5ErkJggg==",
104104
mimeType = "image/png",
105105
),
106106
)
@@ -153,7 +153,8 @@ class PromptIntegrationTest : KotlinTestBase() {
153153
PromptMessage(
154154
role = Role.assistant,
155155
content = TextContent(
156-
text = "As an AI, I don't have personal opinions, but I can provide information about $topic.",
156+
text = "As an AI, I don't have personal opinions," +
157+
" but I can provide information about $topic.",
157158
),
158159
),
159160
PromptMessage(
@@ -193,8 +194,12 @@ class PromptIntegrationTest : KotlinTestBase() {
193194
),
194195
) { request ->
195196
val args = request.arguments ?: emptyMap()
196-
val arg1 = args["requiredArg1"] ?: throw IllegalArgumentException("Missing required argument: requiredArg1")
197-
val arg2 = args["requiredArg2"] ?: throw IllegalArgumentException("Missing required argument: requiredArg2")
197+
val arg1 = args["requiredArg1"] ?: throw IllegalArgumentException(
198+
"Missing required argument: requiredArg1",
199+
)
200+
val arg2 = args["requiredArg2"] ?: throw IllegalArgumentException(
201+
"Missing required argument: requiredArg2",
202+
)
198203
val optArg = args["optionalArg"] ?: "default"
199204

200205
GetPromptResult(
@@ -222,14 +227,22 @@ class PromptIntegrationTest : KotlinTestBase() {
222227

223228
val testPrompt = result.prompts.find { it.name == testPromptName }
224229
assertNotNull(testPrompt, "Test prompt should be in the list")
225-
assertEquals(testPromptDescription, testPrompt.description, "Prompt description should match")
230+
assertEquals(
231+
testPromptDescription,
232+
testPrompt.description,
233+
"Prompt description should match",
234+
)
226235

227236
val arguments = testPrompt.arguments ?: error("Prompt arguments should not be null")
228237
assertTrue(arguments.isNotEmpty(), "Prompt arguments should not be empty")
229238

230239
val nameArg = arguments.find { it.name == "name" }
231240
assertNotNull(nameArg, "Name argument should be in the list")
232-
assertEquals("The name to greet", nameArg.description, "Argument description should match")
241+
assertEquals(
242+
"The name to greet",
243+
nameArg.description,
244+
"Argument description should match",
245+
)
233246
assertEquals(true, nameArg.required, "Argument required flag should match")
234247
}
235248

@@ -244,7 +257,11 @@ class PromptIntegrationTest : KotlinTestBase() {
244257
)
245258

246259
assertNotNull(result, "Get prompt result should not be null")
247-
assertEquals(testPromptDescription, result.description, "Prompt description should match")
260+
assertEquals(
261+
testPromptDescription,
262+
result.description,
263+
"Prompt description should match",
264+
)
248265

249266
assertTrue(result.messages.isNotEmpty(), "Prompt messages should not be empty")
250267
assertEquals(2, result.messages.size, "Prompt should have 2 messages")
@@ -254,7 +271,11 @@ class PromptIntegrationTest : KotlinTestBase() {
254271
val userContent = userMessage.content as? TextContent
255272
assertNotNull(userContent, "User message content should be TextContent")
256273
assertNotNull(userContent.text, "User message text should not be null")
257-
assertEquals("Hello, $testName!", userContent.text, "User message content should match")
274+
assertEquals(
275+
"Hello, $testName!",
276+
userContent.text,
277+
"User message content should match",
278+
)
258279

259280
val assistantMessage = result.messages.find { it.role == Role.assistant }
260281
assertNotNull(assistantMessage, "Assistant message should be in the list")
@@ -277,7 +298,11 @@ class PromptIntegrationTest : KotlinTestBase() {
277298

278299
val argsDef = strictPrompt.arguments ?: error("Prompt arguments should not be null")
279300
val requiredArgs = argsDef.filter { it.required == true }
280-
assertEquals(2, requiredArgs.size, "Strict prompt should have 2 required arguments")
301+
assertEquals(
302+
2,
303+
requiredArgs.size,
304+
"Strict prompt should have 2 required arguments",
305+
)
281306

282307
// test missing required arg
283308
val exception = assertThrows<IllegalStateException> {
@@ -291,7 +316,11 @@ class PromptIntegrationTest : KotlinTestBase() {
291316
}
292317
}
293318

294-
assertEquals(exception.message?.contains("requiredArg2"), true, "Exception should mention the missing argument")
319+
assertEquals(
320+
true,
321+
exception.message?.contains("requiredArg2"),
322+
"Exception should mention the missing argument",
323+
)
295324

296325
// test with no args
297326
val exception2 = assertThrows<IllegalStateException> {
@@ -348,7 +377,11 @@ class PromptIntegrationTest : KotlinTestBase() {
348377
)
349378

350379
assertNotNull(result, "Get prompt result should not be null")
351-
assertEquals(complexPromptDescription, result.description, "Prompt description should match")
380+
assertEquals(
381+
complexPromptDescription,
382+
result.description,
383+
"Prompt description should match",
384+
)
352385

353386
assertTrue(result.messages.isNotEmpty(), "Prompt messages should not be empty")
354387
assertEquals(2, result.messages.size, "Prompt should have 2 messages")
@@ -365,7 +398,10 @@ class PromptIntegrationTest : KotlinTestBase() {
365398
val assistantContent = assistantMessage.content as? TextContent
366399
assertNotNull(assistantContent, "Assistant message content should be TextContent")
367400
val assistantText = requireNotNull(assistantContent.text)
368-
assertTrue(assistantText.contains(topic), "Assistant message should contain the topic")
401+
assertTrue(
402+
assistantText.contains(topic),
403+
"Assistant message should contain the topic",
404+
)
369405

370406
val resultNoImage = client.getPrompt(
371407
GetPromptRequest(
@@ -392,7 +428,11 @@ class PromptIntegrationTest : KotlinTestBase() {
392428
)
393429

394430
assertNotNull(result, "Get prompt result should not be null")
395-
assertEquals(conversationPromptDescription, result.description, "Prompt description should match")
431+
assertEquals(
432+
conversationPromptDescription,
433+
result.description,
434+
"Prompt description should match",
435+
)
396436

397437
assertTrue(result.messages.isNotEmpty(), "Prompt messages should not be empty")
398438
assertEquals(6, result.messages.size, "Prompt should have 6 messages")
@@ -405,7 +445,11 @@ class PromptIntegrationTest : KotlinTestBase() {
405445

406446
for (i in 0 until result.messages.size) {
407447
val expectedRole = if (i % 2 == 0) Role.user else Role.assistant
408-
assertEquals(expectedRole, result.messages[i].role, "Message $i should have role $expectedRole")
448+
assertEquals(
449+
expectedRole,
450+
result.messages[i].role,
451+
"Message $i should have role $expectedRole",
452+
)
409453
}
410454

411455
for (message in result.messages) {

kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/kotlin/ToolIntegrationTest.kt

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,9 @@ class ToolIntegrationTest : KotlinTestBase() {
166166
val formattedResult = "%.${precision}f".format(result)
167167

168168
val textContent = if (showSteps) {
169-
"Operation: $operation\nA: $a\nB: $b\nResult: $formattedResult\nTags: ${tags.joinToString(", ")}"
169+
"Operation: $operation\nA: $a\nB: $b\nResult: $formattedResult\nTags: ${
170+
tags.joinToString(", ")
171+
}"
170172
} else {
171173
"Result: $formattedResult"
172174
}
@@ -279,7 +281,7 @@ class ToolIntegrationTest : KotlinTestBase() {
279281
if (includeImage) {
280282
content.add(
281283
ImageContent(
282-
data = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
284+
data = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
283285
mimeType = "image/png",
284286
),
285287
)
@@ -304,7 +306,11 @@ class ToolIntegrationTest : KotlinTestBase() {
304306

305307
val testTool = result.tools.find { it.name == testToolName }
306308
assertNotNull(testTool, "Test tool should be in the list")
307-
assertEquals(testToolDescription, testTool.description, "Tool description should match")
309+
assertEquals(
310+
testToolDescription,
311+
testTool.description,
312+
"Tool description should match",
313+
)
308314
}
309315

310316
@Test
@@ -347,7 +353,10 @@ class ToolIntegrationTest : KotlinTestBase() {
347353
val contentText = requireNotNull(content.text)
348354

349355
assertTrue(contentText.contains("Operation"), "Result should contain operation")
350-
assertTrue(contentText.contains("multiply"), "Result should contain multiply operation")
356+
assertTrue(
357+
contentText.contains("multiply"),
358+
"Result should contain multiply operation",
359+
)
351360
assertTrue(contentText.contains("5.5"), "Result should contain first operand")
352361
assertTrue(contentText.contains("2.0"), "Result should contain second operand")
353362
assertTrue(contentText.contains("11"), "Result should contain result value")
@@ -421,12 +430,20 @@ class ToolIntegrationTest : KotlinTestBase() {
421430
val result = client.callTool(multiContentToolName, arguments)
422431

423432
val toolResult = assertCallToolResult(result)
424-
assertEquals(2, toolResult.content.size, "Tool result should have 2 content items")
433+
assertEquals(
434+
2,
435+
toolResult.content.size,
436+
"Tool result should have 2 content items",
437+
)
425438

426439
val textContent = toolResult.content.firstOrNull { it is TextContent } as? TextContent
427440
assertNotNull(textContent, "Result should contain TextContent")
428441
assertNotNull(textContent.text, "Text content should not be null")
429-
assertEquals("Text content: $testText", textContent.text, "Text content should match")
442+
assertEquals(
443+
"Text content: $testText",
444+
textContent.text,
445+
"Text content should match",
446+
)
430447

431448
val imageContent = toolResult.content.firstOrNull { it is ImageContent } as? ImageContent
432449
assertNotNull(imageContent, "Result should contain ImageContent")
@@ -445,7 +462,11 @@ class ToolIntegrationTest : KotlinTestBase() {
445462
val textOnlyResult = client.callTool(multiContentToolName, textOnlyArgs)
446463

447464
val textOnlyToolResult = assertCallToolResult(textOnlyResult, "Text-only: ")
448-
assertEquals(1, textOnlyToolResult.content.size, "Text-only result should have 1 content item")
465+
assertEquals(
466+
1,
467+
textOnlyToolResult.content.size,
468+
"Text-only result should have 1 content item",
469+
)
449470

450471
assertTextContent(textOnlyToolResult.content.firstOrNull(), "Text content: $testText")
451472
}

0 commit comments

Comments
 (0)