Files
pi-agent-integrated/pi-web/lib/git-changes.test.mjs
T

53 lines
1.4 KiB
JavaScript

import assert from "node:assert/strict";
import test from "node:test";
async function loadSubject() {
return import("./git-status.ts");
}
test("parses null-delimited Git status entries including renames", async () => {
const { parseGitPorcelainV1 } = await loadSubject();
const entries = parseGitPorcelainV1([
" M components/App.tsx",
"?? notes.txt",
"R src/new-name.ts",
"src/old-name.ts",
"",
].join("\0"));
assert.deepEqual(entries, [
{
path: "components/App.tsx",
indexStatus: " ",
worktreeStatus: "M",
},
{
path: "notes.txt",
indexStatus: "?",
worktreeStatus: "?",
},
{
path: "src/new-name.ts",
originalPath: "src/old-name.ts",
indexStatus: "R",
worktreeStatus: " ",
},
]);
});
test("classifies Git status for explorer badges", async () => {
const { classifyGitStatus } = await loadSubject();
const classify = (pair) => classifyGitStatus({
path: "file.ts",
indexStatus: pair[0],
worktreeStatus: pair[1],
});
assert.deepEqual(classify(" M"), { status: "modified", code: "M" });
assert.deepEqual(classify("??"), { status: "untracked", code: "U" });
assert.deepEqual(classify("A "), { status: "added", code: "A" });
assert.deepEqual(classify("R "), { status: "renamed", code: "R" });
assert.deepEqual(classify("UU"), { status: "conflict", code: "C" });
assert.deepEqual(classify(" D"), { status: "deleted", code: "D" });
});