Skip to content

Commit e2a60d1

Browse files
Copilotedburns
andauthored
Port tests for mode handler APIs from the reference implementation
Co-authored-by: edburns <75821+edburns@users.noreply.github.com>
1 parent 0f2be9d commit e2a60d1

3 files changed

Lines changed: 244 additions & 0 deletions

File tree

src/test/java/com/github/copilot/sdk/ConfigCloneTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,34 @@ void resumeSessionConfigNewFieldsCloned() {
366366
assertSame(defaultAgent, cloned.getDefaultAgent());
367367
}
368368

369+
@Test
370+
void sessionConfigCloneCopiesModeSwitchHandlers() {
371+
SessionConfig original = new SessionConfig();
372+
original.setOnExitPlanMode((request, invocation) -> CompletableFuture
373+
.completedFuture(new com.github.copilot.sdk.json.ExitPlanModeResult()));
374+
original.setOnAutoModeSwitch((request, invocation) -> CompletableFuture
375+
.completedFuture(com.github.copilot.sdk.json.AutoModeSwitchResponse.NO));
376+
377+
SessionConfig cloned = original.clone();
378+
379+
assertSame(original.getOnExitPlanMode(), cloned.getOnExitPlanMode());
380+
assertSame(original.getOnAutoModeSwitch(), cloned.getOnAutoModeSwitch());
381+
}
382+
383+
@Test
384+
void resumeSessionConfigCloneCopiesModeSwitchHandlers() {
385+
ResumeSessionConfig original = new ResumeSessionConfig();
386+
original.setOnExitPlanMode((request, invocation) -> CompletableFuture
387+
.completedFuture(new com.github.copilot.sdk.json.ExitPlanModeResult()));
388+
original.setOnAutoModeSwitch((request, invocation) -> CompletableFuture
389+
.completedFuture(com.github.copilot.sdk.json.AutoModeSwitchResponse.NO));
390+
391+
ResumeSessionConfig cloned = original.clone();
392+
393+
assertSame(original.getOnExitPlanMode(), cloned.getOnExitPlanMode());
394+
assertSame(original.getOnAutoModeSwitch(), cloned.getOnAutoModeSwitch());
395+
}
396+
369397
@Test
370398
void copilotClientOptionsSessionIdleTimeoutCloned() {
371399
CopilotClientOptions original = new CopilotClientOptions();

src/test/java/com/github/copilot/sdk/SessionHandlerTest.java

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,4 +341,80 @@ void testRegisterToolsEmptyListClearsTools() {
341341
session.registerTools(List.of());
342342
assertNull(session.getTool("my_tool"));
343343
}
344+
345+
// ===== Exit Plan Mode handler =====
346+
347+
@Test
348+
void testHandleExitPlanModeRequestNoHandler() throws Exception {
349+
var request = new com.github.copilot.sdk.json.ExitPlanModeRequest().setSummary("Test plan");
350+
351+
var result = session.handleExitPlanModeRequest(request).get();
352+
353+
assertTrue(result.isApproved());
354+
}
355+
356+
@Test
357+
void testHandleExitPlanModeRequestWithHandler() throws Exception {
358+
session.registerExitPlanModeHandler((req, inv) -> {
359+
assertEquals("handler-test-session", inv.getSessionId());
360+
return CompletableFuture.completedFuture(new com.github.copilot.sdk.json.ExitPlanModeResult()
361+
.setApproved(false).setSelectedAction("autopilot").setFeedback("Not yet"));
362+
});
363+
var request = new com.github.copilot.sdk.json.ExitPlanModeRequest().setSummary("Test plan")
364+
.setActions(List.of("interactive", "autopilot")).setRecommendedAction("interactive");
365+
366+
var result = session.handleExitPlanModeRequest(request).get();
367+
368+
assertFalse(result.isApproved());
369+
assertEquals("autopilot", result.getSelectedAction());
370+
assertEquals("Not yet", result.getFeedback());
371+
}
372+
373+
@Test
374+
void testHandleExitPlanModeRequestHandlerException() throws Exception {
375+
session.registerExitPlanModeHandler((req, inv) -> CompletableFuture.failedFuture(new RuntimeException("fail")));
376+
var request = new com.github.copilot.sdk.json.ExitPlanModeRequest().setSummary("Plan");
377+
378+
var result = session.handleExitPlanModeRequest(request).get();
379+
380+
assertTrue(result.isApproved());
381+
}
382+
383+
// ===== Auto Mode Switch handler =====
384+
385+
@Test
386+
void testHandleAutoModeSwitchRequestNoHandler() throws Exception {
387+
var request = new com.github.copilot.sdk.json.AutoModeSwitchRequest().setErrorCode("rate_limited");
388+
389+
var result = session.handleAutoModeSwitchRequest(request).get();
390+
391+
assertEquals(com.github.copilot.sdk.json.AutoModeSwitchResponse.NO, result);
392+
}
393+
394+
@Test
395+
void testHandleAutoModeSwitchRequestWithHandler() throws Exception {
396+
session.registerAutoModeSwitchHandler((req, inv) -> {
397+
assertEquals("handler-test-session", inv.getSessionId());
398+
assertEquals("user_weekly_rate_limited", req.getErrorCode());
399+
assertEquals(1.0, req.getRetryAfterSeconds());
400+
return CompletableFuture.completedFuture(com.github.copilot.sdk.json.AutoModeSwitchResponse.YES);
401+
});
402+
var request = new com.github.copilot.sdk.json.AutoModeSwitchRequest().setErrorCode("user_weekly_rate_limited")
403+
.setRetryAfterSeconds(1.0);
404+
405+
var result = session.handleAutoModeSwitchRequest(request).get();
406+
407+
assertEquals(com.github.copilot.sdk.json.AutoModeSwitchResponse.YES, result);
408+
}
409+
410+
@Test
411+
void testHandleAutoModeSwitchRequestHandlerException() throws Exception {
412+
session.registerAutoModeSwitchHandler(
413+
(req, inv) -> CompletableFuture.failedFuture(new RuntimeException("fail")));
414+
var request = new com.github.copilot.sdk.json.AutoModeSwitchRequest().setErrorCode("rate_limited");
415+
416+
var result = session.handleAutoModeSwitchRequest(request).get();
417+
418+
assertEquals(com.github.copilot.sdk.json.AutoModeSwitchResponse.NO, result);
419+
}
344420
}

src/test/java/com/github/copilot/sdk/SessionRequestBuilderTest.java

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,4 +535,144 @@ void testResumeRequestOmitsEnableSessionTelemetryWhenNull() throws Exception {
535535
var json = mapper.writeValueAsString(request);
536536
assertFalse(json.contains("enableSessionTelemetry"), "enableSessionTelemetry should be omitted when null");
537537
}
538+
539+
// =========================================================================
540+
// mode handler request flags
541+
// =========================================================================
542+
543+
@Test
544+
void testBuildCreateRequestSetsRequestExitPlanMode() {
545+
var config = new SessionConfig().setOnExitPlanMode((request, invocation) -> CompletableFuture
546+
.completedFuture(new com.github.copilot.sdk.json.ExitPlanModeResult()));
547+
548+
CreateSessionRequest request = SessionRequestBuilder.buildCreateRequest(config);
549+
550+
assertEquals(Boolean.TRUE, request.getRequestExitPlanMode());
551+
}
552+
553+
@Test
554+
void testBuildCreateRequestSetsRequestAutoModeSwitch() {
555+
var config = new SessionConfig().setOnAutoModeSwitch((request, invocation) -> CompletableFuture
556+
.completedFuture(com.github.copilot.sdk.json.AutoModeSwitchResponse.NO));
557+
558+
CreateSessionRequest request = SessionRequestBuilder.buildCreateRequest(config);
559+
560+
assertEquals(Boolean.TRUE, request.getRequestAutoModeSwitch());
561+
}
562+
563+
@Test
564+
void testBuildCreateRequestOmitsModeRequestFlagsWhenNull() {
565+
var config = new SessionConfig();
566+
567+
CreateSessionRequest request = SessionRequestBuilder.buildCreateRequest(config);
568+
569+
assertNull(request.getRequestExitPlanMode());
570+
assertNull(request.getRequestAutoModeSwitch());
571+
}
572+
573+
@Test
574+
void testBuildResumeRequestSetsRequestExitPlanMode() {
575+
var config = new ResumeSessionConfig().setOnExitPlanMode((request, invocation) -> CompletableFuture
576+
.completedFuture(new com.github.copilot.sdk.json.ExitPlanModeResult()));
577+
578+
ResumeSessionRequest request = SessionRequestBuilder.buildResumeRequest("test-session", config);
579+
580+
assertEquals(Boolean.TRUE, request.getRequestExitPlanMode());
581+
}
582+
583+
@Test
584+
void testBuildResumeRequestSetsRequestAutoModeSwitch() {
585+
var config = new ResumeSessionConfig().setOnAutoModeSwitch((request, invocation) -> CompletableFuture
586+
.completedFuture(com.github.copilot.sdk.json.AutoModeSwitchResponse.NO));
587+
588+
ResumeSessionRequest request = SessionRequestBuilder.buildResumeRequest("test-session", config);
589+
590+
assertEquals(Boolean.TRUE, request.getRequestAutoModeSwitch());
591+
}
592+
593+
@Test
594+
void configureSessionWithExitPlanModeHandler_registersHandler() {
595+
CopilotSession session = new CopilotSession("session-1", null);
596+
597+
var config = new SessionConfig().setOnExitPlanMode((request, invocation) -> CompletableFuture
598+
.completedFuture(new com.github.copilot.sdk.json.ExitPlanModeResult()));
599+
600+
SessionRequestBuilder.configureSession(session, config);
601+
}
602+
603+
@Test
604+
void configureSessionWithAutoModeSwitchHandler_registersHandler() {
605+
CopilotSession session = new CopilotSession("session-1", null);
606+
607+
var config = new SessionConfig().setOnAutoModeSwitch((request, invocation) -> CompletableFuture
608+
.completedFuture(com.github.copilot.sdk.json.AutoModeSwitchResponse.NO));
609+
610+
SessionRequestBuilder.configureSession(session, config);
611+
}
612+
613+
@Test
614+
void configureResumedSessionWithExitPlanModeHandler_registersHandler() {
615+
CopilotSession session = new CopilotSession("session-1", null);
616+
617+
var config = new ResumeSessionConfig().setOnExitPlanMode((request, invocation) -> CompletableFuture
618+
.completedFuture(new com.github.copilot.sdk.json.ExitPlanModeResult()));
619+
620+
SessionRequestBuilder.configureSession(session, config);
621+
}
622+
623+
@Test
624+
void configureResumedSessionWithAutoModeSwitchHandler_registersHandler() {
625+
CopilotSession session = new CopilotSession("session-1", null);
626+
627+
var config = new ResumeSessionConfig().setOnAutoModeSwitch((request, invocation) -> CompletableFuture
628+
.completedFuture(com.github.copilot.sdk.json.AutoModeSwitchResponse.NO));
629+
630+
SessionRequestBuilder.configureSession(session, config);
631+
}
632+
633+
// =========================================================================
634+
// mode request flags serialization
635+
// =========================================================================
636+
637+
@Test
638+
void testCreateRequestSerializesModeRequestFlags() throws Exception {
639+
var config = new SessionConfig()
640+
.setOnExitPlanMode((request, invocation) -> CompletableFuture
641+
.completedFuture(new com.github.copilot.sdk.json.ExitPlanModeResult()))
642+
.setOnAutoModeSwitch((request, invocation) -> CompletableFuture
643+
.completedFuture(com.github.copilot.sdk.json.AutoModeSwitchResponse.NO));
644+
645+
CreateSessionRequest request = SessionRequestBuilder.buildCreateRequest(config);
646+
var mapper = JsonRpcClient.getObjectMapper();
647+
var json = mapper.writeValueAsString(request);
648+
649+
assertTrue(json.contains("\"requestExitPlanMode\":true"));
650+
assertTrue(json.contains("\"requestAutoModeSwitch\":true"));
651+
}
652+
653+
@Test
654+
void testResumeRequestSerializesModeRequestFlags() throws Exception {
655+
var config = new ResumeSessionConfig()
656+
.setOnExitPlanMode((request, invocation) -> CompletableFuture
657+
.completedFuture(new com.github.copilot.sdk.json.ExitPlanModeResult()))
658+
.setOnAutoModeSwitch((request, invocation) -> CompletableFuture
659+
.completedFuture(com.github.copilot.sdk.json.AutoModeSwitchResponse.NO));
660+
661+
ResumeSessionRequest request = SessionRequestBuilder.buildResumeRequest("test-session", config);
662+
var mapper = JsonRpcClient.getObjectMapper();
663+
var json = mapper.writeValueAsString(request);
664+
665+
assertTrue(json.contains("\"requestExitPlanMode\":true"));
666+
assertTrue(json.contains("\"requestAutoModeSwitch\":true"));
667+
}
668+
669+
@Test
670+
void testAutoModeSwitchResponseSerialization() throws Exception {
671+
var mapper = JsonRpcClient.getObjectMapper();
672+
673+
assertEquals("\"yes\"", mapper.writeValueAsString(com.github.copilot.sdk.json.AutoModeSwitchResponse.YES));
674+
assertEquals("\"yes_always\"",
675+
mapper.writeValueAsString(com.github.copilot.sdk.json.AutoModeSwitchResponse.YES_ALWAYS));
676+
assertEquals("\"no\"", mapper.writeValueAsString(com.github.copilot.sdk.json.AutoModeSwitchResponse.NO));
677+
}
538678
}

0 commit comments

Comments
 (0)