mirror of
https://github.com/alibaba/lowcode-engine.git
synced 2025-12-12 11:20:11 +00:00
297 lines
9.0 KiB
TypeScript
297 lines
9.0 KiB
TypeScript
import set from 'lodash/set';
|
||
import cloneDeep from 'lodash/cloneDeep';
|
||
import '../fixtures/window';
|
||
import { Editor } from '@alilc/lowcode-editor-core';
|
||
import { Project } from '../../src/project/project';
|
||
import { Designer } from '../../src/designer/designer';
|
||
import formSchema from '../fixtures/schema/form';
|
||
import { getIdsFromSchema, getNodeFromSchemaById } from '../utils';
|
||
|
||
const mockCreateSettingEntry = jest.fn();
|
||
jest.mock('../../src/designer/designer', () => {
|
||
return {
|
||
Designer: jest.fn().mockImplementation(() => {
|
||
return {
|
||
getComponentMeta() {
|
||
return {
|
||
getMetadata() {
|
||
return { configure: { advanced: null } };
|
||
},
|
||
get advanced() {
|
||
return {};
|
||
},
|
||
};
|
||
},
|
||
transformProps(props) { return props; },
|
||
createSettingEntry: mockCreateSettingEntry,
|
||
postEvent() {},
|
||
};
|
||
}),
|
||
};
|
||
});
|
||
|
||
let designer = null;
|
||
beforeAll(() => {
|
||
designer = new Designer({});
|
||
designer.editor = new Editor();
|
||
});
|
||
|
||
describe('schema 生成节点模型测试', () => {
|
||
describe('block ❌ | component ❌ | slot ❌', () => {
|
||
beforeEach(() => {
|
||
mockCreateSettingEntry.mockClear();
|
||
});
|
||
|
||
it('基本的节点模型初始化,模型导出,初始化传入 schema', () => {
|
||
const project = new Project(designer, {
|
||
componentsTree: [
|
||
formSchema,
|
||
],
|
||
});
|
||
project.open();
|
||
expect(project).toBeTruthy();
|
||
const { currentDocument } = project;
|
||
const { nodesMap } = currentDocument;
|
||
const ids = getIdsFromSchema(formSchema);
|
||
const expectedNodeCnt = ids.length;
|
||
expect(nodesMap.size).toBe(expectedNodeCnt);
|
||
ids.forEach(id => {
|
||
expect(nodesMap.get(id).componentName).toBe(getNodeFromSchemaById(formSchema, id).componentName);
|
||
});
|
||
|
||
const exportSchema = currentDocument?.export(1);
|
||
expect(getIdsFromSchema(exportSchema).length).toBe(expectedNodeCnt);
|
||
nodesMap.forEach(node => {
|
||
// 触发 getter
|
||
node.settingEntry;
|
||
});
|
||
expect(mockCreateSettingEntry).toBeCalledTimes(expectedNodeCnt);
|
||
});
|
||
|
||
it('onSimulatorReady works', () => {
|
||
const project = new Project(designer, {
|
||
componentsTree: [
|
||
formSchema,
|
||
],
|
||
});
|
||
project.open();
|
||
expect(project).toBeTruthy();
|
||
const mockCallback = jest.fn();
|
||
const removeListener = project.onSimulatorReady(mockCallback);
|
||
project.mountSimulator(undefined);
|
||
expect(mockCallback).toBeCalled();
|
||
removeListener();
|
||
});
|
||
|
||
it('open doc when doc is blank', () => {
|
||
const project = new Project(designer);
|
||
project.open();
|
||
expect(project).toBeTruthy();
|
||
const blankDoc = project.documents[0];
|
||
expect(blankDoc).toBeTruthy();
|
||
// 触发保存
|
||
blankDoc.history.savePoint();
|
||
expect(blankDoc.isModified()).toBeFalsy();
|
||
expect(blankDoc.isBlank()).toBeTruthy();
|
||
|
||
//二次打开doc,会使用前面那个
|
||
const openedDoc = project.open();
|
||
expect(openedDoc).toBe(blankDoc);
|
||
});
|
||
|
||
it('load schema with autoOpen === true', () => {
|
||
const project = new Project(designer);
|
||
expect(project).toBeTruthy();
|
||
// trigger autoOpen case
|
||
project.load({
|
||
componentsTree: [
|
||
formSchema,
|
||
],
|
||
}, true);
|
||
const { currentDocument } = project;
|
||
const { nodesMap } = currentDocument;
|
||
const ids = getIdsFromSchema(formSchema);
|
||
const expectedNodeCnt = ids.length;
|
||
expect(nodesMap.size).toBe(expectedNodeCnt);
|
||
ids.forEach(id => {
|
||
expect(nodesMap.get(id).componentName).toBe(getNodeFromSchemaById(formSchema, id).componentName);
|
||
});
|
||
|
||
const exportSchema = currentDocument?.export(1);
|
||
expect(getIdsFromSchema(exportSchema).length).toBe(expectedNodeCnt);
|
||
nodesMap.forEach(node => {
|
||
// 触发 getter
|
||
node.settingEntry;
|
||
});
|
||
expect(mockCreateSettingEntry).toBeCalledTimes(expectedNodeCnt);
|
||
});
|
||
it('load schema with autoOpen === true, and config contains layout.props.tabBar.item', () => {
|
||
const project = new Project(designer);
|
||
expect(project).toBeTruthy();
|
||
// trigger autoOpen case
|
||
project.load({
|
||
componentsTree: [
|
||
{
|
||
...formSchema,
|
||
fileName: 'demoFile1',
|
||
},
|
||
{
|
||
...formSchema,
|
||
fileName: 'demoFile2',
|
||
}
|
||
],
|
||
config: {
|
||
layout: {
|
||
props: {
|
||
tabBar: {
|
||
items: [
|
||
{
|
||
path: '/demoFile2',
|
||
}
|
||
],
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}, true);
|
||
const { currentDocument } = project;
|
||
expect(currentDocument.fileName).toBe('demoFile2');
|
||
});
|
||
|
||
it('load schema with autoOpen === true', () => {
|
||
const project = new Project(designer);
|
||
expect(project).toBeTruthy();
|
||
// trigger autoOpen case
|
||
project.load({
|
||
componentsTree: [
|
||
{
|
||
...formSchema,
|
||
fileName: 'demoFile1',
|
||
},
|
||
{
|
||
...formSchema,
|
||
fileName: 'demoFile2',
|
||
}
|
||
],
|
||
}, 'demoFile2');
|
||
const { currentDocument } = project;
|
||
expect(currentDocument.fileName).toBe('demoFile2');
|
||
});
|
||
|
||
|
||
it('setSchema works', () => {
|
||
const project = new Project(designer);
|
||
project.open();
|
||
expect(project).toBeTruthy();
|
||
project.setSchema({
|
||
componentsTree: [
|
||
{
|
||
...formSchema,
|
||
fileName: 'demoFile1',
|
||
},
|
||
],
|
||
});
|
||
const { currentDocument } = project;
|
||
expect(currentDocument.fileName).toBe('demoFile1');
|
||
});
|
||
|
||
it('基本的节点模型初始化,模型导出,project.open 传入 schema', () => {
|
||
const project = new Project(designer);
|
||
project.open(formSchema);
|
||
expect(project).toBeTruthy();
|
||
const { currentDocument } = project;
|
||
const { nodesMap } = currentDocument;
|
||
const ids = getIdsFromSchema(formSchema);
|
||
const expectedNodeCnt = ids.length;
|
||
expect(nodesMap.size).toBe(expectedNodeCnt);
|
||
ids.forEach(id => {
|
||
expect(nodesMap.get(id).componentName).toBe(getNodeFromSchemaById(formSchema, id).componentName);
|
||
});
|
||
|
||
const exportSchema = currentDocument?.export(1);
|
||
expect(getIdsFromSchema(exportSchema).length).toBe(expectedNodeCnt);
|
||
nodesMap.forEach(node => {
|
||
// 触发 getter
|
||
node.settingEntry;
|
||
});
|
||
expect(mockCreateSettingEntry).toBeCalledTimes(expectedNodeCnt);
|
||
});
|
||
|
||
it('project 卸载所有 document - unload()', () => {
|
||
const project = new Project(designer);
|
||
project.open(formSchema);
|
||
expect(project).toBeTruthy();
|
||
const { currentDocument, documents } = project;
|
||
|
||
expect(documents).toHaveLength(1);
|
||
expect(currentDocument).toBe(documents[0]);
|
||
|
||
project.unload();
|
||
|
||
expect(documents).toHaveLength(0);
|
||
});
|
||
|
||
it('project 卸载指定 document - removeDocument()', () => {
|
||
const project = new Project(designer);
|
||
project.open(formSchema);
|
||
expect(project).toBeTruthy();
|
||
const { currentDocument, documents } = project;
|
||
|
||
expect(documents).toHaveLength(1);
|
||
expect(currentDocument).toBe(documents[0]);
|
||
|
||
project.removeDocument(currentDocument);
|
||
|
||
expect(documents).toHaveLength(0);
|
||
});
|
||
|
||
it('get unknown document', () => {
|
||
const project = new Project(designer);
|
||
project.open(formSchema);
|
||
expect(project).toBeTruthy();
|
||
expect(project.getDocument('unknownId')).toBeNull();
|
||
});
|
||
|
||
it('get set i18n works', () => {
|
||
const project = new Project(designer);
|
||
project.open(formSchema);
|
||
expect(project).toBeTruthy();
|
||
|
||
project.i18n = formSchema.i18n;
|
||
expect(project.i18n).toStrictEqual(formSchema.i18n);
|
||
project.i18n = null;
|
||
expect(project.i18n).toStrictEqual({});
|
||
|
||
project.set('i18n', formSchema.i18n);
|
||
expect(project.get('i18n')).toStrictEqual(formSchema.i18n);
|
||
project.set('i18n', null);
|
||
expect(project.get('i18n')).toStrictEqual({});
|
||
});
|
||
});
|
||
|
||
describe('block ❌ | component ❌ | slot ✅', () => {
|
||
it('基本的节点模型初始化,模型导出,初始化传入 schema', () => {
|
||
const formSchemaWithSlot = set(cloneDeep(formSchema), 'children[0].children[0].props.title.type', 'JSSlot');
|
||
const project = new Project(designer, {
|
||
componentsTree: [
|
||
formSchemaWithSlot,
|
||
],
|
||
});
|
||
project.open();
|
||
expect(project).toBeTruthy();
|
||
const { currentDocument } = project;
|
||
const { nodesMap } = currentDocument!;
|
||
const ids = getIdsFromSchema(formSchema);
|
||
// 目前每个 slot 会新增(1 + children.length)个节点
|
||
const expectedNodeCnt = ids.length + 2;
|
||
expect(nodesMap.size).toBe(expectedNodeCnt);
|
||
// PageHeader
|
||
expect(nodesMap.get('node_k1ow3cbd').slots).toHaveLength(1);
|
||
});
|
||
});
|
||
|
||
describe.skip('多 document 测试', () => {
|
||
|
||
});
|
||
});
|