import React from 'react' import { render, fireEvent, waitFor, act, screen } from '@testing-library/react' import { Form } from 'antd' import { delay } from '@fexd/tools' import ProField from '../index' describe('ProField 核心渲染', () => { it('基础渲染 - type=input', () => { const { container } = render() expect(container.querySelector('.ant-input')).toBeInTheDocument() expect(container.querySelector('.ant-form-item-label')).toBeInTheDocument() }) it('基础渲染 - type=select', () => { const { container } = render( , ) expect(container.querySelector('.ant-select')).toBeInTheDocument() }) it('view 模式不渲染可编辑控件', () => { const { container } = render( , ) expect(container.querySelector('.ant-input')).not.toBeInTheDocument() expect(container.textContent).toContain('hello') }) it('mode=view 时 select 类型渲染选项文本', () => { const { container } = render( , ) expect(container.querySelector('.ant-select')).not.toBeInTheDocument() }) }) describe('ProField hook 动态字段', () => { it('hook 返回对象时合并配置渲染', () => { const { container } = render(
({ placeholder: '来自hook' })} /> , ) const input = container.querySelector('.ant-input') expect(input).toBeInTheDocument() }) it('hook 返回 false 时不渲染', () => { const { container } = render(
false} /> , ) expect(container.querySelector('.ant-input')).not.toBeInTheDocument() }) it('hook 返回 null/undefined 时不渲染', () => { const { container } = render(
null as any} /> , ) expect(container.querySelector('.ant-input')).not.toBeInTheDocument() }) it('hook 返回 true/undefined 时正常渲染(使用默认配置)', () => { const { container } = render(
true as any} /> , ) expect(container.querySelector('.ant-input')).toBeInTheDocument() }) it('hook 返回 ReactNode 时直接渲染', () => { const { container } = render(
自定义内容} /> , ) expect(container.querySelector('.custom-node')).toBeInTheDocument() expect(container.querySelector('.custom-node')!.textContent).toBe('自定义内容') }) }) describe('ProField form prop', () => { it('指定 form 时使用独立 Form 上下文', () => { const TestComponent = () => { const [form] = Form.useForm() form.setFieldsValue({ name: '测试值' }) return } const { container } = render() expect(container.querySelector('.ant-input')).toBeInTheDocument() }) }) describe('ProField shouldUpdate / dependencies', () => { it('dependencies 为空数组时 hook 执行但不随 form 值变化更新', () => { let hookCallCount = 0 const { container } = render(
{ hookCallCount++ return {} }} /> , ) expect(container.querySelector('.ant-input')).toBeInTheDocument() }) it('shouldUpdate=false 时 hook 不响应更新', () => { const { container } = render(
({ placeholder: '固定' })} /> , ) expect(container.querySelector('.ant-input')).toBeInTheDocument() }) }) describe('ProField 边缘情况', () => { it('未知 type 不会崩溃(ErrorBoundary 兜底)', () => { const { container } = render() expect(container).toBeTruthy() }) it('空 props 不会崩溃', () => { const { container } = render() expect(container).toBeTruthy() }) it('initialValue 正确传递', () => { const { container } = render() const input = container.querySelector('.ant-input') expect(input?.getAttribute('value')).toBe('初始值') }) })