import { describe, expect, it } from "vitest"; import { buildNativeReviewDiffData } from "./nativeReviewDiffAdapter";import { buildReviewParsedDiff } from "./reviewModel"; describe("buildNativeReviewDiffData", () => { it("maps real parsed file diffs into native rows with headers, hunks, lines, and notices", () => { const parsed = buildReviewParsedDiff( [ "diff --git a/apps/demo/src/main.ts b/apps/demo/src/main.ts", "index 1111111..2222222 100644", "--- a/apps/demo/src/main.ts", "+++ b/apps/demo/src/main.ts", "@@ -1,2 +1,2 @@", "-const retryLimit = 2;", "+const retryLimit = 4;", " console.log(retryLimit);", "diff --git a/apps/demo/src/old.ts b/apps/demo/src/new.ts", "similarity index 100%", "rename from apps/demo/src/old.ts", "rename to apps/demo/src/new.ts", "diff --git a/apps/demo/assets/review-logo.png b/apps/demo/assets/review-logo.png", "new file mode 100644", "index 0000000..1111111", "Binary files /dev/null and b/apps/demo/assets/review-logo.png differ", ].join("\n"), "native-adapter-test", ); const data = buildNativeReviewDiffData({ parsedDiff: parsed, comments: [ { id: "comment-1", sectionId: "dirty", sectionTitle: "Working tree", filePath: "apps/demo/src/main.ts", startIndex: 1, endIndex: 1, rangeLabel: "+2", text: "Please keep this configurable.", diff: "", }, ], }); expect(data.additions).toBe(1); expect(data.deletions).toBe(1); expect(data.files).toEqual( expect.arrayContaining([ expect.objectContaining({ path: "apps/demo/src/main.ts", language: "typescript", additions: 1, deletions: 1, }), expect.objectContaining({ path: "apps/demo/src/new.ts", language: "typescript", additions: 0, deletions: 0, }), ]), ); expect(data.rows).toEqual( expect.arrayContaining([ expect.objectContaining({ kind: "file", filePath: "apps/demo/src/main.ts", changeType: "modified", }), expect.objectContaining({ kind: "hunk", text: "@@ -1,2 +1,2 @@", }), expect.objectContaining({ kind: "line", change: "delete", content: "const retryLimit = 2;", wordDiffRanges: [{ start: 19, end: 20 }], }), expect.objectContaining({ kind: "line", change: "add", content: "const retryLimit = 4;", wordDiffRanges: [{ start: 19, end: 20 }], }), expect.objectContaining({ kind: "comment", id: "comment-1", filePath: "apps/demo/src/main.ts", commentText: "Please keep this configurable.", commentRangeLabel: "+2", }), expect.objectContaining({ kind: "file", filePath: "apps/demo/src/new.ts", previousPath: "apps/demo/src/old.ts", changeType: "rename-pure", }), expect.objectContaining({ kind: "notice", text: "This file was renamed without modifications.", }), expect.objectContaining({ kind: "notice", text: "Unsupported format. Diff contents are not available.", }), ]), ); const changedLine = data.rows.find( (row) => row.kind === "line" && row.change === "add" && row.content === "const retryLimit = 4;", ); expect(changedLine?.id).toBeTruthy(); const changedTarget = data.commentTargetsByRowId.get(changedLine?.id ?? ""); expect(changedTarget).toMatchObject({ filePath: "apps/demo/src/main.ts", lineIndex: 1, lines: expect.arrayContaining([ expect.objectContaining({ content: "const retryLimit = 2;" }), expect.objectContaining({ content: "const retryLimit = 4;" }), ]), }); const changedCommentLine = changedTarget?.lines[changedTarget.lineIndex]; expect(data.rowIdByCommentLineId.get(changedCommentLine?.id ?? "")).toBe(changedLine?.id); });});
import { describe, expect, it } from "vitest";
import { buildNativeReviewDiffData } from "./nativeReviewDiffAdapter";
import { buildReviewParsedDiff } from "./reviewModel";
describe("buildNativeReviewDiffData", () => {
it("maps real parsed file diffs into native rows with headers, hunks, lines, and notices", () => {
const parsed = buildReviewParsedDiff(
[
"diff --git a/apps/demo/src/main.ts b/apps/demo/src/main.ts",
"index 1111111..2222222 100644",
"--- a/apps/demo/src/main.ts",
"+++ b/apps/demo/src/main.ts",
"@@ -1,2 +1,2 @@",
"-const retryLimit = 2;",
"+const retryLimit = 4;",
" console.log(retryLimit);",
"diff --git a/apps/demo/src/old.ts b/apps/demo/src/new.ts",
"similarity index 100%",
"rename from apps/demo/src/old.ts",
"rename to apps/demo/src/new.ts",
"diff --git a/apps/demo/assets/review-logo.png b/apps/demo/assets/review-logo.png",
"new file mode 100644",
"index 0000000..1111111",
"Binary files /dev/null and b/apps/demo/assets/review-logo.png differ",
].join("\n"),
"native-adapter-test",
);
const data = buildNativeReviewDiffData({
parsedDiff: parsed,
comments: [
{
id: "comment-1",
sectionId: "dirty",
sectionTitle: "Working tree",
filePath: "apps/demo/src/main.ts",
startIndex: 1,
endIndex: 1,
rangeLabel: "+2",
text: "Please keep this configurable.",
diff: "",
},
],
});
expect(data.additions).toBe(1);
expect(data.deletions).toBe(1);
expect(data.files).toEqual(
expect.arrayContaining([
expect.objectContaining({
path: "apps/demo/src/main.ts",
language: "typescript",
additions: 1,
deletions: 1,
}),
expect.objectContaining({
path: "apps/demo/src/new.ts",
language: "typescript",
additions: 0,
deletions: 0,
}),
]),
);
expect(data.rows).toEqual(
expect.arrayContaining([
expect.objectContaining({
kind: "file",
filePath: "apps/demo/src/main.ts",
changeType: "modified",
}),
expect.objectContaining({
kind: "hunk",
text: "@@ -1,2 +1,2 @@",
}),
expect.objectContaining({
kind: "line",
change: "delete",
content: "const retryLimit = 2;",
wordDiffRanges: [{ start: 19, end: 20 }],
}),
expect.objectContaining({
kind: "line",
change: "add",
content: "const retryLimit = 4;",
wordDiffRanges: [{ start: 19, end: 20 }],
}),
expect.objectContaining({
kind: "comment",
id: "comment-1",
filePath: "apps/demo/src/main.ts",
commentText: "Please keep this configurable.",
commentRangeLabel: "+2",
}),
expect.objectContaining({
kind: "file",
filePath: "apps/demo/src/new.ts",
previousPath: "apps/demo/src/old.ts",
changeType: "rename-pure",
}),
expect.objectContaining({
kind: "notice",
text: "This file was renamed without modifications.",
}),
expect.objectContaining({
kind: "notice",
text: "Unsupported format. Diff contents are not available.",
}),
]),
);
const changedLine = data.rows.find(
(row) =>
row.kind === "line" && row.change === "add" && row.content === "const retryLimit = 4;",
);
expect(changedLine?.id).toBeTruthy();
const changedTarget = data.commentTargetsByRowId.get(changedLine?.id ?? "");
expect(changedTarget).toMatchObject({
filePath: "apps/demo/src/main.ts",
lineIndex: 1,
lines: expect.arrayContaining([
expect.objectContaining({ content: "const retryLimit = 2;" }),
expect.objectContaining({ content: "const retryLimit = 4;" }),
]),
});
const changedCommentLine = changedTarget?.lines[changedTarget.lineIndex];
expect(data.rowIdByCommentLineId.get(changedCommentLine?.id ?? "")).toBe(changedLine?.id);
});
});