Files
dify/web/app/components/base/prompt-editor/plugins/variable-value-block/node.spec.tsx

93 lines
2.9 KiB
TypeScript

import type { EditorConfig, Klass, LexicalEditor, LexicalNode, SerializedTextNode } from 'lexical'
import { createEditor } from 'lexical'
import {
$createVariableValueBlockNode,
$isVariableValueNodeBlock,
VariableValueBlockNode,
} from './node'
describe('VariableValueBlockNode', () => {
let editor: LexicalEditor
let config: EditorConfig
beforeEach(() => {
vi.clearAllMocks()
editor = createEditor({
nodes: [VariableValueBlockNode as unknown as Klass<LexicalNode>],
})
config = editor._config
})
const runInEditor = (callback: () => void) => {
editor.update(callback, { discrete: true })
}
it('should expose static type and clone with same text/key', () => {
runInEditor(() => {
const original = new VariableValueBlockNode('value-text', 'node-key')
const cloned = VariableValueBlockNode.clone(original)
expect(VariableValueBlockNode.getType()).toBe('variable-value-block')
expect(cloned).toBeInstanceOf(VariableValueBlockNode)
expect(cloned).not.toBe(original)
expect(cloned.getKey()).toBe('node-key')
})
})
it('should add block classes in createDOM and disallow text insertion before', () => {
runInEditor(() => {
const node = new VariableValueBlockNode('hello')
const dom = node.createDOM(config)
expect(dom).toHaveClass('inline-flex')
expect(dom).toHaveClass('items-center')
expect(dom).toHaveClass('px-0.5')
expect(dom).toHaveClass('h-[22px]')
expect(dom).toHaveClass('text-text-accent')
expect(dom).toHaveClass('rounded-[5px]')
expect(dom).toHaveClass('align-middle')
expect(node.canInsertTextBefore()).toBe(false)
})
})
it('should import serialized node and preserve text metadata in export', () => {
runInEditor(() => {
const serialized = {
detail: 2,
format: 1,
mode: 'token',
style: 'color:red;',
text: '{{profile_name}}',
type: 'text',
version: 1,
} as SerializedTextNode
const imported = VariableValueBlockNode.importJSON(serialized)
const exported = imported.exportJSON()
expect(exported).toEqual({
detail: 2,
format: 1,
mode: 'token',
style: 'color:red;',
text: '{{profile_name}}',
type: 'variable-value-block',
version: 1,
})
})
})
it('should create node with helper and support type guard checks', () => {
runInEditor(() => {
const node = $createVariableValueBlockNode('{{org_id}}')
expect(node).toBeInstanceOf(VariableValueBlockNode)
expect(node.getTextContent()).toBe('{{org_id}}')
expect($isVariableValueNodeBlock(node)).toBe(true)
expect($isVariableValueNodeBlock(null)).toBe(false)
expect($isVariableValueNodeBlock(undefined)).toBe(false)
expect($isVariableValueNodeBlock({} as LexicalNode)).toBe(false)
})
})
})