2023-07-07 19:41:13 +08:00
|
|
|
|
/**
|
|
|
|
|
* 组件名称:NestedSelect 级联选择器
|
|
|
|
|
* 单测内容:
|
|
|
|
|
* 01. maxTagLength
|
2023-11-06 20:55:35 +08:00
|
|
|
|
* 02. onlyLeaf
|
2023-07-07 19:41:13 +08:00
|
|
|
|
*/
|
|
|
|
|
|
2023-11-06 20:55:35 +08:00
|
|
|
|
import {render, cleanup, waitFor, fireEvent} from '@testing-library/react';
|
2023-07-07 19:41:13 +08:00
|
|
|
|
import '../../../src';
|
|
|
|
|
import {render as amisRender} from '../../../src';
|
2023-11-06 20:55:35 +08:00
|
|
|
|
import {makeEnv, wait} from '../../helper';
|
2023-07-07 19:41:13 +08:00
|
|
|
|
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();
|
|
|
|
|
});
|
|
|
|
|
});
|
2023-11-06 20:55:35 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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();
|
|
|
|
|
});
|
|
|
|
|
});
|