


























@@ -36,6 +36,7 @@ describe("firecrawl tools", () => {
3636let createFirecrawlSearchTool: typeof import("./firecrawl-search-tool.js").createFirecrawlSearchTool;
3737let createFirecrawlScrapeTool: typeof import("./firecrawl-scrape-tool.js").createFirecrawlScrapeTool;
3838let firecrawlClientTesting: typeof import("./firecrawl-client.js").__testing;
39+let runActualFirecrawlSearch: typeof import("./firecrawl-client.js").runFirecrawlSearch;
3940let runActualFirecrawlScrape: typeof import("./firecrawl-client.js").runFirecrawlScrape;
4041let ssrfMock: { mockRestore: () => void } | undefined;
4142@@ -45,8 +46,11 @@ describe("firecrawl tools", () => {
4546({ createFirecrawlWebSearchProvider } = await import("./firecrawl-search-provider.js"));
4647({ createFirecrawlSearchTool } = await import("./firecrawl-search-tool.js"));
4748({ createFirecrawlScrapeTool } = await import("./firecrawl-scrape-tool.js"));
48-({ __testing: firecrawlClientTesting, runFirecrawlScrape: runActualFirecrawlScrape } =
49-await vi.importActual<typeof import("./firecrawl-client.js")>("./firecrawl-client.js"));
49+({
50+__testing: firecrawlClientTesting,
51+runFirecrawlSearch: runActualFirecrawlSearch,
52+runFirecrawlScrape: runActualFirecrawlScrape,
53+} = await vi.importActual<typeof import("./firecrawl-client.js")>("./firecrawl-client.js"));
5054});
51555256beforeEach(() => {
@@ -729,6 +733,67 @@ describe("firecrawl tools", () => {
729733expect(result.success).toBe(true);
730734});
731735736+it("reports malformed Firecrawl search JSON with a stable provider error", async () => {
737+global.fetch = vi.fn(
738+async () =>
739+new Response("{ nope", {
740+status: 200,
741+headers: { "content-type": "application/json" },
742+}),
743+) as typeof fetch;
744+745+await expect(
746+runActualFirecrawlSearch({
747+cfg: {
748+plugins: {
749+entries: {
750+firecrawl: {
751+config: {
752+webSearch: {
753+apiKey: "firecrawl-key",
754+baseUrl: "https://api.firecrawl.dev",
755+},
756+},
757+},
758+},
759+},
760+} as OpenClawConfig,
761+query: "openclaw malformed search",
762+}),
763+).rejects.toThrow("Firecrawl Search API error: malformed JSON response");
764+});
765+766+it("reports malformed Firecrawl scrape JSON with a stable provider error", async () => {
767+global.fetch = vi.fn(
768+async () =>
769+new Response("{ nope", {
770+status: 200,
771+headers: { "content-type": "application/json" },
772+}),
773+) as typeof fetch;
774+775+await expect(
776+runActualFirecrawlScrape({
777+cfg: {
778+plugins: {
779+entries: {
780+firecrawl: {
781+config: {
782+webFetch: {
783+apiKey: "firecrawl-key",
784+baseUrl: "https://api.firecrawl.dev",
785+},
786+},
787+},
788+},
789+},
790+} as OpenClawConfig,
791+url: "https://example.com/firecrawl-malformed-scrape",
792+extractMode: "markdown",
793+}),
794+).rejects.toThrow("Firecrawl fetch failed: malformed JSON response");
795+});
796+732797it("respects positive numeric overrides for scrape and cache behavior", () => {
733798const cfg = {
734799tools: {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。