diff --git a/src/test/java/com/agentcat/sdk/ported/ContextParametersTest.java b/src/test/java/com/agentcat/sdk/ported/ContextParametersTest.java index 8a59b32..d93cdac 100644 --- a/src/test/java/com/agentcat/sdk/ported/ContextParametersTest.java +++ b/src/test/java/com/agentcat/sdk/ported/ContextParametersTest.java @@ -54,6 +54,21 @@ private static McpSchema.Tool simpleTool(String name) { return McpSchema.Tool.builder(name, Map.of("type", "object", "properties", Map.of())).build(); } + private static PublishEventRequest eventForMessage(List events, String message) { + // EventQueue workers can publish calls in a different order from invocation. + return events.stream() + .filter(event -> "echo".equals(event.getResourceName())) + .filter(event -> { + Map parameters = (Map) event.getParameters(); + Map request = (Map) parameters.get("request"); + Map params = (Map) request.get("params"); + Map arguments = (Map) params.get("arguments"); + return message.equals(arguments.get("msg")); + }) + .findFirst() + .orElseThrow(() -> new AssertionError("No echo event for msg: " + message)); + } + private McpTestContext setupEchoServer(AgentCatOptions opts) throws Exception { var transport = HttpServletStreamableServerTransportProvider.builder().build(); McpSyncServer server = McpServer.sync(transport) @@ -75,6 +90,25 @@ private McpTestContext setupEchoServer(AgentCatOptions opts) throws Exception { return ctx; } + @Test + void findsEchoEventsByMessageInEitherArrivalOrder() { + PublishEventRequest noContext = new PublishEventRequest() + .resourceName("echo") + .parameters(Map.of("request", Map.of("params", Map.of( + "arguments", Map.of("msg", "no context"))))); + PublishEventRequest withContext = new PublishEventRequest() + .resourceName("echo") + .parameters(Map.of("request", Map.of("params", Map.of( + "arguments", Map.of("msg", "with context"))))) + .userIntent("Listing todos to check current status"); + + for (List events : List.of( + List.of(noContext, withContext), List.of(withContext, noContext))) { + assertSame(noContext, eventForMessage(events, "no context")); + assertSame(withContext, eventForMessage(events, "with context")); + } + } + // ───────────────────────────────────────────────────────────────────────── // addContextParameterToTools — unit tests // ───────────────────────────────────────────────────────────────────────── @@ -213,7 +247,10 @@ void worksWithToolsThatHaveContextParameter() throws Exception { List events = capture.getEvents(); assertTrue(events.size() >= 2, "both tool calls must produce events"); - PublishEventRequest lastEvent = events.get(1); + PublishEventRequest firstEvent = eventForMessage(events, "first"); + assertEquals("Creating initial data", firstEvent.getUserIntent(), + "context from first call must be captured as userIntent"); + PublishEventRequest lastEvent = eventForMessage(events, "second"); assertEquals(completionContext, lastEvent.getUserIntent(), "context from second call must be captured as userIntent"); } @@ -246,12 +283,12 @@ void capturesUserIntentOnlyWhenContextProvided() throws Exception { assertTrue(events.size() >= 2); // First call: no userIntent - PublishEventRequest noCtxEvent = events.get(0); + PublishEventRequest noCtxEvent = eventForMessage(events, "no context"); assertNull(noCtxEvent.getUserIntent(), "userIntent must be null when no context is provided"); // Second call: userIntent set - PublishEventRequest withCtxEvent = events.get(1); + PublishEventRequest withCtxEvent = eventForMessage(events, "with context"); assertEquals("Listing todos to check current status", withCtxEvent.getUserIntent(), "userIntent must equal the context argument"); }