Skip to content

Commit 9ac871c

Browse files
committed
test: tighten deepseek provider assertions
1 parent 2ea4f79 commit 9ac871c

1 file changed

Lines changed: 66 additions & 55 deletions

File tree

extensions/deepseek/index.test.ts

Lines changed: 66 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,19 @@ type PayloadCapture = {
1616
payload?: Record<string, unknown>;
1717
};
1818

19+
type ThinkingPayload = {
20+
type?: unknown;
21+
};
22+
23+
type ReplayToolCall = {
24+
id?: unknown;
25+
type?: unknown;
26+
function?: {
27+
name?: unknown;
28+
arguments?: unknown;
29+
};
30+
};
31+
1932
type RegisteredProvider = Awaited<ReturnType<typeof registerSingleProviderPlugin>>;
2033

2134
const emptyUsage = {
@@ -140,6 +153,23 @@ function requireThinkingWrapper(
140153
return wrapper;
141154
}
142155

156+
function readThinking(payload: Record<string, unknown> | undefined): ThinkingPayload | undefined {
157+
return payload?.thinking as ThinkingPayload | undefined;
158+
}
159+
160+
function readPayloadMessage(
161+
capture: PayloadCapture,
162+
index: number,
163+
): Record<string, unknown> | undefined {
164+
return (capture.payload?.messages as Array<Record<string, unknown>> | undefined)?.[index];
165+
}
166+
167+
function readFirstToolCall(
168+
message: Record<string, unknown> | undefined,
169+
): ReplayToolCall | undefined {
170+
return (message?.tool_calls as ReplayToolCall[] | undefined)?.[0];
171+
}
172+
143173
describe("deepseek provider plugin", () => {
144174
it("registers DeepSeek with api-key auth wizard metadata", async () => {
145175
const provider = await registerSingleProviderPlugin(deepseekPlugin);
@@ -152,10 +182,11 @@ describe("deepseek provider plugin", () => {
152182
expect(provider.label).toBe("DeepSeek");
153183
expect(provider.envVars).toEqual(["DEEPSEEK_API_KEY"]);
154184
expect(provider.auth).toHaveLength(1);
155-
expect(resolved).toMatchObject({
156-
provider: { id: "deepseek" },
157-
method: { id: "api-key" },
158-
});
185+
if (!resolved) {
186+
throw new Error("expected DeepSeek api-key auth choice");
187+
}
188+
expect(resolved.provider.id).toBe("deepseek");
189+
expect(resolved.method.id).toBe("api-key");
159190
});
160191

161192
it("builds the static DeepSeek model catalog", async () => {
@@ -184,14 +215,11 @@ describe("deepseek provider plugin", () => {
184215
it("owns OpenAI-compatible replay policy", async () => {
185216
const provider = await registerSingleProviderPlugin(deepseekPlugin);
186217

187-
expect(provider.buildReplayPolicy?.({ modelApi: "openai-completions" } as never)).toMatchObject(
188-
{
189-
sanitizeToolCallIds: true,
190-
toolCallIdMode: "strict",
191-
validateGeminiTurns: true,
192-
validateAnthropicTurns: true,
193-
},
194-
);
218+
const replayPolicy = provider.buildReplayPolicy?.({ modelApi: "openai-completions" } as never);
219+
expect(replayPolicy?.sanitizeToolCallIds).toBe(true);
220+
expect(replayPolicy?.toolCallIdMode).toBe("strict");
221+
expect(replayPolicy?.validateGeminiTurns).toBe(true);
222+
expect(replayPolicy?.validateAnthropicTurns).toBe(true);
195223
});
196224

197225
it("advertises max thinking levels for DeepSeek V4 models only", async () => {
@@ -256,7 +284,7 @@ describe("deepseek provider plugin", () => {
256284
{},
257285
);
258286

259-
expect(capturedPayload).toMatchObject({ thinking: { type: "disabled" } });
287+
expect(readThinking(capturedPayload)?.type).toBe("disabled");
260288
expect(capturedPayload).not.toHaveProperty("reasoning_effort");
261289

262290
const wrapThinkingXhigh = requireThinkingWrapper(
@@ -273,10 +301,8 @@ describe("deepseek provider plugin", () => {
273301
{},
274302
);
275303

276-
expect(capturedPayload).toMatchObject({
277-
thinking: { type: "enabled" },
278-
reasoning_effort: "max",
279-
});
304+
expect(readThinking(capturedPayload)?.type).toBe("enabled");
305+
expect(capturedPayload?.reasoning_effort).toBe("max");
280306
});
281307

282308
it("preserves replayed reasoning_content when DeepSeek V4 thinking is enabled", async () => {
@@ -291,24 +317,16 @@ describe("deepseek provider plugin", () => {
291317
);
292318
await wrapThinkingHigh(model, context, {});
293319

294-
expect(capture.payload).toMatchObject({
295-
thinking: { type: "enabled" },
296-
reasoning_effort: "high",
297-
});
298-
expect((capture.payload?.messages as Array<Record<string, unknown>>)[1]).toMatchObject({
299-
role: "assistant",
300-
reasoning_content: "call reasoning",
301-
tool_calls: [
302-
{
303-
id: "call_1",
304-
type: "function",
305-
function: {
306-
name: "read",
307-
arguments: "{}",
308-
},
309-
},
310-
],
311-
});
320+
expect(readThinking(capture.payload)?.type).toBe("enabled");
321+
expect(capture.payload?.reasoning_effort).toBe("high");
322+
const assistantMessage = readPayloadMessage(capture, 1);
323+
expect(assistantMessage?.role).toBe("assistant");
324+
expect(assistantMessage?.reasoning_content).toBe("call reasoning");
325+
const toolCall = readFirstToolCall(assistantMessage);
326+
expect(toolCall?.id).toBe("call_1");
327+
expect(toolCall?.type).toBe("function");
328+
expect(toolCall?.function?.name).toBe("read");
329+
expect(toolCall?.function?.arguments).toBe("{}");
312330
});
313331

314332
it("adds blank reasoning_content for replayed tool calls from non-DeepSeek turns", async () => {
@@ -330,20 +348,14 @@ describe("deepseek provider plugin", () => {
330348
);
331349
await wrapThinkingHigh(model, context, {});
332350

333-
expect((capture.payload?.messages as Array<Record<string, unknown>>)[1]).toMatchObject({
334-
role: "assistant",
335-
reasoning_content: "",
336-
tool_calls: [
337-
{
338-
id: "call_1",
339-
type: "function",
340-
function: {
341-
name: "read",
342-
arguments: "{}",
343-
},
344-
},
345-
],
346-
});
351+
const assistantMessage = readPayloadMessage(capture, 1);
352+
expect(assistantMessage?.role).toBe("assistant");
353+
expect(assistantMessage?.reasoning_content).toBe("");
354+
const toolCall = readFirstToolCall(assistantMessage);
355+
expect(toolCall?.id).toBe("call_1");
356+
expect(toolCall?.type).toBe("function");
357+
expect(toolCall?.function?.name).toBe("read");
358+
expect(toolCall?.function?.arguments).toBe("{}");
347359
});
348360

349361
it("adds blank reasoning_content for replayed plain assistant messages", async () => {
@@ -369,11 +381,10 @@ describe("deepseek provider plugin", () => {
369381
);
370382
await wrapThinkingHigh(model, context, {});
371383

372-
expect((capture.payload?.messages as Array<Record<string, unknown>>)[1]).toMatchObject({
373-
role: "assistant",
374-
content: "Hello.",
375-
reasoning_content: "",
376-
});
384+
const assistantMessage = readPayloadMessage(capture, 1);
385+
expect(assistantMessage?.role).toBe("assistant");
386+
expect(assistantMessage?.content).toBe("Hello.");
387+
expect(assistantMessage?.reasoning_content).toBe("");
377388
});
378389

379390
it("strips replayed reasoning_content when DeepSeek V4 thinking is disabled", async () => {
@@ -388,7 +399,7 @@ describe("deepseek provider plugin", () => {
388399
);
389400
await wrapThinkingNone(model, context, {});
390401

391-
expect(capture.payload).toMatchObject({ thinking: { type: "disabled" } });
402+
expect(readThinking(capture.payload)?.type).toBe("disabled");
392403
expect(capture.payload).not.toHaveProperty("reasoning_effort");
393404
expect((capture.payload?.messages as Array<Record<string, unknown>>)[1]).not.toHaveProperty(
394405
"reasoning_content",

0 commit comments

Comments
 (0)