Files
elizaos--eliza/packages/scripts/__tests__/coverage-source-classifier.test.ts
wehub-resource-sync 426e9eeabd
Voice Workbench / headless workbench (mocked backends) (push) Has been cancelled
Voice Workbench / real acoustic lane (nightly, provisioned only) (push) Has been cancelled
ci / test (push) Has been cancelled
ci / lint-and-format (push) Has been cancelled
ci / build (push) Has been cancelled
ci / dev-startup (push) Has been cancelled
gitleaks / gitleaks (push) Has been cancelled
Markdown Links / Relative Markdown Links (push) Has been cancelled
Quality (Extended) / Homepage Build (PR smoke) (push) Has been cancelled
Quality (Extended) / Comment-only diff guard (push) Has been cancelled
Quality (Extended) / Format + Type Safety Ratchet (push) Has been cancelled
Quality (Extended) / Develop Gate (secret scan + UI determinism) (push) Has been cancelled
Quality (Extended) / Develop Gate (lint) (push) Has been cancelled
Chat shell gestures / Chat shell gesture + parity e2e (push) Has been cancelled
Cloud Gateway Discord / Test (push) Has been cancelled
Benchmark Bridge Tests / benchmark (bunx @biomejs/biome check packages/lifeops-bench/src, benchmark-lint) (push) Has been cancelled
Benchmark Bridge Tests / benchmark (bunx vitest run --config packages/lifeops-bench/vitest.config.ts --root packages/lifeops-bench --passWithNoTests, benchmark-tests) (push) Has been cancelled
Build Agent Image / build-and-push (push) Has been cancelled
Dev Smoke / bun run dev onboarding chat (push) Has been cancelled
Dev Smoke / Vite HMR dependency-level smoke (push) Has been cancelled
Electrobun Submodule Guard / electrobun gitlink is fetchable (push) Has been cancelled
Publish @elizaos/example-code / check_npm (push) Has been cancelled
Publish @elizaos/example-code / publish_npm (push) Has been cancelled
Publish @elizaos/plugin-elizacloud / verify_version (push) Has been cancelled
Publish @elizaos/plugin-elizacloud / publish_npm (push) Has been cancelled
Sandbox Live Smoke / Sandbox live smoke (push) Has been cancelled
Snap Build & Test / Build Snap (amd64) (push) Has been cancelled
Snap Build & Test / Build Snap (arm64) (push) Has been cancelled
Test Packaging / elizaos CLI global-install smoke (node + bun) (push) Has been cancelled
Cloud Gateway Webhook / Test (push) Has been cancelled
Cloud Tests / lint-and-types (push) Has been cancelled
Cloud Tests / unit-tests (push) Has been cancelled
Cloud Tests / integration-tests (push) Has been cancelled
Cloud Tests / e2e-tests (push) Has been cancelled
CodeQL Advanced / Analyze (javascript-typescript) (push) Has been cancelled
Deploy Apps Worker (Product 2) / Determine environment (push) Has been cancelled
Deploy Apps Worker (Product 2) / Deploy apps worker to apps-control host (${{ needs.determine-env.outputs.environment }}) (push) Has been cancelled
Deploy Eliza Provisioning Worker / Determine environment (push) Has been cancelled
Deploy Eliza Provisioning Worker / Deploy worker to Hetzner host (${{ needs.determine-env.outputs.environment }} @ ${{ needs.determine-env.outputs.deployment_sha }}) (push) Has been cancelled
Dev Smoke / Classify changed paths (push) Has been cancelled
supply-chain / sbom (push) Has been cancelled
supply-chain / vulnerability-scan (push) Has been cancelled
Build, Push & Deploy to Phala Cloud / build-and-push (push) Has been cancelled
Test Packaging / Validate Packaging Configs (push) Has been cancelled
Test Packaging / Build & Test PyPI Package (push) Has been cancelled
Test Packaging / PyPI on Python ${{ matrix.python }} (push) Has been cancelled
Test Packaging / Pack & Test JS Tarballs (push) Has been cancelled
UI Fixture E2E / ui-fixture-e2e (push) Has been cancelled
UI Fixture E2E / fixture-e2e (push) Has been cancelled
UI Story Gate / story-gate (push) Has been cancelled
vault-ci / test (macos-latest) (push) Has been cancelled
vault-ci / test (ubuntu-latest) (push) Has been cancelled
vault-ci / test (windows-latest) (push) Has been cancelled
vault-ci / app-core wiring tests (push) Has been cancelled
verify-patches / verify patches/CHECKSUMS.sha256 (push) Has been cancelled
Voice Benchmark Smoke / voice-emotion fixture smoke (push) Has been cancelled
Voice Benchmark Smoke / voiceagentbench fixture smoke (push) Has been cancelled
Voice Benchmark Smoke / voicebench-quality unit smoke (push) Has been cancelled
Voice Benchmark Smoke / voicebench TypeScript unit (no audio) (push) Has been cancelled
Voice Benchmark Smoke / voice bench smoke summary (push) Has been cancelled
Windows CI / windows ([bun run --cwd packages/app-core test bun run --cwd packages/elizaos test bun run --cwd packages/cloud/shared test], app-and-cli) (push) Has been cancelled
Windows CI / windows ([bun run --cwd packages/scenario-runner test bun run --cwd packages/vault test bun run --cwd packages/security test bun run --cwd plugins/plugin-coding-tools test], framework-packages) (push) Has been cancelled
Windows CI / windows ([bun run --cwd plugins/plugin-elizacloud test bun run --cwd plugins/plugin-discord test bun run --cwd plugins/plugin-anthropic test bun run --cwd plugins/plugin-openai test bun run --cwd plugins/plugin-app-control test bun run --cwd plugins/pl… (push) Has been cancelled
Windows CI / windows ([node packages/scripts/run-turbo.mjs run build --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/agent --concurrency=4 node packages/scripts/run-bash-linux-only.mjs scripts/verify-riscv64-buildpaths.sh node packages/scripts/run… (push) Has been cancelled
Windows CI / windows ([node packages/scripts/run-turbo.mjs run typecheck --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/cloud-shared --concurrency=4 bun run --cwd packages/core test bun run --cwd packages/shared test], core-runtime, 75) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:43:05 +08:00

204 lines
6.9 KiB
TypeScript

/** Verifies source-aware runtime classification and fail-wide parse handling. */
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { describe, expect, test } from "vitest";
import {
classifyPaths,
pathRetainsRuntimeCode,
sourceChangesRuntimeCode,
sourceRetainsRuntimeCode,
} from "../../../scripts/security/coverage-source-classifier.mjs";
describe("changed-source runtime classifier", () => {
test("excludes syntax erased by the TypeScript transform", () => {
expect(
sourceRetainsRuntimeCode("export interface Foo { id: string }\n"),
).toBe(false);
expect(
sourceRetainsRuntimeCode("export type Foo = { id: string };\n"),
).toBe(false);
expect(
sourceRetainsRuntimeCode(
'import type { Foo } from "./foo"; export type { Foo };\n',
),
).toBe(false);
expect(
sourceRetainsRuntimeCode("export declare const foo: string;\n"),
).toBe(false);
expect(
sourceRetainsRuntimeCode("// comments contain no runtime code\n"),
).toBe(false);
});
test("retains runtime declarations and side-effect imports", () => {
expect(sourceRetainsRuntimeCode('export const foo: string = "x";\n')).toBe(
true,
);
expect(
sourceRetainsRuntimeCode(
'import "./side-effect"; export interface Foo {}\n',
),
).toBe(true);
expect(sourceRetainsRuntimeCode("exports.value = 1;\n")).toBe(true);
});
test("excludes changes with equivalent emitted JavaScript", () => {
const base = "export const value: number = 1;\n";
const head = "export const value : number | string = 1;\n";
expect(sourceChangesRuntimeCode(base, head)).toBe(false);
});
test("retains comment directives that affect bundling or coverage", () => {
const base = 'export const load = () => import("./module");\n';
expect(
sourceChangesRuntimeCode(
base,
'export const load = () => import(/* @vite-ignore */ "./module");\n',
),
).toBe(true);
expect(
sourceChangesRuntimeCode(
"export const value: number = 1;\n",
"/* c8 ignore next */\nexport const value: number = 1;\n",
),
).toBe(true);
});
test("retains type changes that can alter decorator metadata", () => {
expect(
sourceChangesRuntimeCode(
"class Example { @field value: string; }\n",
"class Example { @field value: number; }\n",
),
).toBe(true);
});
test("retains runtime changes and conservative import reordering", () => {
expect(
sourceChangesRuntimeCode(
"export const value: number = 1;\n",
"export const value: number = 2;\n",
),
).toBe(true);
expect(
sourceChangesRuntimeCode(
'import "./a";\nimport "./b";\n',
'import "./b";\nimport "./a";\n',
),
).toBe(true);
});
test("excludes pure re-export facades but retains local runtime exports", () => {
expect(sourceRetainsRuntimeCode('export * from "./button";\n')).toBe(false);
expect(
sourceRetainsRuntimeCode(
'export { Message, MessageContent as Content } from "./message";\n',
),
).toBe(false);
expect(
sourceRetainsRuntimeCode(
'export * from "./button";\nexport const version = 1;\n',
),
).toBe(true);
});
test("treats an unparseable module as executable", () => {
const dir = mkdtempSync(join(tmpdir(), "coverage-source-classifier-"));
const path = join(dir, "runtime.tsx");
const warnings: string[] = [];
try {
writeFileSync(path, "export const View = () => <div />;\n");
expect(
pathRetainsRuntimeCode(path, (message) => warnings.push(message)),
).toBe(true);
expect(warnings).toHaveLength(1);
expect(warnings[0]).toContain(
"treating unclassifiable module as executable",
);
} finally {
rmSync(dir, { recursive: true, force: true });
}
});
test("emits runtime paths and explains type-only exclusions", () => {
const dir = mkdtempSync(join(tmpdir(), "coverage-source-list-"));
const runtimePath = join(dir, "runtime.mts");
const typesPath = join(dir, "types.ts");
const output: string[] = [];
const diagnostics: string[] = [];
try {
writeFileSync(runtimePath, "export const value: number = 1;\n");
writeFileSync(typesPath, "export interface Value { id: string }\n");
classifyPaths(
[runtimePath, typesPath],
(message) => output.push(message),
(message) => diagnostics.push(message),
);
expect(output).toEqual([`${runtimePath}\n`]);
expect(diagnostics).toEqual([
`[coverage-source-classifier] excluding module without coverable runtime statements: ${typesPath}\n`,
]);
} finally {
rmSync(dir, { recursive: true, force: true });
}
});
test("excludes only proven runtime-equivalent source changes", () => {
const dir = mkdtempSync(join(tmpdir(), "coverage-source-delta-"));
const equivalentPath = join(dir, "equivalent.ts");
const changedPath = join(dir, "changed.ts");
const addedPath = join(dir, "added.ts");
const output: string[] = [];
const diagnostics: string[] = [];
const baseSources = new Map([
[equivalentPath, "export const value: number = 1;\n"],
[changedPath, "export const value: number = 1;\n"],
]);
try {
writeFileSync(
equivalentPath,
"export const value : string | number = 1;\n",
);
writeFileSync(changedPath, "export const value: number = 2;\n");
writeFileSync(addedPath, "export const added = true;\n");
classifyPaths(
[equivalentPath, changedPath, addedPath],
(message) => output.push(message),
(message) => diagnostics.push(message),
{ readBaseSource: (path) => baseSources.get(path) },
);
expect(output).toEqual([`${changedPath}\n`, `${addedPath}\n`]);
expect(diagnostics).toEqual([
`[coverage-source-classifier] excluding runtime-equivalent source change: ${equivalentPath}\n`,
]);
} finally {
rmSync(dir, { recursive: true, force: true });
}
});
test("retains a source change when base comparison fails", () => {
const dir = mkdtempSync(join(tmpdir(), "coverage-source-fail-wide-"));
const path = join(dir, "runtime.ts");
const output: string[] = [];
const diagnostics: string[] = [];
try {
writeFileSync(path, "export const value = 1;\n");
classifyPaths(
[path],
(message) => output.push(message),
(message) => diagnostics.push(message),
{ readBaseSource: () => "export const broken = <;\n" },
);
expect(output).toEqual([`${path}\n`]);
expect(diagnostics).toHaveLength(1);
expect(diagnostics[0]).toContain(
"treating unclassifiable source change as executable",
);
} finally {
rmSync(dir, { recursive: true, force: true });
}
});
});