mirror of
https://github.com/alkimake/paperclip.git
synced 2026-06-15 02:20:38 +09:00
79 lines
2.5 KiB
TypeScript
79 lines
2.5 KiB
TypeScript
|
|
import { describe, expect, it } from "vitest";
|
||
|
|
import {
|
||
|
|
addIssueCommentSchema,
|
||
|
|
createIssueSchema,
|
||
|
|
respondIssueThreadInteractionSchema,
|
||
|
|
suggestedTaskDraftSchema,
|
||
|
|
updateIssueSchema,
|
||
|
|
upsertIssueDocumentSchema,
|
||
|
|
} from "./issue.js";
|
||
|
|
|
||
|
|
describe("issue validators", () => {
|
||
|
|
it("passes real line breaks through unchanged", () => {
|
||
|
|
const parsed = createIssueSchema.parse({
|
||
|
|
title: "Follow up PR",
|
||
|
|
description: "Line 1\n\nLine 2",
|
||
|
|
});
|
||
|
|
|
||
|
|
expect(parsed.description).toBe("Line 1\n\nLine 2");
|
||
|
|
});
|
||
|
|
|
||
|
|
it("accepts null and omitted optional multiline issue fields", () => {
|
||
|
|
expect(createIssueSchema.parse({ title: "Follow up PR", description: null }).description)
|
||
|
|
.toBeNull();
|
||
|
|
expect(createIssueSchema.parse({ title: "Follow up PR" }).description)
|
||
|
|
.toBeUndefined();
|
||
|
|
expect(updateIssueSchema.parse({ comment: undefined }).comment)
|
||
|
|
.toBeUndefined();
|
||
|
|
});
|
||
|
|
|
||
|
|
it("normalizes JSON-escaped line breaks in issue descriptions", () => {
|
||
|
|
const parsed = createIssueSchema.parse({
|
||
|
|
title: "Follow up PR",
|
||
|
|
description: "PR: https://example.com/pr/1\\n\\nShip the follow-up.",
|
||
|
|
});
|
||
|
|
|
||
|
|
expect(parsed.description).toBe("PR: https://example.com/pr/1\n\nShip the follow-up.");
|
||
|
|
});
|
||
|
|
|
||
|
|
it("normalizes escaped line breaks in issue update comments", () => {
|
||
|
|
const parsed = updateIssueSchema.parse({
|
||
|
|
comment: "Done\\n\\n- Verified the route",
|
||
|
|
});
|
||
|
|
|
||
|
|
expect(parsed.comment).toBe("Done\n\n- Verified the route");
|
||
|
|
});
|
||
|
|
|
||
|
|
it("normalizes escaped line breaks in issue comment bodies", () => {
|
||
|
|
const parsed = addIssueCommentSchema.parse({
|
||
|
|
body: "Progress update\\r\\n\\r\\nNext action.",
|
||
|
|
});
|
||
|
|
|
||
|
|
expect(parsed.body).toBe("Progress update\n\nNext action.");
|
||
|
|
});
|
||
|
|
|
||
|
|
it("normalizes escaped line breaks in generated task drafts", () => {
|
||
|
|
const parsed = suggestedTaskDraftSchema.parse({
|
||
|
|
clientKey: "task-1",
|
||
|
|
title: "Follow up",
|
||
|
|
description: "Line 1\\n\\nLine 2",
|
||
|
|
});
|
||
|
|
|
||
|
|
expect(parsed.description).toBe("Line 1\n\nLine 2");
|
||
|
|
});
|
||
|
|
|
||
|
|
it("normalizes escaped line breaks in thread summaries and documents", () => {
|
||
|
|
const response = respondIssueThreadInteractionSchema.parse({
|
||
|
|
answers: [],
|
||
|
|
summaryMarkdown: "Summary\\n\\nNext action",
|
||
|
|
});
|
||
|
|
const document = upsertIssueDocumentSchema.parse({
|
||
|
|
format: "markdown",
|
||
|
|
body: "# Plan\\n\\nShip it",
|
||
|
|
});
|
||
|
|
|
||
|
|
expect(response.summaryMarkdown).toBe("Summary\n\nNext action");
|
||
|
|
expect(document.body).toBe("# Plan\n\nShip it");
|
||
|
|
});
|
||
|
|
});
|