import { Editor } from '@tiptap/core' import { Document } from '@tiptap/extension-document' import { Paragraph } from '@tiptap/extension-paragraph' import { Text } from '@tiptap/extension-text' import { afterEach, describe, expect, it } from 'vite-plus/test' import { CodeBlock } from './code-block.js' const pressArrowUp = (editor: Editor) => { editor.view.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowUp', code: 'ArrowUp' })) } describe('CodeBlock ArrowUp exit', () => { let editor: Editor afterEach(() => { editor?.destroy() }) it('inserts a paragraph above when the code block is the only node', () => { editor = new Editor({ extensions: [Document, Paragraph, Text, CodeBlock], content: '
hello',
})
editor.commands.setTextSelection(1)
pressArrowUp(editor)
expect(editor.getHTML()).toBe('hello')
expect(editor.state.selection.$from.parent.type.name).toBe('paragraph')
expect(editor.state.selection.from).toBe(1)
expect(editor.state.selection.to).toBe(1)
})
it('inserts a paragraph above when the code block is the first node in the doc', () => {
editor = new Editor({
extensions: [Document, Paragraph, Text, CodeBlock],
content: 'helloafter
', }) editor.commands.setTextSelection(1) pressArrowUp(editor) expect(editor.getHTML()).toBe('helloafter
') expect(editor.state.selection.$from.parent.type.name).toBe('paragraph') expect(editor.state.selection.from).toBe(1) expect(editor.state.selection.to).toBe(1) }) it('does nothing when exitOnArrowUp is disabled', () => { editor = new Editor({ extensions: [Document, Paragraph, Text, CodeBlock.configure({ exitOnArrowUp: false })], content: 'hello',
})
editor.commands.setTextSelection(1)
const before = editor.getHTML()
pressArrowUp(editor)
expect(editor.getHTML()).toBe(before)
})
it('does nothing when a node precedes the code block', () => {
editor = new Editor({
extensions: [Document, Paragraph, Text, CodeBlock],
content: 'before
hello',
})
let codeBlockContentStart = 0
editor.state.doc.descendants((node, pos) => {
if (node.type.name === 'codeBlock') {
codeBlockContentStart = pos + 1
return false
}
return true
})
editor.commands.setTextSelection(codeBlockContentStart)
const before = editor.getHTML()
pressArrowUp(editor)
expect(editor.getHTML()).toBe(before)
})
it('does nothing when the caret is not at the start of the code block', () => {
editor = new Editor({
extensions: [Document, Paragraph, Text, CodeBlock],
content: 'hello',
})
editor.commands.setTextSelection(3)
const before = editor.getHTML()
pressArrowUp(editor)
expect(editor.getHTML()).toBe(before)
})
})