test: tighten registry empty array assertions

This commit is contained in:
Shakker
2026-05-09 05:40:00 +01:00
parent e7f3644207
commit 3ee3fd72bb
24 changed files with 62 additions and 56 deletions

View File

@@ -123,7 +123,7 @@ describe("getMinimalServicePathParts - Linux user directories", () => {
"/sbin",
]);
const userPathEntries = result.filter((entry) => entry.startsWith("/Users/testuser/"));
expect(userPathEntries).toEqual([]);
expect(userPathEntries).toStrictEqual([]);
});
it("can include env-configured version manager dirs on macOS when requested", () => {
@@ -169,7 +169,7 @@ describe("getMinimalServicePathParts - Linux user directories", () => {
});
// Windows returns empty array (uses existing PATH)
expect(result).toEqual([]);
expect(result).toStrictEqual([]);
});
it("omits hard-coded version-manager fallbacks on Linux when missing", () => {

View File

@@ -58,7 +58,7 @@ describe("buildControlUiCspHeader", () => {
describe("computeInlineScriptHashes", () => {
it("returns empty for HTML without scripts", () => {
expect(computeInlineScriptHashes("<html><body>hi</body></html>")).toEqual([]);
expect(computeInlineScriptHashes("<html><body>hi</body></html>")).toStrictEqual([]);
});
it("hashes inline script content", () => {
@@ -70,7 +70,7 @@ describe("computeInlineScriptHashes", () => {
it("skips scripts with src attribute", () => {
const hashes = computeInlineScriptHashes('<html><script src="/app.js"></script></html>');
expect(hashes).toEqual([]);
expect(hashes).toStrictEqual([]);
});
it("does not treat data-src as an external script attribute", () => {
@@ -103,6 +103,6 @@ describe("computeInlineScriptHashes", () => {
});
it("skips empty inline scripts", () => {
expect(computeInlineScriptHashes("<script></script>")).toEqual([]);
expect(computeInlineScriptHashes("<script></script>")).toStrictEqual([]);
});
});

View File

@@ -318,8 +318,8 @@ describe("gateway session utils", () => {
.filter((session) => !session.thinkingOptions?.includes("medium"))
.map((session) => session.sessionId);
expect(missingMediumLevelSessionIds).toEqual([]);
expect(missingMediumOptionSessionIds).toEqual([]);
expect(missingMediumLevelSessionIds).toStrictEqual([]);
expect(missingMediumOptionSessionIds).toStrictEqual([]);
expect(result.sessions.map((session) => session.thinkingDefault)).toEqual(
Array.from({ length: result.sessions.length }, () => "medium"),
);

View File

@@ -458,7 +458,7 @@ describe("hooks", () => {
it("should return empty array when no handlers are registered", () => {
const keys = getRegisteredEventKeys();
expect(keys).toEqual([]);
expect(keys).toStrictEqual([]);
});
});
@@ -470,7 +470,7 @@ describe("hooks", () => {
clearInternalHooks();
const keys = getRegisteredEventKeys();
expect(keys).toEqual([]);
expect(keys).toStrictEqual([]);
});
});
});

View File

@@ -25,38 +25,40 @@ describe("extractLinksFromMessage", () => {
});
it("blocks localhost and common loopback addresses", () => {
expect(extractLinksFromMessage("http://localhost/secret")).toEqual([]);
expect(extractLinksFromMessage("http://localhost.localdomain/secret")).toEqual([]);
expect(extractLinksFromMessage("http://foo.localhost/secret")).toEqual([]);
expect(extractLinksFromMessage("http://service.local/secret")).toEqual([]);
expect(extractLinksFromMessage("http://service.internal/secret")).toEqual([]);
expect(extractLinksFromMessage("http://0.0.0.0/secret")).toEqual([]);
expect(extractLinksFromMessage("http://[::1]/secret")).toEqual([]);
expect(extractLinksFromMessage("http://localhost/secret")).toStrictEqual([]);
expect(extractLinksFromMessage("http://localhost.localdomain/secret")).toStrictEqual([]);
expect(extractLinksFromMessage("http://foo.localhost/secret")).toStrictEqual([]);
expect(extractLinksFromMessage("http://service.local/secret")).toStrictEqual([]);
expect(extractLinksFromMessage("http://service.internal/secret")).toStrictEqual([]);
expect(extractLinksFromMessage("http://0.0.0.0/secret")).toStrictEqual([]);
expect(extractLinksFromMessage("http://[::1]/secret")).toStrictEqual([]);
});
it("blocks private network ranges", () => {
expect(extractLinksFromMessage("http://10.0.0.1/internal")).toEqual([]);
expect(extractLinksFromMessage("http://172.16.0.1/internal")).toEqual([]);
expect(extractLinksFromMessage("http://192.168.1.1/internal")).toEqual([]);
expect(extractLinksFromMessage("http://10.0.0.1/internal")).toStrictEqual([]);
expect(extractLinksFromMessage("http://172.16.0.1/internal")).toStrictEqual([]);
expect(extractLinksFromMessage("http://192.168.1.1/internal")).toStrictEqual([]);
});
it("blocks link-local and cloud metadata addresses", () => {
expect(extractLinksFromMessage("http://169.254.169.254/latest/meta-data/")).toEqual([]);
expect(extractLinksFromMessage("http://169.254.1.1/test")).toEqual([]);
expect(extractLinksFromMessage("http://169.254.169.254/latest/meta-data/")).toStrictEqual([]);
expect(extractLinksFromMessage("http://169.254.1.1/test")).toStrictEqual([]);
expect(extractLinksFromMessage("http://metadata.google.internal/computeMetadata/v1/")).toEqual(
[],
);
});
it("blocks CGNAT range used by Tailscale", () => {
expect(extractLinksFromMessage("http://100.100.50.1/test")).toEqual([]);
expect(extractLinksFromMessage("http://100.100.50.1/test")).toStrictEqual([]);
});
it("blocks private and mapped IPv6 addresses", () => {
expect(extractLinksFromMessage("http://[::ffff:127.0.0.1]/secret")).toEqual([]);
expect(extractLinksFromMessage("http://[2001:db8:1234::5efe:127.0.0.1]/secret")).toEqual([]);
expect(extractLinksFromMessage("http://[fe80::1]/secret")).toEqual([]);
expect(extractLinksFromMessage("http://[fc00::1]/secret")).toEqual([]);
expect(extractLinksFromMessage("http://[::ffff:127.0.0.1]/secret")).toStrictEqual([]);
expect(extractLinksFromMessage("http://[2001:db8:1234::5efe:127.0.0.1]/secret")).toStrictEqual(
[],
);
expect(extractLinksFromMessage("http://[fe80::1]/secret")).toStrictEqual([]);
expect(extractLinksFromMessage("http://[fc00::1]/secret")).toStrictEqual([]);
});
it("allows legitimate public URLs", () => {

View File

@@ -118,7 +118,7 @@ describe("serveOpenClawChannelMcp shutdown", () => {
await servePromise;
await new Promise((resolve) => setTimeout(resolve, 0));
expect(unhandledRejections).toEqual([]);
expect(unhandledRejections).toStrictEqual([]);
expect(bridgeState.close).toHaveBeenCalledTimes(1);
});
});

View File

@@ -55,7 +55,7 @@ describe("manifest model catalog planner", () => {
},
]);
expect(plan.rows.map((row) => row.ref)).toEqual(["moonshot/kimi-k2.6"]);
expect(plan.conflicts).toEqual([]);
expect(plan.conflicts).toStrictEqual([]);
});
it("filters providers before row planning", () => {
@@ -89,7 +89,7 @@ describe("manifest model catalog planner", () => {
expect(plan.entries.map((entry) => entry.pluginId)).toEqual(["openrouter"]);
expect(plan.rows.map((row) => row.ref)).toEqual(["openrouter/anthropic/claude-sonnet-4.6"]);
expect(plan.conflicts).toEqual([]);
expect(plan.conflicts).toStrictEqual([]);
});
it("plans alias-filtered rows from owned provider catalogs", () => {

View File

@@ -101,7 +101,7 @@ describe("enqueueKeyedTask", () => {
).rejects.toThrow("boom");
await new Promise((resolve) => setTimeout(resolve, 0));
expect(unhandled).toEqual([]);
expect(unhandled).toStrictEqual([]);
} finally {
process.off("unhandledRejection", onUnhandledRejection);
}

View File

@@ -25,7 +25,7 @@ describe("bundled channel runtime metadata", () => {
it("preserves explicit empty bundled roots", () => {
const tempRoot = createTempRoot();
expect(listBundledChannelPluginMetadata({ rootDir: tempRoot })).toEqual([]);
expect(listBundledChannelPluginMetadata({ rootDir: tempRoot })).toStrictEqual([]);
expect(resolveBundledChannelWorkspacePath({ rootDir: tempRoot, pluginId: "telegram" })).toBe(
null,
);
@@ -37,6 +37,6 @@ describe("bundled channel runtime metadata", () => {
expect(
listBundledChannelPluginMetadata({ rootDir: tempRoot, scanDir: missingScanDir }),
).toEqual([]);
).toStrictEqual([]);
});
});

View File

@@ -38,8 +38,8 @@ function requireCompactionProvider(id: string): CompactionProvider {
describe("compaction provider registry", () => {
it("starts empty", () => {
expect(listCompactionProviderIds()).toEqual([]);
expect(listRegisteredCompactionProviders()).toEqual([]);
expect(listCompactionProviderIds()).toStrictEqual([]);
expect(listRegisteredCompactionProviders()).toStrictEqual([]);
});
it("returns undefined for an unknown id", () => {
@@ -121,7 +121,7 @@ describe("compaction provider registry", () => {
expect(listCompactionProviderIds()).toHaveLength(2);
clearCompactionProviders();
expect(listCompactionProviderIds()).toEqual([]);
expect(listCompactionProviderIds()).toStrictEqual([]);
expect(getCompactionProvider("a")).toBeUndefined();
});
@@ -147,7 +147,7 @@ describe("compaction provider registry", () => {
it("restore with empty array clears everything", () => {
registerCompactionProvider(makeProvider("x"));
restoreRegisteredCompactionProviders([]);
expect(listCompactionProviderIds()).toEqual([]);
expect(listCompactionProviderIds()).toStrictEqual([]);
});
});
});

View File

@@ -112,7 +112,7 @@ describe("resolveEffectivePluginIds", () => {
slots: { contextEngine: "legacy" },
},
}),
).toEqual([]);
).toStrictEqual([]);
});
it.each([
@@ -142,7 +142,7 @@ describe("resolveEffectivePluginIds", () => {
] satisfies Array<{ name: string; plugins: NonNullable<OpenClawConfig["plugins"]> }>)(
"does not preload a selected context-engine slot when $name",
({ plugins }) => {
expect(resolve({ plugins })).toEqual([]);
expect(resolve({ plugins })).toStrictEqual([]);
},
);
});

View File

@@ -138,7 +138,7 @@ describe("createPluginModuleLoader", () => {
},
});
expect(sourceLoaderCalls).toEqual([]);
expect(sourceLoaderCalls).toStrictEqual([]);
});
it("loads packaged JavaScript without creating a module loader", async () => {
@@ -171,6 +171,6 @@ describe("createPluginModuleLoader", () => {
});
expect(registry.plugins.find((plugin) => plugin.id === "npm-demo")?.status).toBe("loaded");
expect(sourceLoaderCalls).toEqual([]);
expect(sourceLoaderCalls).toStrictEqual([]);
});
});

View File

@@ -237,8 +237,12 @@ describe("resolvePluginDiscoveryProvidersRuntime", () => {
},
});
expect(resolvePluginDiscoveryProvidersRuntime({ discoveryEntriesOnly: true })).toEqual([]);
expect(resolvePluginDiscoveryProvidersRuntime({ discoveryEntriesOnly: true })).toEqual([]);
expect(resolvePluginDiscoveryProvidersRuntime({ discoveryEntriesOnly: true })).toStrictEqual(
[],
);
expect(resolvePluginDiscoveryProvidersRuntime({ discoveryEntriesOnly: true })).toStrictEqual(
[],
);
expect(mocks.resolvePluginProviders).not.toHaveBeenCalled();
});
});

View File

@@ -46,6 +46,6 @@ describe("runtime plugin registry boundary", () => {
)
.map((file) => file.relativePath);
expect(offenders).toEqual([]);
expect(offenders).toStrictEqual([]);
});
});

View File

@@ -53,7 +53,7 @@ describe("plugin compatibility snapshot notices", () => {
body: `module.exports = { id: "legacy-sidecar", register() {} };\n`,
});
expect(buildSnapshotCompatibilityNoticeCodes(plugin)).toEqual([]);
expect(buildSnapshotCompatibilityNoticeCodes(plugin)).toStrictEqual([]);
});
it("does not report startup compatibility warnings for explicit startup-lazy manifests", () => {
@@ -63,6 +63,6 @@ describe("plugin compatibility snapshot notices", () => {
});
addStartupActivation(plugin.dir, false);
expect(buildSnapshotCompatibilityNoticeCodes(plugin)).toEqual([]);
expect(buildSnapshotCompatibilityNoticeCodes(plugin)).toStrictEqual([]);
});
});

View File

@@ -74,7 +74,7 @@ describe("synthetic auth runtime refs", () => {
diagnostics: [],
});
expect(resolveRuntimeSyntheticAuthProviderRefs()).toEqual([]);
expect(resolveRuntimeSyntheticAuthProviderRefs()).toStrictEqual([]);
});
it("prefers the active runtime registry when plugins are already loaded", () => {

View File

@@ -21,7 +21,7 @@ describe("device bootstrap profile", () => {
expect(
resolveBootstrapProfileScopesForRole("node", ["node.exec", "operator.approvals"]),
).toEqual([]);
).toStrictEqual([]);
});
test("bounds bootstrap handoff scopes across profile roles", () => {
@@ -34,7 +34,7 @@ describe("device bootstrap profile", () => {
expect(
resolveBootstrapProfileScopesForRoles(["node"], ["node.exec", "operator.admin"]),
).toEqual([]);
).toStrictEqual([]);
});
test("normalizes issued handoff profiles to the bootstrap allowlist", () => {

View File

@@ -84,7 +84,7 @@ describe("shared/entry-status", () => {
});
expect(result.requirementsSatisfied).toBe(true);
expect(result.missing.os).toEqual([]);
expect(result.missing.os).toStrictEqual([]);
});
it("pulls metadata and frontmatter from entry objects in the entry wrapper", () => {

View File

@@ -19,8 +19,8 @@ describe("shared/node-match", () => {
expect(resolveNodeMatches(nodes, "mac studio")).toEqual([nodes[0]]);
expect(resolveNodeMatches(nodes, " Mac---Studio!! ")).toEqual([nodes[0]]);
expect(resolveNodeMatches(nodes, "pi-456")).toEqual([nodes[1]]);
expect(resolveNodeMatches(nodes, "pi")).toEqual([]);
expect(resolveNodeMatches(nodes, " ")).toEqual([]);
expect(resolveNodeMatches(nodes, "pi")).toStrictEqual([]);
expect(resolveNodeMatches(nodes, " ")).toStrictEqual([]);
});
it("resolves unique matches and prefers a unique connected node", () => {

View File

@@ -14,7 +14,7 @@ describe("shared/string-normalization", () => {
"null",
"obj",
]);
expect(normalizeStringEntries(undefined)).toEqual([]);
expect(normalizeStringEntries(undefined)).toStrictEqual([]);
});
it("normalizes mixed allow-list entries to lowercase", () => {

View File

@@ -120,7 +120,7 @@ describe("shared/usage-aggregates", () => {
});
expect(tail.latency).toBeUndefined();
expect(tail.dailyLatency).toEqual([]);
expect(tail.dailyLatency).toStrictEqual([]);
});
it("normalizes zero-count daily latency entries to zero averages and mins", () => {

View File

@@ -256,7 +256,7 @@ describe("wrapNoteMessage", () => {
expect(lines.length).toBeGreaterThan(1);
expect(lines[0]?.startsWith("- ")).toBe(true);
const unindentedContinuationLines = lines.slice(1).filter((line) => !line.startsWith(" "));
expect(unindentedContinuationLines).toEqual([]);
expect(unindentedContinuationLines).toStrictEqual([]);
});
it("preserves long Windows paths without inserting spaces/newlines", () => {

View File

@@ -76,7 +76,7 @@ describe("trajectory cleanup", () => {
restrictToStoreDir: true,
});
expect(removed).toEqual([]);
expect(removed).toStrictEqual([]);
expect((await fs.stat(runtimeFile)).isFile()).toBe(true);
expect((await fs.stat(pointerPath)).isFile()).toBe(true);
});

View File

@@ -772,7 +772,7 @@ describe("exportTrajectoryBundle", () => {
"tools.json",
]);
const emptyContents = (manifest.contents ?? []).filter((entry) => entry.bytes <= 0);
expect(emptyContents).toEqual([]);
expect(emptyContents).toStrictEqual([]);
const metadata = JSON.parse(fs.readFileSync(path.join(outputDir, "metadata.json"), "utf8")) as {
skills?: { entries?: Array<{ id?: string; invoked?: boolean }> };