mirror of
https://github.com/alibaba/lowcode-engine.git
synced 2025-12-12 11:09:21 +00:00
212 lines
6.6 KiB
TypeScript
212 lines
6.6 KiB
TypeScript
import '../../fixtures/window';
|
||
import { DocumentModel, isDocumentModel, isPageSchema } from '../../../src/document/document-model';
|
||
import { Editor } from '@alilc/lowcode-editor-core';
|
||
import { Project } from '../../../src/project/project';
|
||
import { Node } from '../../../src/document/node/node';
|
||
import { Designer } from '../../../src/designer/designer';
|
||
import formSchema from '../../fixtures/schema/form';
|
||
import divMeta from '../../fixtures/component-metadata/div';
|
||
import formMeta from '../../fixtures/component-metadata/form';
|
||
import otherMeta from '../../fixtures/component-metadata/other';
|
||
import pageMeta from '../../fixtures/component-metadata/page';
|
||
// const { DocumentModel } = require('../../../src/document/document-model');
|
||
// const { Node } = require('../__mocks__/node');
|
||
|
||
describe('document-model 测试', () => {
|
||
let editor: Editor;
|
||
let designer: Designer;
|
||
let project: Project;
|
||
|
||
beforeEach(() => {
|
||
editor = new Editor();
|
||
designer = new Designer({ editor });
|
||
project = designer.project;
|
||
});
|
||
|
||
test('empty schema', () => {
|
||
const doc = new DocumentModel(project);
|
||
expect(doc.rootNode.id).toBe('root');
|
||
expect(doc.currentRoot).toBe(doc.rootNode);
|
||
expect(doc.root).toBe(doc.rootNode);
|
||
expect(doc.modalNode).toBeUndefined();
|
||
expect(doc.isBlank()).toBeTruthy();
|
||
expect(doc.schema).toEqual({
|
||
componentName: 'Page',
|
||
condition: true,
|
||
conditionGroup: '',
|
||
hidden: false,
|
||
isLocked: false,
|
||
loop: undefined,
|
||
title: '',
|
||
id: 'root',
|
||
fileName: '',
|
||
props: {},
|
||
});
|
||
});
|
||
|
||
test('各种方法测试', () => {
|
||
const doc = new DocumentModel(project, formSchema);
|
||
const mockNode = { id: 1 };
|
||
doc.addWillPurge(mockNode);
|
||
expect(doc.willPurgeSpace).toHaveLength(1);
|
||
doc.removeWillPurge(mockNode);
|
||
expect(doc.willPurgeSpace).toHaveLength(0);
|
||
|
||
expect(doc.toData()).toMatchSnapshot();
|
||
|
||
// 测试插入已存在的 id,id 将会被重置
|
||
const formParentNode = doc.getNode('form').parent;
|
||
doc.insertNode(formParentNode, { id: 'form', componentName: 'Form' });
|
||
expect(formParentNode.children.get(formParentNode.children.size - 1).id).not.toBe('form');
|
||
|
||
doc.internalRemoveAndPurgeNode({ id: 'mockId' });
|
||
|
||
// internalSetDropLocation
|
||
doc.internalSetDropLocation({ a: 1 });
|
||
expect(doc.dropLocation).toEqual({ a: 1 });
|
||
|
||
// wrapWith
|
||
// none-selected
|
||
doc.wrapWith({ componentName: 'Wrap' });
|
||
doc.selection.select('form');
|
||
doc.wrapWith({ componentName: 'Wrap' });
|
||
expect(doc.getNode('form').parent.componentName).toBe('Wrap');
|
||
expect(doc.wrapWith({ componentName: 'Leaf' })).toBeNull();
|
||
|
||
// fileName
|
||
expect(doc.fileName).toBeTruthy();
|
||
doc.fileName = 'fileName';
|
||
expect(doc.fileName).toBe('fileName');
|
||
|
||
expect(doc.getNodeSchema(doc.getNode('form'))).toMatchSnapshot();
|
||
|
||
// TODO:
|
||
// expect(doc.simulatorProps).toMatchSnapshot();
|
||
|
||
const mockSimulator = {
|
||
isSimulator: true,
|
||
getComponent() {
|
||
return 'haha';
|
||
},
|
||
setSuspense() {},
|
||
};
|
||
doc.project.mountSimulator(mockSimulator);
|
||
expect(doc.simulator).toEqual(mockSimulator);
|
||
expect(doc.getComponent('Div')).toBe('haha');
|
||
|
||
expect(doc.opened).toBeFalsy();
|
||
expect(doc.isModified).toBeTruthy();
|
||
expect(doc.suspensed).toBeTruthy();
|
||
|
||
doc.open();
|
||
expect(doc.opened).toBeTruthy();
|
||
expect(doc.actived).toBeTruthy();
|
||
expect(doc.isModified).toBeTruthy();
|
||
expect(doc.suspensed).toBeFalsy();
|
||
|
||
doc.suspense();
|
||
doc.activate();
|
||
doc.close();
|
||
doc.remove();
|
||
|
||
const offReady = doc.onReady(() => {});
|
||
offReady();
|
||
|
||
expect(doc.history).toBe(doc.getHistory());
|
||
});
|
||
|
||
it('registerAddon / getAddonData / exportAddonData', () => {
|
||
const doc = new DocumentModel(project);
|
||
doc.registerAddon('a', () => 'addon a');
|
||
doc.registerAddon('a', () => 'modified addon a');
|
||
doc.registerAddon('b', () => 'addon b');
|
||
doc.registerAddon('c', () => null);
|
||
|
||
['id', 'layout', 'params'].forEach((name) => {
|
||
expect(() => doc.registerAddon(name, () => {})).toThrow();
|
||
});
|
||
|
||
expect(doc.getAddonData('a')).toBe('modified addon a');
|
||
expect(doc.getAddonData('b')).toBe('addon b');
|
||
|
||
expect(doc.exportAddonData()).toEqual({
|
||
a: 'modified addon a',
|
||
b: 'addon b',
|
||
});
|
||
});
|
||
|
||
it('checkNesting / checkDropTarget / checkNestingUp / checkNestingDown', () => {
|
||
designer.createComponentMeta(pageMeta);
|
||
designer.createComponentMeta(formMeta);
|
||
const doc = new DocumentModel(project, formSchema);
|
||
|
||
expect(
|
||
doc.checkDropTarget(doc.getNode('page'), { type: 'node', nodes: [doc.getNode('form')] }),
|
||
).toBeTruthy();
|
||
expect(
|
||
doc.checkDropTarget(doc.getNode('page'), {
|
||
type: 'nodedata',
|
||
data: { componentName: 'Form' },
|
||
}),
|
||
).toBeTruthy();
|
||
|
||
expect(
|
||
doc.checkNesting(doc.getNode('page'), { type: 'node', nodes: [doc.getNode('form')] }),
|
||
).toBeTruthy();
|
||
expect(
|
||
doc.checkNesting(doc.getNode('page'), {
|
||
type: 'nodedata',
|
||
data: { componentName: 'Form' },
|
||
}),
|
||
).toBeTruthy();
|
||
|
||
expect(doc.checkNestingUp(doc.getNode('page'), null)).toBeTruthy();
|
||
});
|
||
|
||
it('getComponentsMap', () => {
|
||
designer.createComponentMeta(divMeta);
|
||
designer.createComponentMeta(otherMeta);
|
||
const doc = new DocumentModel(project, formSchema);
|
||
const comps = doc.getComponentsMap(['Other']);
|
||
expect(comps.find(comp => comp.componentName === 'Div')).toEqual(
|
||
{ componentName: 'Div', package: '@ali/vc-div' }
|
||
);
|
||
expect(comps.find(comp => comp.componentName === 'Other')).toEqual(
|
||
{ componentName: 'Other', package: '@ali/vc-other' }
|
||
);
|
||
expect(comps.find(comp => comp.componentName === 'Page')).toEqual(
|
||
{ componentName: 'Page', devMode: 'lowCode' }
|
||
);
|
||
});
|
||
|
||
it('acceptRootNodeVisitor / getRootNodeVisitor', () => {
|
||
designer.createComponentMeta(divMeta);
|
||
designer.createComponentMeta(otherMeta);
|
||
const doc = new DocumentModel(project, formSchema);
|
||
const ret = doc.acceptRootNodeVisitor('getPageId', (root) => {
|
||
return 'page';
|
||
});
|
||
expect(ret).toBe('page');
|
||
expect(doc.getRootNodeVisitor('getPageId')).toBe('page');
|
||
|
||
// expect(doc.getComponentsMap(['Other'])).toEqual([
|
||
// { componentName: 'Div', package: '@ali/vc-div' },
|
||
// { componentName: 'Other', package: '@ali/vc-other' },
|
||
// ]);
|
||
});
|
||
|
||
it('deprecated methods', () => {
|
||
const doc = new DocumentModel(project, formSchema);
|
||
doc.refresh();
|
||
doc.onRefresh();
|
||
});
|
||
});
|
||
|
||
it('isDocumentModel', () => {
|
||
expect(isDocumentModel({ rootNode: {} })).toBeTruthy();
|
||
});
|
||
|
||
it('isPageSchema', () => {
|
||
expect(isPageSchema({ componentName: 'Page' })).toBeTruthy();
|
||
});
|