import { describe, expect, it } from "vitest"; import { readFileSync } from "node:fs"; import { resolve } from "node:path"; const readSource = () => readFileSync(resolve(__dirname, "./DocumentList.vue"), "utf8"); describe("DocumentList permissions", () => { it("guards create edit and delete actions with document operation permissions", () => { const source = readSource(); expect(source).toContain('can("documents.create")'); expect(source).toContain('can("documents.update")'); expect(source).toContain('can("documents.delete")'); expect(source).toContain('v-if="canCreate"'); expect(source).toContain('v-if="canUpdate"'); expect(source).toContain('v-if="canDelete"'); expect(source).toContain('@click.stop="openEdit(row)"'); expect(source).not.toContain(':disabled="!canCreate"'); }); it("uses a drawer for creating documents instead of a dialog", () => { const source = readSource(); expect(source).toContain(" { const source = readSource(); expect(source).toContain("useDrawerDirtyGuard"); expect(source).toContain('const editorDirtyGuard = useDrawerDirtyGuard(() => editorForm);'); expect(source).toContain(':close-on-click-modal="true"'); expect(source).toContain(':before-close="editorDirtyGuard.beforeClose"'); expect(source).toContain("editorDirtyGuard.syncBaseline()"); }); it("uses the shared datetime formatter and splits updated-at into two lines", () => { const source = readSource(); expect(source).toContain("displayDateTime"); expect(source).toContain("splitDateTime(row.updated_at).date"); expect(source).toContain("splitDateTime(row.updated_at).time"); expect(source).toContain("const displayValue = displayDateTime(value)"); expect(source).not.toContain('replace("T", " ").replace("Z", "")'); }); it("keeps desktop document browsing in a master detail workflow", () => { const source = readSource(); expect(source).toContain("const isDesktop = isTauriRuntime();"); expect(source).toContain('class="document-workbench"'); expect(source).toContain('class="document-preview-pane"'); expect(source).toContain("selectedDocument"); expect(source).toContain('@row-click="handleDocumentRowClick"'); expect(source).toContain('@row-dblclick="openDocumentDetail"'); expect(source).toContain('@keydown.enter.prevent="openSelectedDocument"'); expect(source).toContain("selectDocument(row);"); expect(source).toContain("return;"); expect(source).toContain("goDetail(row.id);"); expect(source).not.toContain('@row-click="handleRowClick"'); }); it("routes desktop document actions through preview and context menu controls", () => { const source = readSource(); expect(source).toContain('@row-contextmenu="openDocumentContextMenu"'); expect(source).toContain("documentContextMenu"); expect(source).toContain('class="document-context-menu"'); expect(source).toContain("@click=\"openSelectedDocument\""); expect(source).toContain("@click=\"openSelectedDocumentEditor\""); expect(source).toContain("@click=\"deleteSelectedDocument\""); expect(source).toContain(':disabled="isInactiveSite(selectedDocument.site_id)"'); expect(source).toContain('v-if="!isDesktop && (canUpdate || canDelete)"'); expect(source).toContain('"row-selected"'); }); });