/** * 组件名称:NestedSelect 级联选择器 * 单测内容: * 01. maxTagLength * 02. onlyLeaf */ import {render, cleanup, waitFor, fireEvent} from '@testing-library/react'; import '../../../src'; import {render as amisRender} from '../../../src'; import {makeEnv, wait} from '../../helper'; import {clearStoresCache} from '../../../src'; afterEach(() => { cleanup(); clearStoresCache(); }); const setupNestedSelect = async ( schema: any = {}, props: any = {}, env: any = {} ) => { const renderResult = render( amisRender( { type: 'form', wrapWithPanel: false, body: [ { type: 'nested-select', name: 'nestedSelect', label: 'NestedSelect', ...schema } ] }, {...props}, makeEnv({...env}) ) ); await waitFor(() => { expect( renderResult.container.querySelector('.cxd-NestedSelectControl') ).toBeInTheDocument(); }); const cmpt = renderResult.container.querySelector( '.cxd-ResultBox .cxd-NestedSelect' ) as HTMLDivElement; return { ...renderResult, cmpt }; }; describe('Renderer:NestedSelect', () => { test('with maxTagLength 3', async () => { const {container, cmpt, queryByText} = await setupNestedSelect({ multiple: true, maxTagCount: 3, overflowTagPopover: { title: '已选项' }, value: 'Apple,Banana,Blackberry,Blueberry,Cherry,Carambola,Coconut,Kiwifruit,Lemon,Pineapple,Vegetables,Wheat,Rice', options: [ { label: '水果', value: 'Fruits', children: [ {label: '苹果', value: 'Apple'}, {label: '香蕉', value: 'Banana'}, {label: '黑莓', value: 'Blackberry'}, {label: '蓝莓', value: 'Blueberry'}, {label: '樱桃', value: 'Cherry'}, {label: '杨桃', value: 'Carambola'}, {label: '椰子', value: 'Coconut'}, {label: '猕猴桃', value: 'Kiwifruit'}, {label: '柠檬', value: 'Lemon'}, {label: '菠萝', value: 'Pineapple'} ] }, { label: '蔬菜', value: 'Vegetables', children: [ {label: '西兰花', value: 'Broccoli'}, {label: '菠菜', value: 'Spinach'}, {label: '南瓜', value: 'Pumpkin'} ] }, { label: '谷物', value: 'Grain', children: [ {label: '小麦', value: 'Wheat'}, {label: '水稻', value: 'Rice'}, {label: '燕麦', value: 'Oats'} ] } ] }); const list = container.querySelectorAll('.cxd-ResultBox-value-wrap')[0]; /** Tag 数量正确 */ expect(list.childNodes.length).toBe(4); const overflowText = '+ 10 ...'; /** 收纳 Tag 可见 */ expect(queryByText(overflowText)).toBeVisible(); expect(container).toMatchSnapshot(); }); }); describe.only('Renderer:NestedSelect with onlyLeaf', () => { test('single selection', async () => { const optionWithNoChild = 'OptionWithNoChild'; const optionWithChild = 'OptionWithChild'; const {container, queryByText} = await setupNestedSelect({ "onlyLeaf": true, "options": [ {"label": "选项A", "value": "A"}, {"label": optionWithNoChild, "value": "B", "children": []}, { "label": optionWithChild, "value": "C", "children": [ {"label": "选项c1", "value": "c1"}, {"label": "选项c2", "value": "c2"} ] } ] }); const trigger = container.querySelector('.cxd-ResultBox'); expect(trigger).toBeInTheDocument(); fireEvent.click(trigger!); await wait(200); const parentNum = container.querySelectorAll('.cxd-NestedSelect-optionArrowRight')?.length ?? 0; expect(parentNum).toEqual(1); let options = container.querySelectorAll('.cxd-NestedSelect-optionLabel'); expect(options.length).toEqual(3); /** onlyLeaf开启后,children为空数组的选项也可以选择 */ fireEvent.click(options[1]); await wait(300); expect(queryByText(optionWithNoChild)!).toBeInTheDocument(); fireEvent.click(trigger!); await wait(200); options = container.querySelectorAll('.cxd-NestedSelect-optionLabel'); fireEvent.click(options[2]); await wait(300); fireEvent.click(trigger!); await wait(200); expect(queryByText(optionWithNoChild)!).toBeInTheDocument(); /** onlyLeaf开启后,children非空的选项无法选择 */ expect(queryByText(optionWithChild)).toBeNull(); }); test('single selection', async () => { const optionWithNoChild = 'OptionWithNoChild'; const optionWithChild = 'OptionWithChild'; const {container, queryByText} = await setupNestedSelect({ "onlyLeaf": true, "multiple": true, "options": [ {"label": "选项A", "value": "A"}, {"label": optionWithNoChild, "value": "B", "children": []}, { "label": optionWithChild, "value": "C", "children": [ {"label": "选项c1", "value": "c1"}, {"label": "选项c2", "value": "c2"} ] } ] }); const trigger = container.querySelector('.cxd-ResultBox'); expect(trigger).toBeInTheDocument(); fireEvent.click(trigger!); await wait(200); const parentNum = container.querySelectorAll('.cxd-NestedSelect-optionArrowRight')?.length ?? 0; expect(parentNum).toEqual(1); let options = container.querySelectorAll('.cxd-NestedSelect-optionLabel'); expect(options.length).toEqual(3); /** onlyLeaf开启后,children为空数组的选项也可以选择 */ fireEvent.click(options[1]); await wait(300); fireEvent.click(trigger!); await wait(200); expect(queryByText(optionWithNoChild)!).toBeInTheDocument(); fireEvent.click(trigger!); await wait(200); options = container.querySelectorAll('.cxd-NestedSelect-optionLabel'); fireEvent.click(options[2]); await wait(300); fireEvent.click(trigger!); await wait(200); expect(queryByText(optionWithNoChild)!).toBeInTheDocument(); /** onlyLeaf开启后,children非空的选项无法选择 */ expect(queryByText(optionWithChild)).toBeNull(); }); });