86 lines
2.8 KiB
TypeScript
86 lines
2.8 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { $createLinkNode, LinkNode } from "@lexical/link";
|
|
import { buildAgentMentionHref } from "@paperclipai/shared";
|
|
import {
|
|
createEditor,
|
|
$createParagraphNode,
|
|
$createTextNode,
|
|
$getRoot,
|
|
$getSelection,
|
|
$isRangeSelection,
|
|
} from "lexical";
|
|
import { deleteSelectedMentionChip } from "./mention-deletion";
|
|
|
|
function createTestEditor() {
|
|
return createEditor({
|
|
namespace: "mention-deletion-test",
|
|
nodes: [LinkNode],
|
|
onError(error: Error) {
|
|
throw error;
|
|
},
|
|
});
|
|
}
|
|
|
|
describe("mention deletion", () => {
|
|
it("removes the full mention when backspacing from inside the chip", () => {
|
|
const editor = createTestEditor();
|
|
|
|
editor.update(() => {
|
|
const root = $getRoot();
|
|
const paragraph = $createParagraphNode();
|
|
const before = $createTextNode("Hello ");
|
|
const mention = $createLinkNode(buildAgentMentionHref("agent-123", "code"));
|
|
const mentionText = $createTextNode("@QA");
|
|
const after = $createTextNode(" world");
|
|
|
|
mention.append(mentionText);
|
|
paragraph.append(before, mention, after);
|
|
root.append(paragraph);
|
|
|
|
mentionText.selectEnd();
|
|
|
|
expect(deleteSelectedMentionChip("backward")).toBe(true);
|
|
expect(root.getTextContent()).toBe("Hello world");
|
|
|
|
const selection = $getSelection();
|
|
expect($isRangeSelection(selection)).toBe(true);
|
|
if (!$isRangeSelection(selection)) {
|
|
throw new Error("Expected range selection after backward mention deletion");
|
|
}
|
|
expect(selection.isCollapsed()).toBe(true);
|
|
expect(selection.anchor.getNode().is(before)).toBe(true);
|
|
expect(selection.anchor.offset).toBe(before.getTextContentSize());
|
|
});
|
|
});
|
|
|
|
it("removes the full mention when deleting forward from adjacent text", () => {
|
|
const editor = createTestEditor();
|
|
|
|
editor.update(() => {
|
|
const root = $getRoot();
|
|
const paragraph = $createParagraphNode();
|
|
const before = $createTextNode("Hello ");
|
|
const mention = $createLinkNode(buildAgentMentionHref("agent-123", "code"));
|
|
const mentionText = $createTextNode("@QA");
|
|
const after = $createTextNode(" world");
|
|
|
|
mention.append(mentionText);
|
|
paragraph.append(before, mention, after);
|
|
root.append(paragraph);
|
|
|
|
before.selectEnd();
|
|
|
|
expect(deleteSelectedMentionChip("forward")).toBe(true);
|
|
expect(root.getTextContent()).toBe("Hello world");
|
|
|
|
const selection = $getSelection();
|
|
expect($isRangeSelection(selection)).toBe(true);
|
|
if (!$isRangeSelection(selection)) {
|
|
throw new Error("Expected range selection after forward mention deletion");
|
|
}
|
|
expect(selection.isCollapsed()).toBe(true);
|
|
expect(selection.anchor.getNode().is(after)).toBe(true);
|
|
expect(selection.anchor.offset).toBe(0);
|
|
});
|
|
});
|
|
});
|