mirror of
https://gitee.com/baidu/amis.git
synced 2024-12-05 05:28:37 +08:00
221 lines
6.3 KiB
TypeScript
221 lines
6.3 KiB
TypeScript
/**
|
||
* 组件名称: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();
|
||
});
|
||
});
|