Files
openmaic/OpenMAIC/tests/prosemirror/active-editor-registry.test.ts
2026-08-16 14:58:47 +08:00

43 lines
1.6 KiB
TypeScript

import { describe, it, expect, vi } from 'vitest';
import type { Transaction } from 'prosemirror-state';
import {
registerActiveTextEditor,
runActiveTextCommand,
hasActiveTextEditor,
} from '@/lib/prosemirror/active-editor-registry';
import { shouldPushAttrs } from '@/lib/prosemirror/selection-sync';
/** Minimal transaction stub — only the three boolean fields shouldPushAttrs reads. */
const tx = (p: { selectionSet?: boolean; docChanged?: boolean; storedMarksSet?: boolean }) =>
p as unknown as Transaction;
describe('active text editor registry', () => {
it('routes a command to the registered element and clears on unregister', () => {
const run = vi.fn();
const off = registerActiveTextEditor('el-1', run);
expect(hasActiveTextEditor('el-1')).toBe(true);
runActiveTextCommand('el-1', { command: 'bold' });
expect(run).toHaveBeenCalledWith({ command: 'bold' });
off();
expect(hasActiveTextEditor('el-1')).toBe(false);
runActiveTextCommand('el-1', { command: 'bold' }); // no throw when absent
});
});
describe('selection sync gate', () => {
it('pushes on selection move, doc change, or stored-marks change', () => {
expect(
shouldPushAttrs(tx({ selectionSet: true, docChanged: false, storedMarksSet: false })),
).toBe(true);
expect(
shouldPushAttrs(tx({ selectionSet: false, docChanged: true, storedMarksSet: false })),
).toBe(true);
expect(
shouldPushAttrs(tx({ selectionSet: false, docChanged: false, storedMarksSet: true })),
).toBe(true);
expect(
shouldPushAttrs(tx({ selectionSet: false, docChanged: false, storedMarksSet: false })),
).toBe(false);
});
});