// Modus-Logik (Tabs) und Kachel-Ansicht der Befehls-History.
import { beforeEach, describe, expect, it, vi } from "vitest";
import { initCommandsView, initPanelMode } from "./commands-view";
function modeSetup() {
document.body.innerHTML = `
Mein Titel
`;
const el = (id: string) => document.getElementById(id)!;
const flush = vi.fn();
const mode = initPanelMode({
tabsEl: el("tabs"),
draftEls: [el("draft-el")],
commandsContent: el("cc"),
searchContent: el("sc"),
wikiContent: el("wc"),
titleEl: el("title"),
flush,
});
const tab = (m: string) =>
document.querySelector(`[data-mode="${m}"]`)!;
return { mode, flush, el, tab };
}
describe("initPanelMode", () => {
it("startet im Dokument-Modus mit aktivem Tab", () => {
const { el, tab } = modeSetup();
expect(el("draft-el").hidden).toBe(false);
expect(el("cc").hidden).toBe(true);
expect(tab("draft").classList.contains("active")).toBe(true);
});
it("wechselt Sichtbarkeit, Titel und aktive Markierung", () => {
const { mode, flush, el, tab } = modeSetup();
mode.to("commands");
expect(flush).toHaveBeenCalledOnce();
expect(el("cc").hidden).toBe(false);
expect(el("draft-el").hidden).toBe(true);
expect(el("title").textContent).toBe("Befehle");
expect(tab("commands").classList.contains("active")).toBe(true);
expect(tab("draft").classList.contains("active")).toBe(false);
mode.to("draft");
expect(el("title").textContent).toBe("Mein Titel");
});
it("Tab-Klick wechselt den Modus", () => {
const { el, tab } = modeSetup();
tab("wiki").click();
expect(el("wc").hidden).toBe(false);
expect(el("draft-el").hidden).toBe(true);
});
it("clear hebt die Auswahl auf; danach wählt to() wieder aus", () => {
const { mode, el, tab } = modeSetup();
mode.clear();
expect(document.querySelectorAll(".active").length).toBe(0);
expect(mode.current()).toBe(null);
mode.to("draft");
expect(tab("draft").classList.contains("active")).toBe(true);
expect(el("title").textContent).toBe("Mein Titel");
});
});
describe("initCommandsView", () => {
beforeEach(() => {
document.body.innerHTML = ``;
});
const jsonl = [
JSON.stringify({ ts: 1700000000, session: true }),
JSON.stringify({
ts: 1700000100,
commands: [{ cmd: "ls -la", note: "Liste" }, { cmd: "pwd" }],
}),
].join("\n");
it("rendert Kacheln, Session-Trenner und meldet empty korrekt", () => {
const view = initCommandsView(document.getElementById("c")!, () => {});
view.set(jsonl);
expect(view.empty()).toBe(false);
expect(document.querySelectorAll(".cmd-tile").length).toBe(2);
expect(document.querySelectorAll(".cmd-sep").length).toBe(1);
expect(document.querySelector(".cmd-text")!.textContent).toBe("ls -la");
view.set("");
expect(view.empty()).toBe(true);
});
/// Der Befehlstext geht mit, weil die Indizes der Datei hinterherhinken
/// können; das Backend gleicht damit ab, bevor es löscht.
it("meldet Löschen mit Record-Index, Eintrags-Index und Befehl", () => {
const onDelete = vi.fn();
const view = initCommandsView(document.getElementById("c")!, onDelete);
view.set(jsonl);
const dels = document.querySelectorAll(".cmd-del");
dels[1].click(); // zweite Kachel im Record 1
expect(onDelete).toHaveBeenCalledWith(1, 1, "pwd");
});
});