96 lines
2.9 KiB
JavaScript
96 lines
2.9 KiB
JavaScript
import Heading from '~/content_editor/extensions/heading';
|
|
import { toTree, getHeadings } from '~/content_editor/services/table_of_contents_utils';
|
|
import { createTestEditor, createDocBuilder } from '../test_utils';
|
|
|
|
describe('content_editor/services/table_of_content_utils', () => {
|
|
describe('toTree', () => {
|
|
it('should fills in gaps in heading levels and convert headings to a tree', () => {
|
|
expect(
|
|
toTree([
|
|
{ level: 3, text: '3' },
|
|
{ level: 2, text: '2' },
|
|
]),
|
|
).toEqual([
|
|
expect.objectContaining({
|
|
level: 1,
|
|
text: '',
|
|
subHeadings: [
|
|
expect.objectContaining({
|
|
level: 2,
|
|
text: '',
|
|
subHeadings: [expect.objectContaining({ level: 3, text: '3', subHeadings: [] })],
|
|
}),
|
|
expect.objectContaining({ level: 2, text: '2', subHeadings: [] }),
|
|
],
|
|
}),
|
|
]);
|
|
});
|
|
});
|
|
|
|
describe('getHeadings', () => {
|
|
const tiptapEditor = createTestEditor({
|
|
extensions: [Heading],
|
|
});
|
|
|
|
const {
|
|
builders: { heading, doc },
|
|
} = createDocBuilder({
|
|
tiptapEditor,
|
|
names: {
|
|
heading: { nodeType: Heading.name },
|
|
},
|
|
});
|
|
|
|
it('gets all headings as a tree in a tiptap document', () => {
|
|
const initialDoc = doc(
|
|
heading({ level: 1 }, 'Heading 1'),
|
|
heading({ level: 2 }, 'Heading 1.1'),
|
|
heading({ level: 3 }, 'Heading 1.1.1'),
|
|
heading({ level: 2 }, 'Heading 1.2'),
|
|
heading({ level: 3 }, 'Heading 1.2.1'),
|
|
heading({ level: 2 }, 'Heading 1.3'),
|
|
heading({ level: 2 }, 'Heading 1.4'),
|
|
heading({ level: 3 }, 'Heading 1.4.1'),
|
|
heading({ level: 1 }, 'Heading 2'),
|
|
);
|
|
|
|
tiptapEditor.commands.setContent(initialDoc.toJSON());
|
|
|
|
expect(getHeadings(tiptapEditor)).toEqual([
|
|
expect.objectContaining({
|
|
level: 1,
|
|
text: 'Heading 1',
|
|
subHeadings: [
|
|
expect.objectContaining({
|
|
level: 2,
|
|
text: 'Heading 1.1',
|
|
subHeadings: [
|
|
expect.objectContaining({ level: 3, text: 'Heading 1.1.1', subHeadings: [] }),
|
|
],
|
|
}),
|
|
expect.objectContaining({
|
|
level: 2,
|
|
text: 'Heading 1.2',
|
|
subHeadings: [
|
|
expect.objectContaining({ level: 3, text: 'Heading 1.2.1', subHeadings: [] }),
|
|
],
|
|
}),
|
|
expect.objectContaining({ level: 2, text: 'Heading 1.3', subHeadings: [] }),
|
|
expect.objectContaining({
|
|
level: 2,
|
|
text: 'Heading 1.4',
|
|
subHeadings: [
|
|
expect.objectContaining({ level: 3, text: 'Heading 1.4.1', subHeadings: [] }),
|
|
],
|
|
}),
|
|
],
|
|
}),
|
|
expect.objectContaining({
|
|
level: 1,
|
|
text: 'Heading 2',
|
|
subHeadings: [],
|
|
}),
|
|
]);
|
|
});
|
|
});
|
|
});
|