test: enable noUncheckedIndexedAccess for extension tests (#105343)

This commit is contained in:
Peter Steinberger
2026-07-12 12:48:22 +01:00
committed by GitHub
parent 5819f837a9
commit 81941f2d68
158 changed files with 2110 additions and 1074 deletions
@@ -1,9 +1,14 @@
// Firecrawl tests cover firecrawl client behavior — URL safety,
// scrape payload parsing, and search-item extraction.
import { expectDefined } from "@openclaw/normalization-core";
import { afterAll, beforeAll, describe, expect, it, vi } from "vitest";
let firecrawlClient: typeof import("./firecrawl-client.js").testing;
function requireSearchResult<T>(results: readonly T[], index: number): T {
return expectDefined(results[index], `firecrawl search result ${index}`);
}
beforeAll(async () => {
firecrawlClient = (
await vi.importActual<typeof import("./firecrawl-client.js")>("./firecrawl-client.js")
@@ -117,8 +122,14 @@ describe("resolveSearchItems", () => {
});
expect(result).toHaveLength(2);
expect(result[0]).toMatchObject({ url: "https://example.com", title: "Example" });
expect(result[1]).toMatchObject({ url: "https://openclaw.ai", title: "OpenClaw" });
expect(requireSearchResult(result, 0)).toMatchObject({
url: "https://example.com",
title: "Example",
});
expect(requireSearchResult(result, 1)).toMatchObject({
url: "https://openclaw.ai",
title: "OpenClaw",
});
});
it("extracts items from a results array", () => {
@@ -127,8 +138,8 @@ describe("resolveSearchItems", () => {
});
expect(result).toHaveLength(1);
expect(result[0].url).toBe("https://example.org");
expect(result[0].title).toBe("Org");
expect(requireSearchResult(result, 0).url).toBe("https://example.org");
expect(requireSearchResult(result, 0).title).toBe("Org");
});
it("extracts items from data.results (nested)", () => {
@@ -152,7 +163,7 @@ describe("resolveSearchItems", () => {
});
expect(result).toHaveLength(1);
expect(result[0].url).toBe("https://example.com/nested");
expect(requireSearchResult(result, 0).url).toBe("https://example.com/nested");
});
it("extracts items from data.web array (Firecrawl web search format)", () => {
@@ -163,8 +174,8 @@ describe("resolveSearchItems", () => {
});
expect(result).toHaveLength(1);
expect(result[0].url).toBe("https://example.com/web");
expect(result[0].title).toBe("Web Result");
expect(requireSearchResult(result, 0).url).toBe("https://example.com/web");
expect(requireSearchResult(result, 0).title).toBe("Web Result");
});
it("extracts items from web.results (top-level)", () => {
@@ -175,7 +186,7 @@ describe("resolveSearchItems", () => {
});
expect(result).toHaveLength(1);
expect(result[0].url).toBe("https://example.com/top-web");
expect(requireSearchResult(result, 0).url).toBe("https://example.com/top-web");
});
it("returns an empty array when no search items are present", () => {
@@ -198,7 +209,7 @@ describe("resolveSearchItems", () => {
});
expect(result).toHaveLength(1);
expect(result[0].title).toBe("OK");
expect(requireSearchResult(result, 0).title).toBe("OK");
});
it("resolves URL from alternate fields: sourceURL, sourceUrl, metadata.sourceURL", () => {
@@ -229,9 +240,9 @@ describe("resolveSearchItems", () => {
],
});
expect(result[0].description).toBe("explicit desc");
expect(result[1].description).toBe("snippet text");
expect(result[2].description).toBe("summary text");
expect(requireSearchResult(result, 0).description).toBe("explicit desc");
expect(requireSearchResult(result, 1).description).toBe("snippet text");
expect(requireSearchResult(result, 2).description).toBe("summary text");
});
it("reads content from multiple possible fields", () => {
@@ -243,9 +254,9 @@ describe("resolveSearchItems", () => {
],
});
expect(result[0].content).toBe("# md");
expect(result[1].content).toBe("plain content");
expect(result[2].content).toBe("raw text");
expect(requireSearchResult(result, 0).content).toBe("# md");
expect(requireSearchResult(result, 1).content).toBe("plain content");
expect(requireSearchResult(result, 2).content).toBe("raw text");
});
it("reads published date from multiple possible fields", () => {
@@ -258,10 +269,10 @@ describe("resolveSearchItems", () => {
],
});
expect(result[0].published).toBe("2025-01-01");
expect(result[1].published).toBe("2025-02-02");
expect(result[2].published).toBe("2025-03-03");
expect(result[3].published).toBe("2025-04-04");
expect(requireSearchResult(result, 0).published).toBe("2025-01-01");
expect(requireSearchResult(result, 1).published).toBe("2025-02-02");
expect(requireSearchResult(result, 2).published).toBe("2025-03-03");
expect(requireSearchResult(result, 3).published).toBe("2025-04-04");
});
it("resolves siteName by stripping www. prefix from URL hostname", () => {
@@ -272,8 +283,8 @@ describe("resolveSearchItems", () => {
],
});
expect(result[0].siteName).toBe("example.com");
expect(result[1].siteName).toBe("example.org");
expect(requireSearchResult(result, 0).siteName).toBe("example.com");
expect(requireSearchResult(result, 1).siteName).toBe("example.org");
});
it("sets description and content to undefined when absent", () => {
@@ -281,9 +292,9 @@ describe("resolveSearchItems", () => {
data: [{ url: "https://example.com", title: "Minimal" }],
});
expect(result[0].description).toBeUndefined();
expect(result[0].content).toBeUndefined();
expect(result[0].published).toBeUndefined();
expect(requireSearchResult(result, 0).description).toBeUndefined();
expect(requireSearchResult(result, 0).content).toBeUndefined();
expect(requireSearchResult(result, 0).published).toBeUndefined();
});
it("falls back from empty url to sourceURL within the same entry", () => {
@@ -295,8 +306,8 @@ describe("resolveSearchItems", () => {
});
expect(result).toHaveLength(2);
expect(result[0].url).toBe("https://fallback.com");
expect(result[1].url).toBe("https://only-source.com");
expect(requireSearchResult(result, 0).url).toBe("https://fallback.com");
expect(requireSearchResult(result, 1).url).toBe("https://only-source.com");
});
it("includes entries with empty title (title defaults to empty string)", () => {
@@ -308,8 +319,8 @@ describe("resolveSearchItems", () => {
});
expect(result).toHaveLength(2);
expect(result[0].title).toBe("");
expect(result[1].title).toBe("Has Title");
expect(requireSearchResult(result, 0).title).toBe("");
expect(requireSearchResult(result, 1).title).toBe("Has Title");
});
it("picks the first candidate array when multiple are present", () => {
@@ -321,7 +332,7 @@ describe("resolveSearchItems", () => {
});
expect(result).toHaveLength(1);
expect(result[0].url).toBe("https://from-data.com");
expect(requireSearchResult(result, 0).url).toBe("https://from-data.com");
});
it("treats non-object metadata as absent (number, string)", () => {
@@ -334,8 +345,8 @@ describe("resolveSearchItems", () => {
expect(result).toHaveLength(2);
// Both should still be resolved; metadata fallback should not crash.
expect(result[0].url).toBe("https://example.com/meta-num");
expect(result[1].url).toBe("https://example.com/meta-str");
expect(requireSearchResult(result, 0).url).toBe("https://example.com/meta-num");
expect(requireSearchResult(result, 1).url).toBe("https://example.com/meta-str");
});
it("sets siteName to undefined when url is not a valid URL", () => {
@@ -348,7 +359,7 @@ describe("resolveSearchItems", () => {
});
expect(result).toHaveLength(1);
expect(result[0].siteName).toBeUndefined();
expect(requireSearchResult(result, 0).siteName).toBeUndefined();
});
it("prefers record.title over metadata.title when both are present", () => {
@@ -363,7 +374,7 @@ describe("resolveSearchItems", () => {
});
expect(result).toHaveLength(1);
expect(result[0].title).toBe("record title");
expect(requireSearchResult(result, 0).title).toBe("record title");
});
it("falls back to metadata.title when record.title is absent", () => {
@@ -377,7 +388,7 @@ describe("resolveSearchItems", () => {
});
expect(result).toHaveLength(1);
expect(result[0].title).toBe("metadata title");
expect(requireSearchResult(result, 0).title).toBe("metadata title");
});
it("falls back to metadata.title when record.title is empty string", () => {
@@ -393,7 +404,7 @@ describe("resolveSearchItems", () => {
});
expect(result).toHaveLength(1);
expect(result[0].title).toBe("metadata title");
expect(requireSearchResult(result, 0).title).toBe("metadata title");
});
});