free-layout-preset.test.ts 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /**
  2. * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
  3. * SPDX-License-Identifier: MIT
  4. */
  5. import React from 'react';
  6. import { describe, it, expect } from 'vitest';
  7. import { WorkflowDocument } from '@flowgram.ai/free-layout-core';
  8. import { FlowDocument, FlowNodeFormData } from '@flowgram.ai/editor';
  9. import { WorkflowOperationService } from '../src/types';
  10. import { mockJSON, mockJSON2, mockSimpleJSON, mockSimpleJSON2 } from '../__mocks__/flow.mocks';
  11. import { createEditor } from './create-editor';
  12. describe('free-layout-preset', () => {
  13. it('fromJSON and toJSON', () => {
  14. const editor = createEditor({});
  15. const document = editor.get(WorkflowDocument);
  16. document.fromJSON(mockJSON);
  17. expect(document.toJSON()).toEqual(mockJSON);
  18. document.fromJSON(mockJSON2);
  19. expect(document.toJSON()).toEqual(mockJSON2);
  20. });
  21. it('operation fromJSON', () => {
  22. const editor = createEditor({
  23. history: {
  24. enable: true,
  25. },
  26. });
  27. const operation = editor.get<WorkflowOperationService>(WorkflowOperationService);
  28. const document = editor.get(WorkflowDocument);
  29. operation.fromJSON(mockJSON);
  30. expect(document.toJSON()).toEqual(mockJSON);
  31. document.clear();
  32. operation.fromJSON(mockJSON2);
  33. expect(document.toJSON()).toEqual(mockJSON2);
  34. });
  35. it('custom fromNodeJSON and toNodeJSON', () => {
  36. const container = createEditor({
  37. fromNodeJSON: (node, json, isFirstCreate) => {
  38. if (!json.data) {
  39. json.data = {};
  40. }
  41. json.data = { ...json.data, isFirstCreate };
  42. return json;
  43. },
  44. toNodeJSON(node, json) {
  45. json.data!.runningTimes = (json.data!.runningTimes || 0) + 1;
  46. return json;
  47. },
  48. });
  49. container.get(FlowDocument).fromJSON(mockSimpleJSON);
  50. expect(container.get(FlowDocument).toJSON()).toMatchSnapshot();
  51. container.get(FlowDocument).fromJSON(mockSimpleJSON2);
  52. expect(container.get(FlowDocument).toJSON()).toMatchSnapshot();
  53. });
  54. it('nodeEngine(v2) toJSON', async () => {
  55. const container = createEditor({
  56. nodeEngine: {},
  57. nodeRegistries: [
  58. {
  59. type: 'start',
  60. formMeta: {
  61. render: () => React.createElement('div', { className: 'start-node' }),
  62. },
  63. },
  64. {
  65. type: 'end',
  66. formMeta: {
  67. render: () => React.createElement('div', { className: 'end-node' }),
  68. },
  69. },
  70. ],
  71. });
  72. const flowDocument = container.get(FlowDocument);
  73. flowDocument.fromJSON(mockSimpleJSON);
  74. expect(flowDocument.toJSON()).toEqual(mockSimpleJSON);
  75. flowDocument.fromJSON(mockSimpleJSON2);
  76. expect(flowDocument.toJSON()).toEqual(mockSimpleJSON2);
  77. const { formModel } = flowDocument.getNode('start_0')!.getData(FlowNodeFormData);
  78. expect(formModel.getFormItemByPath('title')!.value).toEqual('start changed');
  79. formModel.getFormItemByPath('title')!.value = 'start changed 2';
  80. expect(formModel.toJSON()).toEqual({
  81. title: 'start changed 2',
  82. });
  83. });
  84. });