/** * This file is part of the NocoBase (R) project. * Copyright (c) 2020-2024 NocoBase Co., Ltd. * Authors: NocoBase Team. * * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License. * For more information, please refer to: https://www.nocobase.com/agreement. */ import { describe, it, expect } from 'vitest'; import React from 'react'; import { render, screen, cleanup } from '@testing-library/react'; import { FlowEngine } from '../flowEngine'; import { FlowModel, ModelRenderMode } from '../models/flowModel'; describe('FlowModel.renderHiddenInConfig', () => { it('renders via renderHiddenInConfig when hidden and config enabled (React element mode, mounted)', async () => { class ElemModel extends FlowModel { render() { return
Content
; } protected renderHiddenInConfig(): React.ReactNode | undefined { return
HiddenViaAPI
; } } const engine = new FlowEngine(); const model = new ElemModel({ uid: 'elem-1', flowEngine: engine }); // runtime hidden => mounted result should be empty (no content/hidden) await engine.flowSettings.disable(); model.setHidden(true); const { container, unmount, rerender } = render(model.render() as React.ReactElement); expect(screen.queryByTestId('content')).toBeNull(); expect(screen.queryByTestId('hidden')).toBeNull(); // config enabled + hidden => should show renderHiddenInConfig result await engine.flowSettings.enable(); rerender(model.render() as React.ReactElement); expect(screen.getByTestId('hidden').textContent).toBe('HiddenViaAPI'); // visible => show original render model.setHidden(false); rerender(model.render() as React.ReactElement); expect(screen.getByTestId('content').textContent).toBe('Content'); unmount(); cleanup(); }); it('returns a render function when hidden and config enabled (RenderFunction mode)', async () => { class FuncModel extends FlowModel { static override renderMode = ModelRenderMode.RenderFunction; render() { return () => Cell; } protected renderHiddenInConfig(): React.ReactNode | undefined { // return a cell renderer return No permission; } } const engine = new FlowEngine(); engine.registerModels({ FuncModel: FuncModel }); const model = engine.createModel({ use: 'FuncModel' }) as FuncModel; // runtime hidden => null await engine.flowSettings.disable(); model.setHidden(true); const runtimeHidden = model.render(); expect(runtimeHidden).toBeNull(); // config enabled + hidden => renderHiddenInConfig (function) await engine.flowSettings.enable(); const cfgHidden = model.render(); expect(typeof cfgHidden).toBe('function'); const cellNode = (cfgHidden as any)(); // Allow either a React element or a plain string depending on environment/mocks if (typeof cellNode === 'string') { expect(cellNode).toBe('No permission'); } else { expect(cellNode && typeof cellNode === 'object').toBe(true); expect((cellNode as any).props?.children).toBe('No permission'); } // visible => original render (function) model.setHidden(false); const visible = model.render(); expect(typeof visible).toBe('function'); const visibleNode = (visible as any)(); expect(visibleNode.props.children).toBe('Cell'); }); });