From 15262d5a0f5a2df2040a657c2163cee50afea14b Mon Sep 17 00:00:00 2001 From: jade Date: Tue, 4 Aug 2026 11:03:35 +0900 Subject: [PATCH] test: keep input schemas in tool modules --- .../dap/lib/util/ToolSchemaResolverTest.java | 61 ++++++------------- .../claim-search-input-schema.json | 20 ------ .../cmm/dto/ClaimSearchRequestSchemaTest.java | 23 +++++++ 3 files changed, 43 insertions(+), 61 deletions(-) delete mode 100644 dap-tool-core/src/test/resources/tool-schemas/claim-search-input-schema.json diff --git a/dap-tool-core/src/test/java/io/shinhanlife/dap/lib/util/ToolSchemaResolverTest.java b/dap-tool-core/src/test/java/io/shinhanlife/dap/lib/util/ToolSchemaResolverTest.java index 6737a009..b9f7dcf6 100644 --- a/dap-tool-core/src/test/java/io/shinhanlife/dap/lib/util/ToolSchemaResolverTest.java +++ b/dap-tool-core/src/test/java/io/shinhanlife/dap/lib/util/ToolSchemaResolverTest.java @@ -6,7 +6,6 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import com.fasterxml.jackson.databind.ObjectMapper; import io.shinhanlife.dap.lib.annotation.McpFunction; import java.lang.reflect.Method; -import java.util.List; import java.util.Map; import org.junit.jupiter.api.Test; @@ -15,66 +14,46 @@ class ToolSchemaResolverTest { private final ToolSchemaResolver resolver = new ToolSchemaResolver(new ObjectMapper()); @Test - void usesExplicitSchemaResourceBeforeAutomaticDtoSchema() throws Exception { - Method method = SchemaBackedTool.class.getDeclaredMethod("search", AutoGeneratedRequest.class); - McpFunction function = method.getAnnotation(McpFunction.class); - - Map schema = resolver.resolve(function, AutoGeneratedRequest.class); - - assertEquals(false, schema.get("additionalProperties")); - assertTrue(schema.containsKey("anyOf")); - assertEquals(50, ((Map) ((Map) schema.get("properties")).get("size")).get("maximum")); - assertEquals(List.of(Map.of("required", List.of("claimNo"))), schema.get("anyOf")); - } - - - /* Inline schema resolution is covered by the same resolver branch at integration level. void usesInlineSchemaBeforeAutomaticDtoSchema() throws Exception { - Method method = InlineSchemaTool.class.getDeclaredMethod("search", AutoGeneratedRequest.class); + Method method = InlineSchemaTool.class.getDeclaredMethod("search", AutomaticRequest.class); - Map schema = resolver.resolve(method.getAnnotation(McpFunction.class), AutoGeneratedRequest.class); + Map schema = resolver.resolve(method.getAnnotation(McpFunction.class), AutomaticRequest.class); - assertEquals("object", schema.get("type")); assertEquals(false, schema.get("additionalProperties")); - assertTrue(!((Map) schema.get("properties")).containsKey("differentField")); + assertTrue(!properties(schema).containsKey("differentField")); } - */ @Test void generatesSchemaFromRequestDtoWhenNoExplicitSchemaIsConfigured() throws Exception { - Method method = SchemaBackedTool.AutomaticSchemaTool.class.getDeclaredMethod("search", AutoGeneratedRequest.class); + Method method = AutomaticSchemaTool.class.getDeclaredMethod("search", AutomaticRequest.class); - Map schema = resolver.resolve(method.getAnnotation(McpFunction.class), AutoGeneratedRequest.class); + Map schema = resolver.resolve(method.getAnnotation(McpFunction.class), AutomaticRequest.class); - assertTrue(((Map) schema.get("properties")).containsKey("differentField")); + assertTrue(properties(schema).containsKey("differentField")); + } + + @SuppressWarnings("unchecked") + private Map properties(Map schema) { + return (Map) schema.get("properties"); } static class InlineSchemaTool { - - @McpFunction(displayName = "inline", name = "sample.inline", description = "inline", inputSchema = "{\\\"type\\\":\\\"object\\\",\\\"properties\\\":{},\\\"additionalProperties\\\":false}") - void search(AutoGeneratedRequest request) { + @McpFunction( + displayName = "inline", + name = "sample.inline", + description = "inline schema", + inputSchema = "{\"type\":\"object\",\"properties\":{\"keyword\":{\"type\":\"string\"}},\"additionalProperties\":false}") + void search(AutomaticRequest request) { } } - static class SchemaBackedTool { static class AutomaticSchemaTool { - - @McpFunction(displayName = "automatic", name = "sample.automatic", description = "automatic") - void search(AutoGeneratedRequest request) { + @McpFunction(displayName = "automatic", name = "sample.automatic", description = "automatic schema") + void search(AutomaticRequest request) { } } - - @McpFunction( - displayName = "청구 조회", - name = "processing.claim.search", - description = "보험금 청구를 조회한다.", - inputSchemaResource = "classpath:tool-schemas/claim-search-input-schema.json") - void search(AutoGeneratedRequest request) { - } - } - - static class AutoGeneratedRequest { + static class AutomaticRequest { private String differentField; } } diff --git a/dap-tool-core/src/test/resources/tool-schemas/claim-search-input-schema.json b/dap-tool-core/src/test/resources/tool-schemas/claim-search-input-schema.json deleted file mode 100644 index e595b42d..00000000 --- a/dap-tool-core/src/test/resources/tool-schemas/claim-search-input-schema.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "type": "object", - "properties": { - "claimNo": { - "type": "string", - "pattern": "^CLM[0-9]{13}$" - }, - "size": { - "type": "integer",R - "minimum": 1, - "maximum": 50, - "default": 20 - } - }, - "additionalProperties": false, - "anyOf": [ - { "required": ["claimNo"] } - ] -} diff --git a/dap-tool-oth/src/test/java/io/shinhanlife/dap/mcc/biz/cmm/dto/ClaimSearchRequestSchemaTest.java b/dap-tool-oth/src/test/java/io/shinhanlife/dap/mcc/biz/cmm/dto/ClaimSearchRequestSchemaTest.java index b52e10cf..3a39e872 100644 --- a/dap-tool-oth/src/test/java/io/shinhanlife/dap/mcc/biz/cmm/dto/ClaimSearchRequestSchemaTest.java +++ b/dap-tool-oth/src/test/java/io/shinhanlife/dap/mcc/biz/cmm/dto/ClaimSearchRequestSchemaTest.java @@ -3,7 +3,12 @@ package io.shinhanlife.dap.mcc.biz.cmm.dto; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.shinhanlife.dap.lib.annotation.McpFunction; import io.shinhanlife.dap.lib.util.JsonSchemaGenerator; +import io.shinhanlife.dap.lib.util.ToolSchemaResolver; +import io.shinhanlife.dap.mcc.biz.cmm.usecase.ClaimSearchSchemaSampleUseCase; +import java.lang.reflect.Method; import java.util.List; import java.util.Map; import org.junit.jupiter.api.Test; @@ -24,8 +29,26 @@ class ClaimSearchRequestSchemaTest { Map.of("required", List.of("contractNo"))), schema.get("anyOf")); } + @Test + void resolvesSchemaFromToolModuleResource() throws Exception { + Method method = ClaimSearchSchemaSampleUseCase.class + .getDeclaredMethod("search", ClaimSearchRequest.class); + McpFunction function = method.getAnnotation(McpFunction.class); + + Map schema = new ToolSchemaResolver(new ObjectMapper()) + .resolve(function, ClaimSearchRequest.class); + + assertEquals("https://json-schema.org/draft/2020-12/schema", schema.get("$schema")); + assertTrue(schema.containsKey("anyOf")); + assertEquals(50, property(schema, "size").get("maximum")); + } + @SuppressWarnings("unchecked") private Map> properties(Map schema) { return (Map>) schema.get("properties"); } + + private Map property(Map schema, String name) { + return properties(schema).get(name); + } }