Skip to content

Commit 24edb84

Browse files
committed
test: clear cli attempt broad matchers
1 parent eddf563 commit 24edb84

1 file changed

Lines changed: 98 additions & 106 deletions

File tree

src/agents/command/attempt-execution.cli.test.ts

Lines changed: 98 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,35 @@ async function readSessionFileJsonLines<T>(sessionFile: string): Promise<T[]> {
9292
return entries;
9393
}
9494

95+
function requireRecord(value: unknown, label: string): Record<string, unknown> {
96+
expect(typeof value).toBe("object");
97+
expect(value).not.toBeNull();
98+
if (typeof value !== "object" || value === null) {
99+
throw new Error(`${label} was not an object`);
100+
}
101+
return value as Record<string, unknown>;
102+
}
103+
104+
function expectRecordFields(record: Record<string, unknown>, fields: Record<string, unknown>) {
105+
for (const [key, value] of Object.entries(fields)) {
106+
expect(record[key]).toEqual(value);
107+
}
108+
}
109+
110+
function requireMockArg(mock: typeof runCliAgentMock, callIndex: number, label: string) {
111+
const arg = mock.mock.calls[callIndex]?.[0];
112+
expect(arg).toBeDefined();
113+
return requireRecord(arg, label);
114+
}
115+
116+
function expectMockArgFields(
117+
mock: typeof runCliAgentMock,
118+
fields: Record<string, unknown>,
119+
callIndex = 0,
120+
) {
121+
expectRecordFields(requireMockArg(mock, callIndex, "mock call argument"), fields);
122+
}
123+
95124
describe("CLI attempt execution", () => {
96125
let tmpDir: string;
97126
let storePath: string;
@@ -397,23 +426,26 @@ describe("CLI attempt execution", () => {
397426
throw new Error("expected CLI transcript persistence to create a session file");
398427
}
399428
const entries = await readSessionFileEntries(sessionFile);
400-
expect(entries[0]).toMatchObject({
429+
expectRecordFields(requireRecord(entries[0], "session entry"), {
401430
type: "session",
402431
id: sessionEntry.sessionId,
403432
cwd: tmpDir,
404433
});
405-
expect(entries[1]).toMatchObject({ type: "message", parentId: null });
406-
expect(entries[2]).toMatchObject({
434+
expectRecordFields(requireRecord(entries[1], "user transcript entry"), {
435+
type: "message",
436+
parentId: null,
437+
});
438+
expectRecordFields(requireRecord(entries[2], "assistant transcript entry"), {
407439
type: "message",
408440
parentId: entries[1]?.id,
409441
});
410442
const messages = await readSessionMessages(sessionFile);
411443
expect(messages).toHaveLength(2);
412-
expect(messages[0]).toMatchObject({
444+
expectRecordFields(requireRecord(messages[0], "user message"), {
413445
role: "user",
414446
content: "persist this",
415447
});
416-
expect(messages[1]).toMatchObject({
448+
expectRecordFields(requireRecord(messages[1], "assistant message"), {
417449
role: "assistant",
418450
api: "cli",
419451
provider: "claude-cli",
@@ -456,7 +488,7 @@ describe("CLI attempt execution", () => {
456488

457489
let messages = await readSessionMessages(updatedFirst?.sessionFile ?? "");
458490
expect(messages).toHaveLength(1);
459-
expect(messages[0]).toMatchObject({
491+
expectRecordFields(requireRecord(messages[0], "assistant message"), {
460492
role: "assistant",
461493
content: [{ type: "text", text: "already mirrored" }],
462494
});
@@ -545,7 +577,7 @@ describe("CLI attempt execution", () => {
545577
const messages = await readSessionMessages(sessionFile);
546578
expect(messages).toHaveLength(3);
547579
expect(messages.map((message) => message.role)).toEqual(["assistant", "user", "assistant"]);
548-
expect(messages[2]).toMatchObject({
580+
expectRecordFields(requireRecord(messages[2], "deduped assistant message"), {
549581
content: [{ type: "text", text: "same answer" }],
550582
});
551583
});
@@ -580,7 +612,7 @@ describe("CLI attempt execution", () => {
580612
});
581613

582614
const messages = await readSessionMessages(updatedEntry?.sessionFile ?? "");
583-
expect(messages[0]).toMatchObject({
615+
expectRecordFields(requireRecord(messages[0], "transcript user message"), {
584616
role: "user",
585617
content: "visible ask",
586618
});
@@ -630,13 +662,11 @@ describe("CLI attempt execution", () => {
630662
});
631663

632664
expect(runCliAgentMock).toHaveBeenCalledTimes(1);
633-
expect(runCliAgentMock).toHaveBeenCalledWith(
634-
expect.objectContaining({
635-
trigger: "user",
636-
messageChannel: "discord",
637-
messageProvider: "discord-voice",
638-
}),
639-
);
665+
expectMockArgFields(runCliAgentMock, {
666+
trigger: "user",
667+
messageChannel: "discord",
668+
messageProvider: "discord-voice",
669+
});
640670
});
641671

642672
it("forwards runtime toolsAllow into CLI attempts so the CLI harness can fail closed", async () => {
@@ -682,12 +712,10 @@ describe("CLI attempt execution", () => {
682712
sessionHasHistory: false,
683713
});
684714

685-
expect(runCliAgentMock).toHaveBeenCalledWith(
686-
expect.objectContaining({
687-
provider: "claude-cli",
688-
toolsAllow: ["read", "web_search"],
689-
}),
690-
);
715+
expectMockArgFields(runCliAgentMock, {
716+
provider: "claude-cli",
717+
toolsAllow: ["read", "web_search"],
718+
});
691719
});
692720

693721
it("routes canonical Anthropic models through the configured Claude CLI runtime", async () => {
@@ -739,12 +767,10 @@ describe("CLI attempt execution", () => {
739767
});
740768

741769
expect(runEmbeddedPiAgentMock).not.toHaveBeenCalled();
742-
expect(runCliAgentMock).toHaveBeenCalledWith(
743-
expect.objectContaining({
744-
provider: "claude-cli",
745-
model: "claude-opus-4-7",
746-
}),
747-
);
770+
expectMockArgFields(runCliAgentMock, {
771+
provider: "claude-cli",
772+
model: "claude-opus-4-7",
773+
});
748774
});
749775

750776
it("routes canonical OpenAI models through the configured Codex CLI runtime", async () => {
@@ -796,12 +822,10 @@ describe("CLI attempt execution", () => {
796822
});
797823

798824
expect(runEmbeddedPiAgentMock).not.toHaveBeenCalled();
799-
expect(runCliAgentMock).toHaveBeenCalledWith(
800-
expect.objectContaining({
801-
provider: "codex-cli",
802-
model: "gpt-5.4",
803-
}),
804-
);
825+
expectMockArgFields(runCliAgentMock, {
826+
provider: "codex-cli",
827+
model: "gpt-5.4",
828+
});
805829
});
806830

807831
it("keeps one-shot model runs on the raw embedded provider path", async () => {
@@ -863,19 +887,17 @@ describe("CLI attempt execution", () => {
863887
});
864888

865889
expect(runCliAgentMock).not.toHaveBeenCalled();
866-
expect(runEmbeddedPiAgentMock).toHaveBeenCalledWith(
867-
expect.objectContaining({
868-
provider: "anthropic",
869-
model: "claude-opus-4-7",
870-
agentHarnessId: "pi",
871-
prompt: "raw prompt",
872-
messageChannel: "discord",
873-
messageProvider: "discord-voice",
874-
modelRun: true,
875-
promptMode: "none",
876-
disableTools: true,
877-
}),
878-
);
890+
expectMockArgFields(runEmbeddedPiAgentMock, {
891+
provider: "anthropic",
892+
model: "claude-opus-4-7",
893+
agentHarnessId: "pi",
894+
prompt: "raw prompt",
895+
messageChannel: "discord",
896+
messageProvider: "discord-voice",
897+
modelRun: true,
898+
promptMode: "none",
899+
disableTools: true,
900+
});
879901
expect(runEmbeddedPiAgentMock.mock.calls[0]?.[0]?.prompt).not.toContain(
880902
"[Inter-session message]",
881903
);
@@ -931,13 +953,11 @@ describe("CLI attempt execution", () => {
931953
sessionHasHistory: false,
932954
});
933955

934-
expect(runEmbeddedPiAgentMock).toHaveBeenCalledWith(
935-
expect.objectContaining({
936-
provider: "openai",
937-
model: "gpt-5.4",
938-
bashElevated,
939-
}),
940-
);
956+
expectMockArgFields(runEmbeddedPiAgentMock, {
957+
provider: "openai",
958+
model: "gpt-5.4",
959+
bashElevated,
960+
});
941961
});
942962

943963
it("forwards one-shot CLI cleanup to CLI providers", async () => {
@@ -984,12 +1004,10 @@ describe("CLI attempt execution", () => {
9841004
sessionHasHistory: false,
9851005
});
9861006

987-
expect(runCliAgentMock).toHaveBeenCalledWith(
988-
expect.objectContaining({
989-
cleanupBundleMcpOnRunEnd: true,
990-
cleanupCliLiveSessionOnRunEnd: true,
991-
}),
992-
);
1007+
expectMockArgFields(runCliAgentMock, {
1008+
cleanupBundleMcpOnRunEnd: true,
1009+
cleanupCliLiveSessionOnRunEnd: true,
1010+
});
9931011
expect(runEmbeddedPiAgentMock).not.toHaveBeenCalled();
9941012
});
9951013
});
@@ -1044,11 +1062,7 @@ describe("embedded attempt harness pinning", () => {
10441062
sessionHasHistory: true,
10451063
});
10461064

1047-
expect(runEmbeddedPiAgent).toHaveBeenCalledWith(
1048-
expect.objectContaining({
1049-
agentHarnessId: undefined,
1050-
}),
1051-
);
1065+
expectMockArgFields(runEmbeddedPiAgentMock, { agentHarnessId: undefined });
10521066
});
10531067

10541068
it("ignores stale session Codex harness pins on non-OpenAI model switches", async () => {
@@ -1089,11 +1103,7 @@ describe("embedded attempt harness pinning", () => {
10891103
sessionHasHistory: true,
10901104
});
10911105

1092-
expect(runEmbeddedPiAgent).toHaveBeenCalledWith(
1093-
expect.objectContaining({
1094-
agentHarnessId: undefined,
1095-
}),
1096-
);
1106+
expectMockArgFields(runEmbeddedPiAgentMock, { agentHarnessId: undefined });
10971107
});
10981108

10991109
it("forwards runtime toolsAllow into embedded attempts", async () => {
@@ -1136,11 +1146,7 @@ describe("embedded attempt harness pinning", () => {
11361146
sessionHasHistory: false,
11371147
});
11381148

1139-
expect(runEmbeddedPiAgent).toHaveBeenCalledWith(
1140-
expect.objectContaining({
1141-
toolsAllow: ["read", "web_search"],
1142-
}),
1143-
);
1149+
expectMockArgFields(runEmbeddedPiAgentMock, { toolsAllow: ["read", "web_search"] });
11441150
});
11451151

11461152
it("lets provider/model runtime policy choose Codex without storing a session harness pin", async () => {
@@ -1190,11 +1196,7 @@ describe("embedded attempt harness pinning", () => {
11901196
sessionHasHistory: true,
11911197
});
11921198

1193-
expect(runEmbeddedPiAgent).toHaveBeenCalledWith(
1194-
expect.objectContaining({
1195-
agentHarnessId: undefined,
1196-
}),
1197-
);
1199+
expectMockArgFields(runEmbeddedPiAgentMock, { agentHarnessId: undefined });
11981200
});
11991201

12001202
it("auto-forwards OpenAI Codex auth profiles to default Codex harness runs", async () => {
@@ -1249,13 +1251,11 @@ describe("embedded attempt harness pinning", () => {
12491251
sessionHasHistory: true,
12501252
});
12511253

1252-
expect(runEmbeddedPiAgent).toHaveBeenCalledWith(
1253-
expect.objectContaining({
1254-
agentHarnessId: undefined,
1255-
authProfileId: "openai-codex:work",
1256-
authProfileIdSource: "auto",
1257-
}),
1258-
);
1254+
expectMockArgFields(runEmbeddedPiAgentMock, {
1255+
agentHarnessId: undefined,
1256+
authProfileId: "openai-codex:work",
1257+
authProfileIdSource: "auto",
1258+
});
12591259
});
12601260

12611261
it("pins a fresh OpenAI session to the Codex harness by default", async () => {
@@ -1295,11 +1295,7 @@ describe("embedded attempt harness pinning", () => {
12951295
sessionHasHistory: false,
12961296
});
12971297

1298-
expect(runEmbeddedPiAgent).toHaveBeenCalledWith(
1299-
expect.objectContaining({
1300-
agentHarnessId: undefined,
1301-
}),
1302-
);
1298+
expectMockArgFields(runEmbeddedPiAgentMock, { agentHarnessId: undefined });
13031299
});
13041300

13051301
it("ignores stale OpenAI sessions pinned to PI and relies on default Codex routing", async () => {
@@ -1340,12 +1336,10 @@ describe("embedded attempt harness pinning", () => {
13401336
sessionHasHistory: true,
13411337
});
13421338

1343-
expect(runEmbeddedPiAgentMock).toHaveBeenCalledWith(
1344-
expect.objectContaining({
1345-
provider: "openai",
1346-
agentHarnessId: undefined,
1347-
}),
1348-
);
1339+
expectMockArgFields(runEmbeddedPiAgentMock, {
1340+
provider: "openai",
1341+
agentHarnessId: undefined,
1342+
});
13491343
});
13501344

13511345
it("routes explicit OpenAI PI runs with Codex OAuth through the legacy Codex auth transport", async () => {
@@ -1397,15 +1391,13 @@ describe("embedded attempt harness pinning", () => {
13971391
sessionHasHistory: false,
13981392
});
13991393

1400-
expect(runEmbeddedPiAgentMock).toHaveBeenCalledWith(
1401-
expect.objectContaining({
1402-
provider: "openai-codex",
1403-
model: "gpt-5.4",
1404-
agentHarnessId: undefined,
1405-
authProfileId: "openai-codex:work",
1406-
authProfileIdSource: "user",
1407-
}),
1408-
);
1394+
expectMockArgFields(runEmbeddedPiAgentMock, {
1395+
provider: "openai-codex",
1396+
model: "gpt-5.4",
1397+
agentHarnessId: undefined,
1398+
authProfileId: "openai-codex:work",
1399+
authProfileIdSource: "user",
1400+
});
14091401
});
14101402

14111403
it("does not pass CLI runtime aliases as embedded harness ids for fallback providers", async () => {

0 commit comments

Comments
 (0)