// Dokument-Ansicht: Wikilink-Verlinkung im DOM und Editor-Flush.
import { describe, expect, it, vi } from "vitest";
import { initPanelView, linkWikiRefs } from "./panel-view";
describe("linkWikiRefs", () => {
it("verlinkt [[ziel]] und [[ziel|Label]], Code bleibt unangetastet", () => {
const root = document.createElement("div");
root.innerHTML =
"
Siehe [[adr-logging]] und [[notiz|die Notiz]].
" +
"if [[ -f x ]]; then
";
const onClick = vi.fn();
linkWikiRefs(root, onClick);
const links = [...root.querySelectorAll("a.wiki")];
expect(links.map((a) => a.textContent)).toEqual(["adr-logging", "die Notiz"]);
links[1].click();
expect(onClick).toHaveBeenCalledWith("notiz");
expect(root.querySelector("code")!.textContent).toBe("if [[ -f x ]]; then");
});
});
function viewSetup(onCommit: (text: string) => void | Promise) {
document.body.innerHTML = `
`;
const view = initPanelView({
content: document.getElementById("content")!,
copyBtn: document.getElementById("copy")!,
modeBtn: document.getElementById("mode")!,
editContentBtn: document.getElementById("edit")!,
onCommit,
});
const editor = document.querySelector(".panel-editor")!;
return { view, editor, editBtn: document.getElementById("edit")! };
}
describe("initPanelView — Editor", () => {
it("flush speichert eine offene Bearbeitung und beendet sie", async () => {
const onCommit = vi.fn();
const { view, editor, editBtn } = viewSetup(onCommit);
view.set("Alt");
editBtn.click();
expect(editor.hidden).toBe(false);
editor.value = "Neu";
await view.flush();
expect(onCommit).toHaveBeenCalledWith("Neu");
expect(editor.hidden).toBe(true);
});
it("flush ohne offene Bearbeitung tut nichts", async () => {
const onCommit = vi.fn();
const { view } = viewSetup(onCommit);
view.set("Alt");
await view.flush();
expect(onCommit).not.toHaveBeenCalled();
});
it("puffert eingehende Updates während der Bearbeitung", () => {
const { view, editor, editBtn } = viewSetup(() => {});
view.set("Alt");
editBtn.click();
view.set("Update von außen");
expect(editBtn.classList.contains("changed")).toBe(true);
editor.dispatchEvent(new KeyboardEvent("keydown", { key: "Escape" }));
expect(view.raw()).toBe("Update von außen");
});
});