Files
famapp/tests/unit/rich-text.test.ts
ginnoir a4be5d5061 feat(notes): rich-text editor with tiptap (task 85)
Replace plain textarea with shared tiptap editor and sanitized html rendering.

Adds interactive checklists on read surfaces and mobile overflow fixes.
2026-07-04 19:25:15 -05:00

37 lines
1.4 KiB
TypeScript

import assert from "node:assert/strict";
import { describe, it } from "node:test";
import { normalizeNoteBody } from "../../src/components/rich-text/normalize-body";
import { sanitizeRichTextHtml } from "../../src/components/rich-text/sanitize";
import { toggleTaskItemInHtml } from "../../src/components/rich-text/toggle-checklist";
describe("normalizeNoteBody", () => {
it("wraps plain text paragraphs in HTML", () => {
const html = normalizeNoteBody("Hello\n\nWorld");
assert.match(html, /<p>Hello<\/p>/);
assert.match(html, /<p>World<\/p>/);
});
it("preserves existing HTML", () => {
const input = "<p><strong>Bold</strong></p>";
assert.equal(normalizeNoteBody(input), input);
});
});
describe("sanitizeRichTextHtml", () => {
it("strips script tags", () => {
const safe = sanitizeRichTextHtml('<p>Hi</p><script>alert("x")</script>');
assert.doesNotMatch(safe, /<script/i);
assert.match(safe, /Hi/);
});
});
describe("toggleTaskItemInHtml", () => {
it("flips the requested checklist item", () => {
const html =
'<ul data-type="taskList"><li data-type="taskItem" data-checked="false"><p>One</p></li><li data-type="taskItem" data-checked="false"><p>Two</p></li></ul>';
const next = toggleTaskItemInHtml(html, 1, true);
assert.match(next, /data-checked="false"/);
assert.match(next, /data-checked="true"/);
});
});