Files
rea/tests/boundary/cli/referenceSourceExclusions.test.ts
morluto ec271121e4 fix(artifacts): preserve path identity and exclusion applicability
Normalize path facts once at the owning filesystem boundary, preserve caller spelling and unavailable inventory members, and retain typed read failures. Record exclusion entry kinds so only proven directories can establish descendant symlink targets; omitted legacy kinds stay unknown.

Reviewed fixes include #1969, #2642, #2759, and #2994.

Validation: 26 reference graph source tests passed; prior artifact checks passed 275 tests with one Windows-only skip. Updated compiled import workflows are included in final validation after regeneration.
2026-10-14 08:31:16 +08:00

126 lines
4.1 KiB
TypeScript

import {
mkdir,
readFile,
readlink,
symlink,
writeFile,
} from "node:fs/promises";
import { join } from "node:path";
import { describe, expect } from "vitest";
import { historicalSourceGraphSchema } from "../../../src/domain/referenceSourceGraph.js";
import { createTestTempDirectory } from "../../fixtures/temporaryDirectory.js";
import { cliTest } from "../../support/cli/cliFixture.js";
describe.skipIf(process.platform === "win32")(
"compiled reference-source exclusion provenance",
() => {
cliTest(
"imports source beside a link into a default-excluded directory",
async ({ cli }) => {
const root = await createTestTempDirectory(
"rea-reference-link-exclusion-",
);
await mkdir(join(root, "dist"));
const source = "export const value = 1;\n";
await writeFile(join(root, "source.ts"), source);
await symlink("dist", join(root, "alias"));
const result = await cli.run({
arguments: ["import-reference-source", root, "--json"],
cwd: root,
environment: {
HOME: root,
USERPROFILE: root,
XDG_CONFIG_HOME: root,
XDG_CACHE_HOME: root,
},
});
expect(result.exitCode).toBe(0);
const graph = historicalSourceGraphSchema.parse(result.json);
expect(graph.inventory_state).toBe("partial");
expect(graph.exclusions).toContainEqual({
path: "dist",
entry_kind: "directory",
reason: "default-ignored",
pattern: "dist/",
});
expect(graph.entries).toEqual(
expect.arrayContaining([
expect.objectContaining({
path: "alias",
kind: "symlink",
target: "dist",
target_state: "internal",
}),
expect.objectContaining({
path: "source.ts",
kind: "file",
content_state: "hashed",
}),
]),
);
expect(graph.entries.some(({ path }) => path === "dist")).toBe(false);
expect(await readFile(join(root, "source.ts"), "utf8")).toBe(source);
expect(await readlink(join(root, "alias"))).toBe("dist");
},
);
cliTest(
"reports project, default, and explicit secret exclusions",
async ({ cli }) => {
const root = await createTestTempDirectory("rea-reference-exclusions-");
const logs = join(root, "logs");
await mkdir(logs);
await Promise.all([
writeFile(join(root, ".gitignore"), "project.tmp\n"),
writeFile(join(root, "project.tmp"), "project policy\n"),
writeFile(join(logs, "application.log"), "default policy\n"),
writeFile(join(root, "private.txt"), "sensitive local file\n"),
writeFile(join(root, "source.ts"), "export const value = 1;\n"),
]);
const result = await cli.run({
arguments: ["import-reference-source", root, "--json"],
cwd: root,
environment: {
HOME: root,
USERPROFILE: root,
XDG_CONFIG_HOME: root,
XDG_CACHE_HOME: root,
REA_REFERENCE_SECRET_PATTERNS_JSON: '["private.txt"]',
},
});
expect(result.exitCode).toBe(0);
const graph = historicalSourceGraphSchema.parse(result.json);
expect(graph.exclusions).toEqual(
expect.arrayContaining([
{
path: "project.tmp",
entry_kind: "file",
reason: "project-ignored",
pattern: "project.tmp",
},
{
path: "logs/application.log",
entry_kind: "file",
reason: "default-ignored",
pattern: "*.log",
},
{
path: "private.txt",
entry_kind: "file",
reason: "configured-secret",
pattern: "private.txt",
},
]),
);
expect(graph.entries).toContainEqual(
expect.objectContaining({ path: "source.ts", kind: "file" }),
);
},
);
},
);