























@@ -80,6 +80,15 @@ function withDefaultModel(primary: string): OpenClawConfig {
8080} as OpenClawConfig;
8181}
828283+function expectFields(value: unknown, expected: Record<string, unknown>): void {
84+expect(value).toBeTypeOf("object");
85+expect(value).not.toBeNull();
86+const record = value as Record<string, unknown>;
87+for (const [key, expectedValue] of Object.entries(expected)) {
88+expect(record[key], key).toEqual(expectedValue);
89+}
90+}
91+8392async function stubPdfToolInfra(
8493agentDir: string,
8594params?: {
@@ -257,9 +266,7 @@ describe("createPdfTool", () => {
257266await withConfiguredPdfTool(async (tool) => {
258267const manyPdfs = Array.from({ length: 15 }, (_, i) => `/tmp/doc${i}.pdf`);
259268const result = await tool.execute("t1", { prompt: "test", pdfs: manyPdfs });
260-expect(result).toMatchObject({
261-details: { error: "too_many_pdfs" },
262-});
269+expectFields(result.details, { error: "too_many_pdfs" });
263270});
264271});
265272@@ -297,9 +304,7 @@ describe("createPdfTool", () => {
297304prompt: "test",
298305pdf: "ftp://example.com/doc.pdf",
299306});
300-expect(result).toMatchObject({
301-details: { error: "unsupported_pdf_reference" },
302-});
307+expectFields(result.details, { error: "unsupported_pdf_reference" });
303308});
304309});
305310@@ -326,15 +331,13 @@ describe("createPdfTool", () => {
326331pdf: `media://inbound/${mediaId}`,
327332});
328333329-expect(loadSpy).toHaveBeenCalledWith(
330-`media://inbound/${mediaId}`,
331-expect.objectContaining({
332-localRoots: [],
333-}),
334-);
335-expect(result).toMatchObject({
336-content: [{ type: "text", text: "native summary" }],
337-details: { native: true, model: ANTHROPIC_PDF_MODEL },
334+const [loadRef, loadOptions] = loadSpy.mock.calls[0] ?? [];
335+expect(loadRef).toBe(`media://inbound/${mediaId}`);
336+expectFields(loadOptions, { localRoots: [] });
337+expect(result.content).toEqual([{ type: "text", text: "native summary" }]);
338+expectFields(result.details, {
339+native: true,
340+model: ANTHROPIC_PDF_MODEL,
338341});
339342});
340343});
@@ -364,12 +367,11 @@ describe("createPdfTool", () => {
364367pdf: "http://198.18.0.153/doc.pdf",
365368});
366369367-expect(loadSpy).toHaveBeenCalledWith(
368-"http://198.18.0.153/doc.pdf",
369-expect.objectContaining({
370-ssrfPolicy: { allowRfc2544BenchmarkRange: true },
371-}),
372-);
370+const [loadRef, loadOptions] = loadSpy.mock.calls[0] ?? [];
371+expect(loadRef).toBe("http://198.18.0.153/doc.pdf");
372+expectFields(loadOptions, {
373+ssrfPolicy: { allowRfc2544BenchmarkRange: true },
374+});
373375});
374376});
375377@@ -396,7 +398,9 @@ describe("createPdfTool", () => {
396398pdf: mediaPath,
397399});
398400399-expect(loadSpy).toHaveBeenCalledWith(mediaPath, expect.any(Object));
401+const [loadRef, loadOptions] = loadSpy.mock.calls[0] ?? [];
402+expect(loadRef).toBe(mediaPath);
403+expect(loadOptions).toBeTypeOf("object");
400404});
401405});
402406});
@@ -417,21 +421,22 @@ describe("createPdfTool", () => {
417421pdf: "/tmp/doc.pdf",
418422});
419423420-expect(modelsConfig.ensureOpenClawModelsJson).toHaveBeenCalledWith(
421-expect.objectContaining({
422-agents: expect.objectContaining({
423-defaults: expect.objectContaining({
424-pdfModel: { primary: ANTHROPIC_PDF_MODEL },
425-}),
426-}),
427-}),
428-agentDir,
429-{ workspaceDir },
424+const ensureModelsJsonMock = vi.mocked(modelsConfig.ensureOpenClawModelsJson);
425+const [modelsConfigArg, modelsAgentDir, modelsOptions] =
426+ensureModelsJsonMock.mock.calls[0] ?? [];
427+expectFields(
428+(modelsConfigArg as { agents?: { defaults?: unknown } } | undefined)?.agents?.defaults,
429+{
430+pdfModel: { primary: ANTHROPIC_PDF_MODEL },
431+},
430432);
433+expect(modelsAgentDir).toBe(agentDir);
434+expect(modelsOptions).toEqual({ workspaceDir });
431435expect(extractSpy).not.toHaveBeenCalled();
432-expect(result).toMatchObject({
433-content: [{ type: "text", text: "native summary" }],
434-details: { native: true, model: ANTHROPIC_PDF_MODEL },
436+expect(result.content).toEqual([{ type: "text", text: "native summary" }]);
437+expectFields(result.details, {
438+native: true,
439+model: ANTHROPIC_PDF_MODEL,
435440});
436441});
437442});
@@ -474,9 +479,10 @@ describe("createPdfTool", () => {
474479});
475480476481expect(extractSpy).toHaveBeenCalledTimes(1);
477-expect(result).toMatchObject({
478-content: [{ type: "text", text: "fallback summary" }],
479-details: { native: false, model: OPENAI_PDF_MODEL },
482+expect(result.content).toEqual([{ type: "text", text: "fallback summary" }]);
483+expectFields(result.details, {
484+native: false,
485+model: OPENAI_PDF_MODEL,
480486});
481487const [, context] = completeMock.mock.calls[0] ?? [];
482488expect(context?.systemPrompt).toBeUndefined();
@@ -510,9 +516,10 @@ describe("createPdfTool", () => {
510516pdf: "/tmp/doc.pdf",
511517});
512518513-expect(result).toMatchObject({
514-content: [{ type: "text", text: "codex summary" }],
515-details: { native: false, model: CODEX_PDF_MODEL },
519+expect(result.content).toEqual([{ type: "text", text: "codex summary" }]);
520+expectFields(result.details, {
521+native: false,
522+model: CODEX_PDF_MODEL,
516523});
517524expect(completeMock).toHaveBeenCalledTimes(1);
518525const [, context] = completeMock.mock.calls[0] ?? [];
@@ -547,9 +554,10 @@ describe("createPdfTool", () => {
547554pdf: "/tmp/doc.pdf",
548555});
549556550-expect(result).toMatchObject({
551-content: [{ type: "text", text: "codex summary" }],
552-details: { native: false, model: CODEX_PDF_MODEL },
557+expect(result.content).toEqual([{ type: "text", text: "codex summary" }]);
558+expectFields(result.details, {
559+native: false,
560+model: CODEX_PDF_MODEL,
553561});
554562expect(completeMock).toHaveBeenCalledTimes(1);
555563const [, context] = completeMock.mock.calls[0] ?? [];
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。