flow-label-layer.test.tsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /**
  2. * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
  3. * SPDX-License-Identifier: MIT
  4. */
  5. import React from 'react';
  6. import { beforeEach, describe, expect, it, vi } from 'vitest';
  7. import { Container, decorate, injectable, type interfaces } from 'inversify';
  8. import { render } from '@testing-library/react';
  9. import {
  10. FlowDocument,
  11. FlowDocumentContainerModule,
  12. FlowDocumentContribution,
  13. } from '@flowgram.ai/document';
  14. import {
  15. createDefaultPlaygroundConfig,
  16. PlaygroundConfig,
  17. PlaygroundContainerModule,
  18. } from '@flowgram.ai/core';
  19. import { FlowLabelsLayer } from '../../src/layers/flow-labels-layer';
  20. import { FlowRendererRegistry, FlowTextKey } from '../../src/flow-renderer-registry';
  21. import { FlowRendererContribution } from '../../src/flow-renderer-contribution';
  22. import { FlowRendererContainerModule } from '../../src/flow-renderer-container-module';
  23. import { flowJson } from '../../__mocks__/flow-mock-node-json';
  24. import { FlowLabelsMockRegister } from '../../__mocks__/flow-labels-mock-register';
  25. import { FlowDocumentMockRegister } from '../../__mocks__/flow-document-container.mock';
  26. class FlowRenderMockRegister implements FlowRendererContribution {
  27. registerRenderer(registry: FlowRendererRegistry): void {
  28. registry.registerLayers(FlowLabelsLayer);
  29. }
  30. }
  31. decorate(injectable(), FlowRenderMockRegister);
  32. function createDocumentContainer(): interfaces.Container {
  33. const container = new Container();
  34. container.load(FlowDocumentContainerModule);
  35. container.bind(FlowDocumentContribution).to(FlowDocumentMockRegister);
  36. return container;
  37. }
  38. // layer 层 drag entity 单测
  39. describe('flow-label-layer', () => {
  40. let container = createDocumentContainer();
  41. let document: FlowDocument;
  42. let registry: FlowRendererRegistry;
  43. beforeEach(() => {
  44. container = createDocumentContainer();
  45. container.load(FlowRendererContainerModule);
  46. container.load(PlaygroundContainerModule);
  47. container.bind(FlowRendererContribution).to(FlowRenderMockRegister);
  48. container.bind(PlaygroundConfig).toConstantValue(createDefaultPlaygroundConfig());
  49. document = container.get<FlowDocument>(FlowDocument);
  50. document.init();
  51. document.registerFlowNodes(
  52. FlowLabelsMockRegister, // 通过 getLabel 方法 mock label
  53. );
  54. document.fromJSON(flowJson);
  55. registry = container.get<FlowRendererRegistry>(FlowRendererRegistry);
  56. registry.init();
  57. });
  58. // 测试初始化
  59. it('test ready', () => {
  60. registry.pipeline.renderer.layers.forEach(layer => {
  61. layer?.onReady?.();
  62. expect(layer.node.style.zIndex).toEqual('9');
  63. });
  64. });
  65. // 缩放
  66. it('test zoom', () => {
  67. registry.pipeline.renderer.layers.forEach(layer => {
  68. layer?.onZoom?.(2);
  69. expect(layer.node!.style.transform).toEqual('scale(2)');
  70. });
  71. });
  72. // FIXME: render 单测目前不全
  73. // 渲染
  74. it('test render', () => {
  75. vi.mock('@flowgram.ai/core', async importOriginal => {
  76. const contextMaker = {
  77. makeFormItemMaterialContext: vi.fn().mockReturnValue('mock-context'),
  78. isDragBranch: true,
  79. labelSide: 'left',
  80. isDroppableBranch: () => true,
  81. dropNodeId: 'mock',
  82. dragging: true,
  83. isDroppableNode: () => true,
  84. };
  85. return {
  86. // @ts-ignore
  87. ...(await importOriginal()),
  88. // mock Adder 组件里的 useService
  89. useService: vi.fn().mockReturnValue(contextMaker),
  90. };
  91. });
  92. const res: (JSX.Element | undefined)[] = [];
  93. registry.pipeline.renderer.layers.forEach(layer => {
  94. const render = (layer as any)?._render?.bind(layer);
  95. // mock rendererRegistry
  96. // @ts-ignore
  97. layer.rendererRegistry = {
  98. getRendererComponent: () => ({
  99. renderer: () => null,
  100. }),
  101. getText: key => {
  102. if (key === FlowTextKey.LOOP_WHILE_TEXT) {
  103. return '123';
  104. }
  105. return;
  106. },
  107. };
  108. res.push(render());
  109. });
  110. const app = render(<>{res}</>);
  111. expect(app.asFragment()).toMatchSnapshot();
  112. });
  113. });