Skip to content

Commit f8b9f28

Browse files
committed
Add unit tests for PR #212 review findings and fix compilation errors from generated type changes
SessionRequestBuilderTest.java (+48): - Add testBuildCreateRequestPropagatesCloudSessionOptions: verifies CloudSessionOptions (repository name/ID) are wired through SessionRequestBuilder into the create request JSON. - Add testBuildCreateRequestOmitsCloudWhenNull: verifies cloud field is omitted when not set. - Add testCloudSessionOptionsSerializesCorrectly: verifies Jackson serialization round-trip of CloudSessionOptions with repository fields. SessionHandlerTest.java (+48): - Add testHookInputSessionIdDeserializedForSessionStart: verifies sessionId is deserialized from JSON for session.start hook inputs. - Add testHookInputSessionIdDeserializedForSessionEnd: same for session.end hook inputs. - Add testHookInputSessionIdDeserializedForUserPromptSubmitted: same for user_prompt_submitted hook inputs. DataObjectCoverageTest.java (+58): - Add assertNull(input.getSessionId()) to preToolUseHookInputGetters and postToolUseHookInputGetters to verify sessionId getter exists and defaults to null. - Add preToolUseHookInputSessionIdRoundTrip: verifies setSessionId/getSessionId round-trip. - Add postToolUseHookInputSessionIdRoundTrip: same for PostToolUseHookInput. - Add customAgentConfigModelGetterAndSetter: verifies model getter/setter on CustomAgentConfig. - Add customAgentConfigModelFluentChaining: verifies fluent setter returns same instance. - Add customAgentConfigModelSerializationRoundTrip: verifies Jackson serialization of model. - Add customAgentConfigModelOmittedWhenNull: verifies model omitted from JSON when null. RpcWrappersTest.java (+1, -1): - Fix SessionModelSwitchToParams constructor call: add 5th null argument for new reasoningSummary parameter added by codegen. SessionEventHandlingTest.java (+2, -2): - Fix SessionStartEventData construction: add 12th null argument for new detachedFromSpawningParentSessionId field added by codegen. GeneratedRpcApiCoverageTest.java (+3, -2): - Fix SessionFsSetProviderParams constructor: add 4th null argument for new capabilities field. - Add assertNull(params.capabilities()) to verify the new field accessor. GeneratedRpcRecordsCoverageTest.java (+11, -10): - Fix SessionModelSwitchToParams: add 5th null arg, add assertNull for reasoningSummary. - Fix SkillDefinition: use SkillSource.PROJECT enum instead of raw "project" string. - Fix DiscoveredMcpServer: use McpServerSource.USER enum instead of DiscoveredMcpServerSource.USER. - Fix ModelPolicyRecord: use ModelPolicyState.ENABLED enum instead of raw "active" string. - Fix ModelPolicyRecord dateAdded: use OffsetDateTime.parse() instead of raw string.
1 parent f219ada commit f8b9f28

7 files changed

Lines changed: 171 additions & 15 deletions

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

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
1212
import com.fasterxml.jackson.databind.node.ObjectNode;
13+
import com.github.copilot.sdk.json.CustomAgentConfig;
1314
import com.github.copilot.sdk.json.GetForegroundSessionResponse;
1415
import com.github.copilot.sdk.json.McpHttpServerConfig;
1516
import com.github.copilot.sdk.json.McpStdioServerConfig;
@@ -156,6 +157,14 @@ void preToolUseHookInputGetters() {
156157
assertEquals(0L, input.getTimestamp());
157158
assertNull(input.getCwd());
158159
assertNull(input.getToolArgs());
160+
assertNull(input.getSessionId());
161+
}
162+
163+
@Test
164+
void preToolUseHookInputSessionIdRoundTrip() {
165+
var input = new PreToolUseHookInput();
166+
input.setSessionId("session-abc");
167+
assertEquals("session-abc", input.getSessionId());
159168
}
160169

161170
// ===== PostToolUseHookInput getters =====
@@ -167,6 +176,55 @@ void postToolUseHookInputGetters() {
167176
assertEquals(0L, input.getTimestamp());
168177
assertNull(input.getCwd());
169178
assertNull(input.getToolArgs());
179+
assertNull(input.getSessionId());
180+
}
181+
182+
@Test
183+
void postToolUseHookInputSessionIdRoundTrip() {
184+
var input = new PostToolUseHookInput();
185+
input.setSessionId("session-xyz");
186+
assertEquals("session-xyz", input.getSessionId());
187+
}
188+
189+
// ===== CustomAgentConfig model field =====
190+
191+
@Test
192+
void customAgentConfigModelGetterAndSetter() {
193+
var cfg = new CustomAgentConfig();
194+
assertNull(cfg.getModel());
195+
196+
cfg.setModel("claude-haiku-4.5");
197+
assertEquals("claude-haiku-4.5", cfg.getModel());
198+
}
199+
200+
@Test
201+
void customAgentConfigModelFluentChaining() {
202+
var cfg = new CustomAgentConfig().setName("reviewer").setModel("gpt-5").setDescription("Code reviewer");
203+
assertEquals("reviewer", cfg.getName());
204+
assertEquals("gpt-5", cfg.getModel());
205+
assertEquals("Code reviewer", cfg.getDescription());
206+
}
207+
208+
@Test
209+
void customAgentConfigModelSerializationRoundTrip() throws Exception {
210+
var mapper = JsonRpcClient.getObjectMapper();
211+
var cfg = new CustomAgentConfig().setName("my-agent").setModel("claude-haiku-4.5");
212+
213+
var json = mapper.writeValueAsString(cfg);
214+
assertTrue(json.contains("\"model\":\"claude-haiku-4.5\""));
215+
216+
var deserialized = mapper.readValue(json, CustomAgentConfig.class);
217+
assertEquals("my-agent", deserialized.getName());
218+
assertEquals("claude-haiku-4.5", deserialized.getModel());
219+
}
220+
221+
@Test
222+
void customAgentConfigModelOmittedWhenNull() throws Exception {
223+
var mapper = JsonRpcClient.getObjectMapper();
224+
var cfg = new CustomAgentConfig().setName("no-model-agent");
225+
226+
var json = mapper.writeValueAsString(cfg);
227+
assertFalse(json.contains("\"model\""));
170228
}
171229

172230
// ===== PermissionRequestResult setRules =====

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ void sessionRpc_model_switchTo_merges_sessionId_with_extra_params() {
183183
var session = new SessionRpc(stub, "sess-xyz");
184184

185185
// switchTo takes extra params beyond sessionId
186-
var switchParams = new SessionModelSwitchToParams(null, "gpt-5", null, null);
186+
var switchParams = new SessionModelSwitchToParams(null, "gpt-5", null, null, null);
187187
session.model.switchTo(switchParams);
188188

189189
assertEquals(1, stub.calls.size());

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ void testHandlerReceivesCorrectEventData() {
180180

181181
SessionStartEvent startEvent = createSessionStartEvent();
182182
startEvent.setData(new SessionStartEvent.SessionStartEventData("my-session-123", null, null, null, null, null,
183-
null, null, null, null, null));
183+
null, null, null, null, null, null));
184184
dispatchEvent(startEvent);
185185

186186
AssistantMessageEvent msgEvent = createAssistantMessageEvent("Test content");
@@ -857,7 +857,7 @@ private SessionStartEvent createSessionStartEvent() {
857857
private SessionStartEvent createSessionStartEvent(String sessionId) {
858858
var event = new SessionStartEvent();
859859
var data = new SessionStartEvent.SessionStartEventData(sessionId, null, null, null, null, null, null, null,
860-
null, null, null);
860+
null, null, null, null);
861861
event.setData(data);
862862
return event;
863863
}

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

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,54 @@ void testHandleHooksInvokeSessionEnd() throws Exception {
262262
assertEquals("summary", output.sessionSummary());
263263
}
264264

265+
// ===== handleHooksInvoke: sessionId deserialization on hook inputs =====
266+
267+
@Test
268+
void testHookInputSessionIdDeserializedForSessionStart() throws Exception {
269+
var hooks = new SessionHooks().setOnSessionStart((hookInput, invocation) -> {
270+
assertEquals("runtime-session-123", hookInput.sessionId());
271+
assertEquals(1735689600L, hookInput.timestamp());
272+
assertEquals("/tmp", hookInput.cwd());
273+
return CompletableFuture.completedFuture(new SessionStartHookOutput(null, null));
274+
});
275+
session.registerHooks(hooks);
276+
277+
JsonNode input = MAPPER.valueToTree(
278+
Map.of("sessionId", "runtime-session-123", "timestamp", 1735689600L, "cwd", "/tmp", "source", "new"));
279+
280+
session.handleHooksInvoke("sessionStart", input).get();
281+
}
282+
283+
@Test
284+
void testHookInputSessionIdDeserializedForSessionEnd() throws Exception {
285+
var hooks = new SessionHooks().setOnSessionEnd((hookInput, invocation) -> {
286+
assertEquals("runtime-session-456", hookInput.sessionId());
287+
assertEquals("user_closed", hookInput.reason());
288+
return CompletableFuture.completedFuture(new SessionEndHookOutput(false, null, null));
289+
});
290+
session.registerHooks(hooks);
291+
292+
JsonNode input = MAPPER.valueToTree(Map.of("sessionId", "runtime-session-456", "timestamp", 1735689600L, "cwd",
293+
"/tmp", "reason", "user_closed"));
294+
295+
session.handleHooksInvoke("sessionEnd", input).get();
296+
}
297+
298+
@Test
299+
void testHookInputSessionIdDeserializedForUserPromptSubmitted() throws Exception {
300+
var hooks = new SessionHooks().setOnUserPromptSubmitted((hookInput, invocation) -> {
301+
assertEquals("runtime-session-789", hookInput.sessionId());
302+
assertEquals("hello", hookInput.prompt());
303+
return CompletableFuture.completedFuture(new UserPromptSubmittedHookOutput(null, null, null));
304+
});
305+
session.registerHooks(hooks);
306+
307+
JsonNode input = MAPPER.valueToTree(
308+
Map.of("sessionId", "runtime-session-789", "timestamp", 1735689600L, "cwd", "/tmp", "prompt", "hello"));
309+
310+
session.handleHooksInvoke("userPromptSubmitted", input).get();
311+
}
312+
265313
// ===== handleHooksInvoke: unhandled hook type =====
266314

267315
@Test

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

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
import org.junit.jupiter.api.Test;
1414

1515
import com.github.copilot.sdk.json.AutoModeSwitchResponse;
16+
import com.github.copilot.sdk.json.CloudSessionOptions;
17+
import com.github.copilot.sdk.json.CloudSessionRepository;
1618
import com.github.copilot.sdk.json.CreateSessionRequest;
1719
import com.github.copilot.sdk.json.DefaultAgentConfig;
1820
import com.github.copilot.sdk.json.ElicitationHandler;
@@ -659,4 +661,50 @@ void testResumeRequestSerializesModeFlags() throws Exception {
659661
assertTrue(json.contains("\"requestExitPlanMode\":true"));
660662
assertTrue(json.contains("\"requestAutoModeSwitch\":true"));
661663
}
664+
665+
// =========================================================================
666+
// Cloud session options wiring
667+
// =========================================================================
668+
669+
@Test
670+
void testBuildCreateRequestPropagatesCloudSessionOptions() throws Exception {
671+
var cloud = new CloudSessionOptions().setRepository(
672+
new CloudSessionRepository().setOwner("my-org").setName("my-repo").setBranch("main"));
673+
var config = new SessionConfig().setCloud(cloud);
674+
675+
CreateSessionRequest request = SessionRequestBuilder.buildCreateRequest(config);
676+
677+
assertNotNull(request.getCloud());
678+
assertEquals("my-org", request.getCloud().getRepository().getOwner());
679+
assertEquals("my-repo", request.getCloud().getRepository().getName());
680+
assertEquals("main", request.getCloud().getRepository().getBranch());
681+
}
682+
683+
@Test
684+
void testBuildCreateRequestOmitsCloudWhenNull() throws Exception {
685+
var config = new SessionConfig();
686+
687+
CreateSessionRequest request = SessionRequestBuilder.buildCreateRequest(config);
688+
var mapper = JsonRpcClient.getObjectMapper();
689+
var json = mapper.writeValueAsString(request);
690+
691+
assertNull(request.getCloud());
692+
assertFalse(json.contains("\"cloud\""), "cloud should be omitted when null");
693+
}
694+
695+
@Test
696+
void testCloudSessionOptionsSerializesCorrectly() throws Exception {
697+
var cloud = new CloudSessionOptions().setRepository(
698+
new CloudSessionRepository().setOwner("acme").setName("widgets").setBranch("feature-1"));
699+
var config = new SessionConfig().setCloud(cloud);
700+
701+
CreateSessionRequest request = SessionRequestBuilder.buildCreateRequest(config);
702+
var mapper = JsonRpcClient.getObjectMapper();
703+
var json = mapper.writeValueAsString(request);
704+
705+
assertTrue(json.contains("\"cloud\""));
706+
assertTrue(json.contains("\"owner\":\"acme\""));
707+
assertTrue(json.contains("\"name\":\"widgets\""));
708+
assertTrue(json.contains("\"branch\":\"feature-1\""));
709+
}
662710
}

src/test/java/com/github/copilot/sdk/generated/rpc/GeneratedRpcApiCoverageTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ void serverRpc_sessionFs_setProvider_invokes_correct_method() {
5858
var stub = new StubCaller();
5959
var server = new ServerRpc(stub);
6060

61-
var params = new SessionFsSetProviderParams("/workspace", "/state", null);
61+
var params = new SessionFsSetProviderParams("/workspace", "/state", null, null);
6262
server.sessionFs.setProvider(params);
6363

6464
assertEquals(1, stub.calls.size());
@@ -649,10 +649,11 @@ void sessionRpc_log_merges_sessionId() {
649649

650650
@Test
651651
void serverRpc_sessionFs_setProvider_params_record() {
652-
var params = new SessionFsSetProviderParams("/workspace", "/state", null);
652+
var params = new SessionFsSetProviderParams("/workspace", "/state", null, null);
653653
assertEquals("/workspace", params.initialCwd());
654654
assertEquals("/state", params.sessionStatePath());
655655
assertNull(params.conventions());
656+
assertNull(params.capabilities());
656657
}
657658

658659
@Test

src/test/java/com/github/copilot/sdk/generated/rpc/GeneratedRpcRecordsCoverageTest.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -320,10 +320,11 @@ void sessionModelGetCurrentParams_record() {
320320

321321
@Test
322322
void sessionModelSwitchToParams_record() {
323-
var params = new SessionModelSwitchToParams("sess-32", "claude-sonnet-4.5", "high", null);
323+
var params = new SessionModelSwitchToParams("sess-32", "claude-sonnet-4.5", "high", null, null);
324324
assertEquals("sess-32", params.sessionId());
325325
assertEquals("claude-sonnet-4.5", params.modelId());
326326
assertEquals("high", params.reasoningEffort());
327+
assertNull(params.reasoningSummary());
327328
assertNull(params.modelCapabilities());
328329
}
329330

@@ -785,11 +786,11 @@ void sessionSkillsEnableResult_empty() {
785786

786787
@Test
787788
void sessionSkillsListResult_nested() {
788-
var item = new Skill("deploy", "Deploy the app", "project", true, true, "/skills/deploy.md");
789+
var item = new Skill("deploy", "Deploy the app", SkillSource.PROJECT, true, true, "/skills/deploy.md");
789790
var result = new SessionSkillsListResult(List.of(item));
790791
assertEquals(1, result.skills().size());
791792
assertEquals("deploy", result.skills().get(0).name());
792-
assertEquals("project", result.skills().get(0).source());
793+
assertEquals(SkillSource.PROJECT, result.skills().get(0).source());
793794
assertTrue(result.skills().get(0).enabled());
794795
}
795796

@@ -871,7 +872,7 @@ void sessionsForkResult_record() {
871872

872873
@Test
873874
void accountGetQuotaResult_nested() {
874-
var snapshot = new AccountQuotaSnapshot(null, 100L, 40L, null, 60.0, 5.0, true, "2026-05-01");
875+
var snapshot = new AccountQuotaSnapshot(null, 100L, 40L, null, 60.0, 5.0, true, java.time.OffsetDateTime.parse("2026-05-01T00:00:00Z"));
875876
var result = new AccountGetQuotaResult(Map.of("chat", snapshot));
876877
assertEquals(1, result.quotaSnapshots().size());
877878
var s = result.quotaSnapshots().get("chat");
@@ -880,7 +881,7 @@ void accountGetQuotaResult_nested() {
880881
assertEquals(60.0, s.remainingPercentage());
881882
assertEquals(5.0, s.overage());
882883
assertTrue(s.overageAllowedWithExhaustedQuota());
883-
assertEquals("2026-05-01", s.resetDate());
884+
assertEquals(java.time.OffsetDateTime.parse("2026-05-01T00:00:00Z"), s.resetDate());
884885
}
885886

886887
@Test
@@ -893,12 +894,12 @@ void mcpConfigListResult_record() {
893894
@Test
894895
void mcpDiscoverResult_nested() {
895896
var server = new DiscoveredMcpServer("discovered-server", DiscoveredMcpServerType.STDIO,
896-
DiscoveredMcpServerSource.USER, true);
897+
McpServerSource.USER, true);
897898
var result = new McpDiscoverResult(List.of(server));
898899
assertEquals(1, result.servers().size());
899900
assertEquals("discovered-server", result.servers().get(0).name());
900901
assertEquals(DiscoveredMcpServerType.STDIO, result.servers().get(0).type());
901-
assertEquals(DiscoveredMcpServerSource.USER, result.servers().get(0).source());
902+
assertEquals(McpServerSource.USER, result.servers().get(0).source());
902903
assertTrue(result.servers().get(0).enabled());
903904
}
904905

@@ -916,7 +917,7 @@ void modelsListResult_nested() {
916917
var supports = new ModelCapabilitiesSupports(true, false);
917918
var limits = new ModelCapabilitiesLimits(100000L, 8192L, 128000L, null);
918919
var capabilities = new ModelCapabilities(supports, limits);
919-
var policy = new ModelPolicy("active", null);
920+
var policy = new ModelPolicy(ModelPolicyState.ENABLED, null);
920921
var billing = new ModelBilling(1.0, null);
921922
var modelItem = new Model("gpt-5", "GPT-5", capabilities, policy, billing, null, null, null, null);
922923
var result = new ModelsListResult(List.of(modelItem));
@@ -927,7 +928,7 @@ void modelsListResult_nested() {
927928
assertTrue(result.models().get(0).capabilities().supports().vision());
928929
assertFalse(result.models().get(0).capabilities().supports().reasoningEffort());
929930
assertEquals(100000L, result.models().get(0).capabilities().limits().maxPromptTokens());
930-
assertEquals("active", result.models().get(0).policy().state());
931+
assertEquals(ModelPolicyState.ENABLED, result.models().get(0).policy().state());
931932
assertEquals(Double.valueOf(1.0), result.models().get(0).billing().multiplier());
932933
}
933934

@@ -950,7 +951,7 @@ void sessionModelSwitchToParams_nested_records() {
950951
var limits = new ModelCapabilitiesOverrideLimits(100000L, 8192L, 128000L, limitsVision);
951952
var supports = new ModelCapabilitiesOverrideSupports(true, true);
952953
var capabilities = new ModelCapabilitiesOverride(supports, limits);
953-
var params = new SessionModelSwitchToParams("sess-m", "gpt-5", null, capabilities);
954+
var params = new SessionModelSwitchToParams("sess-m", "gpt-5", null, null, capabilities);
954955

955956
assertEquals("gpt-5", params.modelId());
956957
assertNotNull(params.modelCapabilities());

0 commit comments

Comments
 (0)