dragooncjw d7bdf8a078 feat: init flowgram.ai
Co-Authored-By: xiamidaxia <xiamidaxia@icloud.com>
2025-02-21 16:26:12 +08:00

117 lines
3.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { describe, it, expect, beforeEach, vi } from 'vitest';
import { FlowDocument, FlowNodeEntity } from '@flowgram.ai/editor';
import { getNodeChildrenIds } from '../utils';
import { createContainer } from '../create-container';
import { FlowOperationService } from '../../src/types';
import { baseMock } from '../../__mocks__/flow.mock';
describe('flow-operation-service', () => {
let flowOperationService: FlowOperationService;
let flowDocument: FlowDocument;
beforeEach(() => {
const container = createContainer({});
flowDocument = container.get(FlowDocument);
flowOperationService = container.get(FlowOperationService);
flowDocument.fromJSON(baseMock);
});
it('addFromNode', () => {
const type = 'test';
const nodeJSON = {
id: 'test',
type,
};
const added = flowOperationService.addFromNode('start_0', nodeJSON);
const node = flowDocument.getNode(added.id) as FlowNodeEntity;
expect(node).toBe(added);
expect(added.id).toEqual(nodeJSON.id);
});
it('deleteNode', () => {
const id = 'dynamicSplit_0';
flowOperationService.deleteNode(id);
const node = flowDocument.getNode(id);
expect(node).toBeUndefined();
});
it('delete block by deleteNode', () => {
const id = 'block_0';
flowOperationService.deleteNode(id);
const node = flowDocument.getNode(id);
expect(node).toBeUndefined();
});
it('addNode', () => {
const nodeJSON = {
id: 'test-node',
type: 'test',
};
const parent = flowDocument.getNode('start_0');
const added = flowOperationService.addNode(nodeJSON, {
parent,
});
const entity = flowDocument.getNode(added.id);
expect(entity).toBe(added);
expect(entity?.parent).toBe(parent);
expect(entity?.originParent).toBeUndefined();
});
it('addBlock', () => {
const target = flowDocument.getNode('dynamicSplit_0') as FlowNodeEntity;
const added = flowOperationService.addBlock(target, {
id: 'test-block',
type: 'test-block',
});
const entity = flowDocument.getNode(added.id);
expect(entity).toBe(added);
expect(entity?.parent?.id).toEqual('$inlineBlocks$dynamicSplit_0');
expect(entity?.originParent).toBe(target);
});
it('deleteNodes', () => {
const parent = flowDocument.getNode('start_0');
const added = flowOperationService.addNode(
{
id: 'delete-node',
type: 'test',
},
{
parent,
},
);
flowOperationService.deleteNodes([added]);
expect(flowDocument.getNode(added.id)).toBeUndefined();
});
it('createGroup ungroup', () => {
const node1 = flowOperationService.addFromNode('start_0', {
id: 'add',
type: 'add',
});
const node2 = flowDocument.getNode('dynamicSplit_0') as FlowNodeEntity;
// TODO 这里需要优化理论上createGroup不应该依赖渲染现在createGroup内部有一个index的校验但index在transformer中被设置对了
flowDocument.transformer.refresh();
const group = flowOperationService.createGroup([node1, node2]) as FlowNodeEntity;
const root = flowDocument.getNode('root');
expect(root?.collapsedChildren.map(c => c.id)).toEqual(['start_0', group.id, 'end_0']);
expect(group.collapsedChildren.map(c => c.id)).toEqual([node1.id, node2.id]);
flowOperationService.ungroup(group);
expect(root?.collapsedChildren.map(c => c.id)).toEqual([
'start_0',
'add',
'dynamicSplit_0',
'end_0',
]);
});
it('moveNode', () => {
flowOperationService.moveNode('block_1', {
index: 2,
});
const split = flowDocument.getNode('dynamicSplit_0');
expect(getNodeChildrenIds(split, true)).toEqual(['block_0', 'block_2', 'block_1']);
});
});