mirror of
https://github.com/alibaba/lowcode-engine.git
synced 2026-03-02 15:27:18 +00:00
184 lines
6.2 KiB
TypeScript
184 lines
6.2 KiB
TypeScript
import set from 'lodash.set';
|
||
import cloneDeep from 'lodash.clonedeep';
|
||
import '../fixtures/window';
|
||
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 { getIdsFromSchema, getNodeFromSchemaById } from '../utils';
|
||
|
||
const mockCreateSettingEntry = jest.fn();
|
||
jest.mock('../../src/designer/designer', () => {
|
||
return {
|
||
Designer: jest.fn().mockImplementation(() => {
|
||
return {
|
||
getComponentMeta() {
|
||
return {
|
||
getMetadata() {
|
||
return { experimental: null };
|
||
},
|
||
};
|
||
},
|
||
transformProps(props) { return props; },
|
||
createSettingEntry: mockCreateSettingEntry,
|
||
postEvent() {},
|
||
};
|
||
}),
|
||
};
|
||
});
|
||
|
||
let designer = null;
|
||
beforeAll(() => {
|
||
designer = new Designer({});
|
||
});
|
||
|
||
describe('schema 生成节点模型测试', () => {
|
||
describe('block ❌ | component ❌ | slot ❌', () => {
|
||
it('基本的节点模型初始化,模型导出', () => {
|
||
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);
|
||
expect(mockCreateSettingEntry).toBeCalledTimes(expectedNodeCnt);
|
||
});
|
||
|
||
describe('节点新增(insertNode)', () => {
|
||
let project;
|
||
beforeEach(() => {
|
||
project = new Project(designer, {
|
||
componentsTree: [
|
||
formSchema,
|
||
],
|
||
});
|
||
project.open();
|
||
});
|
||
it.only('场景一:插入 NodeSchema', () => {
|
||
expect(project).toBeTruthy();
|
||
const ids = getIdsFromSchema(formSchema);
|
||
const { currentDocument } = project;
|
||
const { nodesMap } = currentDocument;
|
||
const formNode = nodesMap.get('node_k1ow3cbq');
|
||
currentDocument?.insertNode(formNode, {
|
||
componentName: 'TextInput',
|
||
id: 'nodeschema-id1',
|
||
props: {
|
||
propA: 'haha',
|
||
propB: 3
|
||
}
|
||
});
|
||
expect(nodesMap.get('nodeschema-id1').componentName).toBe('TextInput');
|
||
expect(nodesMap.size).toBe(ids.length + 1);
|
||
});
|
||
|
||
it.only('场景一:插入 NodeSchema,有 children', () => {
|
||
expect(project).toBeTruthy();
|
||
const ids = getIdsFromSchema(formSchema);
|
||
const { currentDocument } = project;
|
||
const { nodesMap } = currentDocument;
|
||
const formNode = nodesMap.get('node_k1ow3cbq');
|
||
currentDocument?.insertNode(formNode, {
|
||
componentName: 'TextInput',
|
||
id: 'nodeschema-id1',
|
||
props: {
|
||
propA: 'haha',
|
||
propB: 3
|
||
}
|
||
});
|
||
expect(nodesMap.get('nodeschema-id1').componentName).toBe('TextInput');
|
||
expect(nodesMap.size).toBe(ids.length + 1);
|
||
});
|
||
|
||
it.only('场景一:插入 NodeSchema,id 与现有 schema 重复', () => {
|
||
expect(project).toBeTruthy();
|
||
const ids = getIdsFromSchema(formSchema);
|
||
const { currentDocument } = project;
|
||
const { nodesMap } = currentDocument;
|
||
const formNode = nodesMap.get('node_k1ow3cbq');
|
||
currentDocument?.insertNode(formNode, {
|
||
componentName: 'TextInput',
|
||
id: 'nodeschema-id1',
|
||
props: {
|
||
propA: 'haha',
|
||
propB: 3
|
||
}
|
||
});
|
||
expect(nodesMap.get('nodeschema-id1').componentName).toBe('TextInput');
|
||
expect(nodesMap.size).toBe(ids.length + 1);
|
||
});
|
||
|
||
it.only('场景一:插入 NodeSchema,id 与现有 schema 重复,但关闭了 id 检测器', () => {
|
||
expect(project).toBeTruthy();
|
||
const ids = getIdsFromSchema(formSchema);
|
||
const { currentDocument } = project;
|
||
const { nodesMap } = currentDocument;
|
||
const formNode = nodesMap.get('node_k1ow3cbq');
|
||
currentDocument?.insertNode(formNode, {
|
||
componentName: 'TextInput',
|
||
id: 'nodeschema-id1',
|
||
props: {
|
||
propA: 'haha',
|
||
propB: 3
|
||
}
|
||
});
|
||
expect(nodesMap.get('nodeschema-id1').componentName).toBe('TextInput');
|
||
expect(nodesMap.size).toBe(ids.length + 1);
|
||
});
|
||
|
||
it('场景二:插入 Node 实例', () => {
|
||
expect(project).toBeTruthy();
|
||
const ids = getIdsFromSchema(formSchema);
|
||
const { currentDocument } = project;
|
||
const { nodesMap } = currentDocument;
|
||
const formNode = nodesMap.get('node_k1ow3cbq');
|
||
const inputNode = currentDocument?.createNode({
|
||
componentName: 'TextInput',
|
||
id: 'nodeschema-id2',
|
||
props: {
|
||
propA: 'haha',
|
||
propB: 3
|
||
}
|
||
});
|
||
expect(inputNode.id).toBe('nodeschema-id2');
|
||
currentDocument?.insertNode(formNode, inputNode);
|
||
expect(nodesMap.get('nodeschema-id2').componentName).toBe('TextInput');
|
||
expect(nodesMap.size).toBe(ids.length + 1);
|
||
});
|
||
|
||
it('场景二:插入 JSExpression', () => {});
|
||
});
|
||
|
||
})
|
||
|
||
it('block ❌ | component ❌ | slot ✅', () => {
|
||
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);
|
||
});
|
||
}); |