`;
-exports[`AvatarGroup Component > props.cascading is equal to right-up 1`] = `
+exports[`AvatarGroup > props > cascading is equal to right-up 1`] = `
props.cascading is equal to right-up 1`] = `
`;
-exports[`AvatarGroup Component > props.collapseAvatar works fine 1`] = `
+exports[`AvatarGroup > props > collapseAvatar 1`] = `
props.collapseAvatar works fine 1`] = `
props.collapseAvatar works fine 1`] = `
props.collapseAvatar works fine 1`] = `
d="M3 21H20L9 10L3 16V21Z"
fill="transparent"
id="fill1"
- mask="url(#t-icon-image-instance-r5-overlap-fill1)"
+ mask="url(#t-icon-image-instance-r4-overlap-fill1)"
/>
props > children 1`] = `
+
+`;
+
+exports[`Avatar > props > content 1`] = `
+
+`;
+
+exports[`Avatar > props > shape is equal to circle 1`] = `
+
+`;
+
+exports[`Avatar > props > shape is equal to round 1`] = `
+
+`;
diff --git a/packages/components/avatar/__tests__/avatar-group.test.tsx b/packages/components/avatar/__tests__/avatar-group.test.tsx
new file mode 100644
index 0000000000..ffbf640f8a
--- /dev/null
+++ b/packages/components/avatar/__tests__/avatar-group.test.tsx
@@ -0,0 +1,70 @@
+import React from 'react';
+import { render } from '@test/utils';
+
+import { Avatar, AvatarGroup } from '..';
+
+import type { TdAvatarGroupProps } from '../type';
+
+function getAvatarGroupDefaultMount(props?: Partial, events?: Record) {
+ return render(
+
+
+ W
+ } />
+ TD
+ ME
+ ,
+ );
+}
+
+describe('AvatarGroup', () => {
+ describe('props', () => {
+ const cascadingClassNameList = ['t-avatar--offset-left', 't-avatar--offset-right'];
+ (['left-up', 'right-up'] as TdAvatarGroupProps['cascading'][]).forEach((item, index) => {
+ test(`cascading is equal to ${item}`, () => {
+ const { container } = render();
+ expect(container.firstChild).toHaveClass(cascadingClassNameList[index]);
+ expect(container).toMatchSnapshot();
+ });
+ });
+
+ test('max', () => {
+ const { container } = getAvatarGroupDefaultMount({ max: 3 });
+ expect(container.querySelectorAll('.t-avatar').length).toBe(4);
+ expect(container.querySelectorAll('.t-avatar__collapse').length).toBe(1);
+ expect(container.querySelector('.t-avatar__collapse > span').textContent).toBe('+2');
+ });
+
+ test(`size is equal to small`, () => {
+ const { container } = getAvatarGroupDefaultMount({ size: 'small' });
+ const domWrapper = container.querySelector('.t-avatar');
+ expect(domWrapper).toHaveClass('t-size-s');
+ const domWrapper1 = container.querySelector('.t-avatar:nth-child(5)');
+ expect(domWrapper1).toHaveClass('t-size-l');
+ });
+
+ test(`size is equal to large`, () => {
+ const { container } = getAvatarGroupDefaultMount({ size: 'large' });
+ const domWrapper = container.querySelector('.t-avatar');
+ expect(domWrapper).toHaveClass('t-size-l');
+ const domWrapper1 = container.querySelector('.t-avatar:nth-child(4)');
+ expect(domWrapper1).toHaveClass('t-size-s');
+ });
+
+ test(`size is equal to 120px`, () => {
+ const { container } = getAvatarGroupDefaultMount({ size: '120px' });
+ const domWrapper = container.querySelector('.t-avatar') as HTMLElement;
+ expect(domWrapper.style.width).toBe('120px');
+ expect(domWrapper.style.height).toBe('120px');
+ expect(domWrapper.style.fontSize).toBe('60px');
+ });
+ test('collapseAvatar', () => {
+ const { container } = getAvatarGroupDefaultMount({
+ collapseAvatar: TNode,
+ max: 3,
+ });
+ expect(container.querySelector('.custom-node')).toBeTruthy();
+ expect(container).toMatchSnapshot();
+ });
+ });
+});
diff --git a/packages/components/avatar/__tests__/avatar.test.tsx b/packages/components/avatar/__tests__/avatar.test.tsx
index 7a697873d5..a47af945f9 100644
--- a/packages/components/avatar/__tests__/avatar.test.tsx
+++ b/packages/components/avatar/__tests__/avatar.test.tsx
@@ -1,40 +1,131 @@
import React from 'react';
import { mockDelay, render, simulateImageEvent, vi } from '@test/utils';
-import Avatar from '../Avatar';
-
-describe('Avatar 组件测试', () => {
- test('Avatar 默认 DOM 结构', async () => {
- const imageSrc = 'https://tdesign.gtimg.com/site/avatar.jpg';
- const wrapper = render();
- const image: any = wrapper.getByAltText('test-avatar');
- expect(image.src).toBe(imageSrc);
- });
+import { Avatar } from '..';
- test('Avatar 初始化 Size', async () => {
- const imageSrc = 'https://tdesign.gtimg.com/site/avatar.jpg';
- const wrapper = render();
- const image = wrapper.container.querySelector('.t-image__wrapper');
- expect(image).toHaveStyle('width: 50px');
- });
+import type { TdAvatarProps } from '../type';
+
+const imageSrc = 'https://tdesign.gtimg.com/site/avatar.jpg';
+
+describe('Avatar', () => {
+ describe('props', () => {
+ test('alt', () => {
+ const wrapper = render();
+ const container = wrapper.container.querySelector('img');
+ expect(container.getAttribute('alt')).toBe('Avatar');
+ });
+
+ test('hideOnLoadFailed', async () => {
+ const { container } = render(
+ ,
+ );
+ const imgDom = container.querySelector('img');
+ simulateImageEvent(imgDom, 'error');
+ await mockDelay(300);
+ expect(container.querySelector('.t-image')).toBeFalsy();
+ });
+
+ test(`image is equal to https://tdesign.tencent.com/`, () => {
+ const { container } = render();
+ const domWrapper = container.querySelector('img');
+ expect(domWrapper.getAttribute('src')).toBe('https://tdesign.tencent.com/');
+ });
+
+ ['circle', 'round'].forEach((item) => {
+ test(`shape is equal to ${item}`, () => {
+ const { container } = render();
+ expect(container.firstChild).toHaveClass(`t-avatar--${item}`);
+ expect(container).toMatchSnapshot();
+ });
+ });
- test('Avatar 初始化 Shape', async () => {
- const { container } = render();
- expect(container.firstChild).toHaveClass('t-avatar--round');
+ const sizeClassNameMap = {
+ small: 't-size-s',
+ medium: 't-size-m',
+ large: 't-size-l',
+ };
+ Object.entries(sizeClassNameMap).forEach(([enumValue, expectedClassName]) => {
+ test(`size is equal to ${enumValue}`, () => {
+ let propValue: any = { true: true, false: false }[enumValue];
+ propValue = propValue === undefined ? enumValue : propValue;
+ const { container } = render();
+ expect(container.firstChild).toHaveClass(expectedClassName);
+ });
+ });
+
+ test(`size is equal to 120px`, () => {
+ const { container } = render();
+ const domWrapper = container.firstChild as HTMLElement;
+ expect(domWrapper.style.width).toBe('120px');
+ expect(domWrapper.style.height).toBe('120px');
+ expect(domWrapper.style.fontSize).toBe('60px');
+ });
+
+ test('Avatar 初始化 Size', async () => {
+ const wrapper = render();
+ const image = wrapper.container.querySelector('.t-image__wrapper');
+ expect(image).toHaveStyle('width: 50px');
+ });
+
+ test('Avatar 初始化 Shape', async () => {
+ const { container } = render();
+ expect(container.firstChild).toHaveClass('t-avatar--round');
+ });
+ test('children', () => {
+ const { container } = render(
+
+ TNode
+ ,
+ );
+ expect(container.querySelector('.custom-node')).toBeTruthy();
+ expect(container).toMatchSnapshot();
+ });
+
+ test('content', () => {
+ const { container } = render(TNode}>);
+ expect(container.querySelector('.custom-node')).toBeTruthy();
+ expect(container).toMatchSnapshot();
+ });
+
+ test('icon', () => {
+ const { container } = render(TNode}>);
+ expect(container.querySelector('.custom-node')).toBeTruthy();
+ expect(container.querySelector('.t-avatar__icon')).toBeTruthy();
+ });
});
- test('Avatar 初始化 Dom', async () => {
- const { container } = render();
- expect(container.firstChild).toBeInTheDocument();
+ describe('events', () => {
+ test('error', async () => {
+ const onErrorFn = vi.fn();
+ const { container } = render();
+ const imgDom = container.querySelector('img');
+ simulateImageEvent(imgDom, 'error');
+ await mockDelay(300);
+ expect(onErrorFn).toHaveBeenCalled();
+ expect(onErrorFn.mock.calls[0][0].e.type).toBe('error');
+ });
+
+ test('Avatar onError 回调', async () => {
+ const mockOnErrorFn = vi.fn();
+ const { container } = render();
+ const imageDom = container.querySelector('img');
+ simulateImageEvent(imageDom, 'error');
+ await mockDelay(300);
+ expect(mockOnErrorFn).toHaveBeenCalled();
+ expect(mockOnErrorFn.mock.calls[0][0].e.type).toBe('error');
+ });
});
- test('Avatar onError 回调', async () => {
- const mockOnErrorFn = vi.fn();
- const { container } = render();
- const imageDom = container.querySelector('img');
- simulateImageEvent(imageDom, 'error');
- await mockDelay(300);
- expect(mockOnErrorFn).toHaveBeenCalled();
- expect(mockOnErrorFn.mock.calls[0][0].e.type).toBe('error');
+ describe('scenarios', () => {
+ test('Avatar 默认 DOM 结构', async () => {
+ const wrapper = render();
+ const image: any = wrapper.getByAltText('test-avatar');
+ expect(image.src).toBe(imageSrc);
+ });
+
+ test('Avatar 初始化 Dom', async () => {
+ const { container } = render();
+ expect(container.firstChild).toBeInTheDocument();
+ });
});
});
diff --git a/packages/components/avatar/__tests__/mount.jsx b/packages/components/avatar/__tests__/mount.jsx
deleted file mode 100644
index c67879db71..0000000000
--- a/packages/components/avatar/__tests__/mount.jsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import React from 'react';
-import { render } from '@test/utils';
-import { Avatar } from '..';
-
-// Avatar 数量变化会影响测试用例结果
-export function getAvatarGroupDefaultMount(AvatarGroup, props, events) {
- return render(
-
-
- W
- } />
- TD
- ME
-
- );
-}
-
-export default getAvatarGroupDefaultMount;
diff --git a/packages/components/avatar/__tests__/vitest-avatar.test.jsx b/packages/components/avatar/__tests__/vitest-avatar.test.jsx
deleted file mode 100644
index 206935472c..0000000000
--- a/packages/components/avatar/__tests__/vitest-avatar.test.jsx
+++ /dev/null
@@ -1,140 +0,0 @@
-/* eslint-disable @typescript-eslint/no-unused-vars */
-/**
- * 该文件由脚本自动生成,如需修改请联系 PMC
- * This file generated by scripts of tdesign-api. `npm run api:docs Avatar React(PC) vitest,finalProject`
- * If you need to modify this file, contact PMC first please.
- */
-import React from 'react';
-import { fireEvent, vi, render, mockDelay, simulateImageEvent } from '@test/utils';
-import { Avatar, AvatarGroup } from '..';
-import { getAvatarGroupDefaultMount } from './mount';
-
-describe('Avatar Component', () => {
- it('props.alt works fine', () => {
- const wrapper = render();
- const container = wrapper.container.querySelector('img');
- expect(container.getAttribute('alt')).toBe('Avatar');
- });
-
- it('props.children works fine', () => {
- const { container } = render(
-
- TNode
- ,
- );
- expect(container.querySelector('.custom-node')).toBeTruthy();
- expect(container).toMatchSnapshot();
- });
-
- it('props.content works fine', () => {
- const { container } = render(TNode}>);
- expect(container.querySelector('.custom-node')).toBeTruthy();
- expect(container).toMatchSnapshot();
- });
-
- it('props.hideOnLoadFailed works fine', async () => {
- const { container } = render();
- const imgDom = container.querySelector('img');
- simulateImageEvent(imgDom, 'error');
- await mockDelay(300);
- expect(container.querySelector('.t-image')).toBeFalsy();
- });
-
- it('props.icon works fine', () => {
- const { container } = render(TNode}>);
- expect(container.querySelector('.custom-node')).toBeTruthy();
- expect(container.querySelector('.t-avatar__icon')).toBeTruthy();
- });
-
- it(`props.image is equal to https://tdesign.tencent.com/`, () => {
- const { container } = render();
- const domWrapper = container.querySelector('img');
- expect(domWrapper.getAttribute('src')).toBe('https://tdesign.tencent.com/');
- });
-
- ['circle', 'round'].forEach((item) => {
- it(`props.shape is equal to ${item}`, () => {
- const { container } = render();
- expect(container.firstChild).toHaveClass(`t-avatar--${item}`);
- expect(container).toMatchSnapshot();
- });
- });
-
- const sizeClassNameMap = { small: 't-size-s', medium: 't-size-m', large: 't-size-l' };
- Object.entries(sizeClassNameMap).forEach(([enumValue, expectedClassName]) => {
- it(`props.size is equal to ${enumValue}`, () => {
- let propValue = { true: true, false: false }[enumValue];
- propValue = propValue === undefined ? enumValue : propValue;
- const { container } = render();
- expect(container.firstChild).toHaveClass(expectedClassName);
- });
- });
-
- it(`props.size is equal to 120px`, () => {
- const { container } = render();
- const domWrapper = container.firstChild;
- expect(domWrapper.style.width).toBe('120px');
- expect(domWrapper.style.height).toBe('120px');
- expect(domWrapper.style.fontSize).toBe('60px');
- });
-
- it('events.error works fine', async () => {
- const onErrorFn = vi.fn();
- const { container } = render();
- const imgDom = container.querySelector('img');
- simulateImageEvent(imgDom, 'error');
- await mockDelay(300);
- expect(onErrorFn).toHaveBeenCalled();
- expect(onErrorFn.mock.calls[0][0].e.type).toBe('error');
- });
-});
-
-describe('AvatarGroup Component', () => {
- const cascadingClassNameList = ['t-avatar--offset-left', 't-avatar--offset-right'];
- ['left-up', 'right-up'].forEach((item, index) => {
- it(`props.cascading is equal to ${item}`, () => {
- const { container } = render();
- expect(container.firstChild).toHaveClass(cascadingClassNameList[index]);
- expect(container).toMatchSnapshot();
- });
- });
-
- it('props.collapseAvatar works fine', () => {
- const { container } = getAvatarGroupDefaultMount(AvatarGroup, {
- collapseAvatar: TNode,
- max: 3,
- });
- expect(container.querySelector('.custom-node')).toBeTruthy();
- expect(container).toMatchSnapshot();
- });
-
- it('props.max works fine. `{".t-avatar":4,".t-avatar__collapse":1,".t-avatar__collapse > span":{"text":"+2"}}` should exist', () => {
- const { container } = getAvatarGroupDefaultMount(AvatarGroup, { max: 3 });
- expect(container.querySelectorAll('.t-avatar').length).toBe(4);
- expect(container.querySelectorAll('.t-avatar__collapse').length).toBe(1);
- expect(container.querySelector('.t-avatar__collapse > span').textContent).toBe('+2');
- });
-
- it(`props.size is equal to small`, () => {
- const { container } = getAvatarGroupDefaultMount(AvatarGroup, { size: 'small' });
- const domWrapper = container.querySelector('.t-avatar');
- expect(domWrapper).toHaveClass('t-size-s');
- const domWrapper1 = container.querySelector('.t-avatar:nth-child(5)');
- expect(domWrapper1).toHaveClass('t-size-l');
- });
- it(`props.size is equal to large`, () => {
- const { container } = getAvatarGroupDefaultMount(AvatarGroup, { size: 'large' });
- const domWrapper = container.querySelector('.t-avatar');
- expect(domWrapper).toHaveClass('t-size-l');
- const domWrapper1 = container.querySelector('.t-avatar:nth-child(4)');
- expect(domWrapper1).toHaveClass('t-size-s');
- });
-
- it(`props.size is equal to 120px`, () => {
- const { container } = getAvatarGroupDefaultMount(AvatarGroup, { size: '120px' });
- const domWrapper = container.querySelector('.t-avatar');
- expect(domWrapper.style.width).toBe('120px');
- expect(domWrapper.style.height).toBe('120px');
- expect(domWrapper.style.fontSize).toBe('60px');
- });
-});
diff --git a/packages/components/back-top/__tests__/__snapshots__/vitest-back-top.test.jsx.snap b/packages/components/back-top/__tests__/__snapshots__/back-top.test.tsx.snap
similarity index 83%
rename from packages/components/back-top/__tests__/__snapshots__/vitest-back-top.test.jsx.snap
rename to packages/components/back-top/__tests__/__snapshots__/back-top.test.tsx.snap
index 779cb936ee..7c04528c04 100644
--- a/packages/components/back-top/__tests__/__snapshots__/vitest-back-top.test.jsx.snap
+++ b/packages/components/back-top/__tests__/__snapshots__/back-top.test.tsx.snap
@@ -1,6 +1,6 @@
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
-exports[`BackTop Component > props.children works fine 1`] = `
+exports[`BackTop > props > children 1`] = `
`;
-exports[`BackTop Component > props.content works fine 1`] = `
+exports[`BackTop > props > content 1`] = `
`;
-exports[`BackTop Component > props.default works fine 1`] = `
+exports[`BackTop > props > default 1`] = `
`;
-exports[`BackTop Component > props.shape is equal to circle 1`] = `
+exports[`BackTop > props > shape is equal to circle 1`] = `
`;
-exports[`BackTop Component > props.shape is equal to square 1`] = `
+exports[`BackTop > props > shape is equal to square 1`] = `
`;
-exports[`BackTop Component > props.size is equal to medium 1`] = `
+exports[`BackTop > props > size is equal to medium 1`] = `
`;
-exports[`BackTop Component > props.size is equal to small 1`] = `
+exports[`BackTop > props > size is equal to small 1`] = `
`;
-exports[`BackTop Component > props.theme is equal to dark 1`] = `
+exports[`BackTop > props > theme is equal to dark 1`] = `
`;
-exports[`BackTop Component > props.theme is equal to light 1`] = `
+exports[`BackTop > props > theme is equal to light 1`] = `
`;
-exports[`BackTop Component > props.theme is equal to primary 1`] = `
+exports[`BackTop > props > theme is equal to primary 1`] = `
}>);
+ expect(container.querySelector('.t-card__actions')).toBeInTheDocument();
+ expect(container.querySelector('.t-card__actions').textContent).toBe('操作');
+ });
});
- test('bodyClassName and bodyStyle', () => {
- const { container } = render(
-
- body
- ,
- );
- const bodyEle = container.querySelector('.test-body-class-name');
- expect(bodyEle).not.toBeNull();
- expect(window.getComputedStyle(bodyEle).height).toBe(`100px`);
- });
+ describe('scenarios', () => {
+ test('headerClassName and headerStyle', () => {
+ const { container } = render(
+ ,
+ );
+ const headerEle = container.querySelector('.t-card__header');
+ expect(headerEle).toHaveClass('test-header-class-name');
+ expect(window.getComputedStyle(headerEle).height).toBe(`100px`);
+ });
- test('actions', () => {
- const { container } = render(操作}>);
- expect(container.querySelector('.t-card__actions')).toBeInTheDocument();
- expect(container.querySelector('.t-card__actions').textContent).toBe('操作');
- });
+ test('footerClassName and footerStyle', () => {
+ const { container } = render(
+
底部 }
+ >,
+ );
+ const footerEle = container.querySelector('.t-card__footer');
+ expect(footerEle).toHaveClass('test-footer-class-name');
+ expect(window.getComputedStyle(footerEle).height).toBe(`100px`);
+ });
- test('loading', () => {
- const { container } = render(
);
- expect(container.querySelector('.t-loading')).toBeInTheDocument();
- });
- test('custom loading props', () => {
- const customProps = {
- text: 'TDesign努力加载中...',
- };
- const { container } = render(
-
,
- );
- expect(container.querySelector('.t-loading')).toBeInTheDocument();
- expect(container.querySelector('.t-loading__text').textContent).toBe('TDesign努力加载中...');
+ test('bodyClassName and bodyStyle', () => {
+ const { container } = render(
+
+ body
+ ,
+ );
+ const bodyEle = container.querySelector('.test-body-class-name');
+ expect(bodyEle).not.toBeNull();
+ expect(window.getComputedStyle(bodyEle).height).toBe(`100px`);
+ });
});
});
diff --git a/packages/components/cascader/__tests__/cascader-panel.test.tsx b/packages/components/cascader/__tests__/cascader-panel.test.tsx
new file mode 100644
index 0000000000..31836f80df
--- /dev/null
+++ b/packages/components/cascader/__tests__/cascader-panel.test.tsx
@@ -0,0 +1,126 @@
+import React, { useState } from 'react';
+import { fireEvent, render } from '@test/utils';
+
+import { CascaderPanel } from '../index';
+
+const options = [
+ {
+ children: [
+ {
+ label: '子选项一',
+ value: '1.1',
+ },
+ {
+ label: '子选项二',
+ value: '1.2',
+ },
+ ],
+ label: '选项一',
+ value: '1',
+ },
+ {
+ children: [
+ {
+ label: '子选项一',
+ value: '2.1',
+ },
+ {
+ label: '子选项二',
+ value: '2.2',
+ },
+ ],
+ label: '选项二',
+ value: '2',
+ },
+];
+
+describe('CascaderPanel', () => {
+ describe('props', () => {
+ test('Panel组件 trigger 为 hover 时,应该正确展开下一层级', () => {
+ const { container, getByText } = render(
);
+ expect(container.querySelectorAll('.t-cascader__menu').length).toBe(1);
+ fireEvent.mouseEnter(getByText('选项一'));
+ expect(getByText('子选项一')).toBeInTheDocument();
+ expect(container.querySelectorAll('.t-cascader__menu').length).toBe(2);
+ });
+
+ test('Panel组件 multiple 测试', () => {
+ const { getByText, getByTitle } = render(
);
+ fireEvent.click(getByText('选项一'));
+ expect(getByTitle('子选项一')).not.toHaveClass('t-is-checked');
+ // 选中一个子选项,父级应为 indeterminate 状态
+ fireEvent.click(getByText('子选项一'));
+ expect(getByTitle('选项一')).toHaveClass('t-is-indeterminate');
+ expect(getByTitle('子选项一')).toHaveClass('t-is-checked');
+ // 选中全部子选项,父级应该为 checked 状态
+ fireEvent.click(getByText('子选项二'));
+ expect(getByTitle('选项一')).toHaveClass('t-is-checked');
+ expect(getByTitle('子选项二')).toHaveClass('t-is-checked');
+ });
+ });
+
+ describe('scenarios', () => {
+ test('CascaderPanel 基础测试', () => {
+ const btnText = 'change';
+ const TestComponent = () => {
+ const [value, setValue] = useState();
+ const [multiple, setMultiple] = useState(false);
+ const onChange = (nextValue) => {
+ setValue(nextValue);
+ };
+ const onClick = () => {
+ setMultiple(!multiple);
+ };
+ return (
+ <>
+
{btnText}
+
+ >
+ );
+ };
+
+ const { container, getByText } = render(
);
+ expect(getByText('选项一')).toBeInTheDocument();
+ expect(container.querySelectorAll('.t-cascader__menu').length).toBe(1);
+ // 首次展开子选项会插入新的 ul
+ fireEvent.click(getByText('选项一'));
+ expect(getByText('子选项一')).toBeInTheDocument();
+ expect(container.querySelectorAll('.t-cascader__menu').length).toBe(2);
+ // multiple 测试,存在 checkbox
+ expect(container.querySelector('input')).toBeNull();
+ fireEvent.click(getByText(btnText));
+ expect(container.querySelector('input')).toBeInTheDocument();
+ });
+
+ test('Panel组件 multiple 时设置 max 测试', async () => {
+ const btnText = 'set max 1';
+ const TestComponent = () => {
+ const [max, setMax] = useState(3);
+ return (
+ <>
+
setMax(1)}>{btnText}
+
+ >
+ );
+ };
+ const { getByText, getByTitle } = render(
);
+ // 所选内容不超过 max ,都可选中
+ fireEvent.click(getByTitle('选项一').querySelector('input'));
+ expect(getByTitle('选项一')).toHaveClass('t-is-checked');
+ expect(getByTitle('子选项一')).toHaveClass('t-is-checked');
+ expect(getByTitle('子选项二')).toHaveClass('t-is-checked');
+ // 清空所有选中
+ fireEvent.click(getByTitle('选项一').querySelector('input'));
+ // 设置 max 为 1,点击父级无法选中任何节点
+ fireEvent.click(getByText(btnText));
+ fireEvent.click(getByTitle('选项一'));
+ fireEvent.click(getByTitle('选项一').querySelector('input'));
+ expect(getByTitle('选项一')).not.toHaveClass('t-is-checked');
+ expect(getByTitle('子选项一')).not.toHaveClass('t-is-checked');
+ // 选中一个子节点后所有节点为 disabled
+ fireEvent.click(getByTitle('子选项一'));
+ expect(getByTitle('子选项一')).toHaveClass('t-is-checked');
+ expect(getByTitle('选项二')).toHaveClass('t-is-disabled');
+ });
+ });
+});
diff --git a/packages/components/cascader/__tests__/cascader.test.tsx b/packages/components/cascader/__tests__/cascader.test.tsx
index 90dad6c926..b4c5b6737c 100644
--- a/packages/components/cascader/__tests__/cascader.test.tsx
+++ b/packages/components/cascader/__tests__/cascader.test.tsx
@@ -2,7 +2,7 @@ import React, { useState } from 'react';
import { fireEvent, mockDelay, mockTimeout, render, userEvent, vi } from '@test/utils';
import Tag from '../../tag';
-import Cascader, { CascaderPanel } from '../index';
+import Cascader from '../index';
const options = [
{
@@ -80,503 +80,425 @@ const optionsData = [
const popupSelector = '.t-popup';
// TODO
-describe('Cascader 组件测试', () => {
- test('设置 checkStrictly 时每项应该可各自选中或取消', async () => {
- const btnText = 'change';
- const TestComponent = () => {
- const [strict, setStrict] = useState(false);
- return (
- <>
-
setStrict(!strict)}>{btnText}
-
- >
- );
- };
- const { getByText } = render(
);
- // 默认值为 false
- fireEvent.click(document.querySelector('input'));
- fireEvent.click(getByText('选项一'));
- expect(getByText('子选项一')).toHaveTextContent('子选项一');
- fireEvent.click(getByText('子选项一'));
- expect(document.querySelector('.t-input__inner')).toHaveValue('选项一 / 子选项一');
- // 设置值为 true,可直接选择选项一
- await mockTimeout(() => fireEvent.click(getByText(btnText)));
- fireEvent.click(document.querySelector('input'));
- fireEvent.click(getByText('选项一'));
- expect(document.querySelector('.t-input__inner')).toHaveValue('选项一');
- });
-
- test('onBlur 测试,应该正确触发', async () => {
- const onBlur = vi.fn();
- const { container } = render(
);
- // 模拟 blur 时触发 onBlur
- fireEvent.click(container.querySelector('.t-input'));
- await mockDelay(100);
- fireEvent.mouseDown(document);
- expect(onBlur).toHaveBeenCalled();
- });
-
- test('selectInputProps.onInputChange 测试,应该正确触发', async () => {
- const selectInputProps = {
- onInputChange: () => 1,
- };
- const enterText = 'test';
- const spy = vi.spyOn(selectInputProps, 'onInputChange');
- render(
);
- // 模拟用户键盘输入 "test" ,一共会触发四次 onInputChange
- await userEvent.type(document.querySelector('input'), enterText);
- await mockTimeout(() => expect(spy).toHaveBeenCalledTimes(enterText.length));
- });
-
- test('selectInputProps.onTagChange 测试,应该正确触发且页面展示正常', async () => {
- const selectInputProps = {
- onTagChange: () => 1,
- allowInput: true,
- };
- const TextComponent = (props) => {
- const [value, setValue] = useState(['1.1', '1.2']);
- const onChange = (val) => {
- setValue(val);
+describe('Cascader', () => {
+ describe('props', () => {
+ test('设置 checkStrictly 时每项应该可各自选中或取消', async () => {
+ const btnText = 'change';
+ const TestComponent = () => {
+ const [strict, setStrict] = useState(false);
+ return (
+ <>
+
setStrict(!strict)}>{btnText}
+
+ >
+ );
};
+ const { getByText } = render(
);
+ // 默认值为 false
+ fireEvent.click(document.querySelector('input'));
+ fireEvent.click(getByText('选项一'));
+ expect(getByText('子选项一')).toHaveTextContent('子选项一');
+ fireEvent.click(getByText('子选项一'));
+ expect(document.querySelector('.t-input__inner')).toHaveValue('选项一 / 子选项一');
+ // 设置值为 true,可直接选择选项一
+ await mockTimeout(() => fireEvent.click(getByText(btnText)));
+ fireEvent.click(document.querySelector('input'));
+ fireEvent.click(getByText('选项一'));
+ expect(document.querySelector('.t-input__inner')).toHaveValue('选项一');
+ });
- return (
-
+ test('filterable 测试', async () => {
+ const placeholder = 'filter';
+ const filterContent = '子选项一';
+ const { getByPlaceholderText, getByText } = render(
+
,
);
- };
-
- const spy = vi.spyOn(selectInputProps, 'onTagChange');
- const { container } = render(
);
- const wrapper = container.querySelector('.t-input__prefix');
- // 初始时有两个 tag
- expect(wrapper.querySelectorAll('.t-tag').length).toBe(2);
- fireEvent.click(container.querySelector('.t-icon-close'));
- expect(spy).toHaveBeenCalledTimes(1);
- fireEvent.click(container.querySelector('.t-icon-close'));
- // 删除两次后清空全部 tag,触发两次 onTagChange
- expect(wrapper.querySelectorAll('.t-tag').length).toBe(0);
- expect(spy).toHaveBeenCalledTimes(2);
- // trigger 为 'enter' 时不执行,调用次数依然为 2
- const input = container.querySelector('input');
- await userEvent.type(input, 'abc{enter}');
- expect(input).toHaveValue('abc');
- expect(spy).toHaveBeenCalledTimes(2);
- });
-
- test('selectInputProps.onClear 测试,应该正确触发且页面展示正常', () => {
- const selectInputProps = {
- onClear: () => 1,
- };
- const TextComponent = (props) => {
- const [value, setValue] = useState(['1.1', '1.2']);
- const onChange = (val) => {
- setValue(val);
- };
+ // 搜索 子选项一 ,共有两个结果,成功匹配的内容应该高亮
+ fireEvent.focus(getByPlaceholderText(placeholder));
+ await userEvent.type(getByPlaceholderText(placeholder), filterContent);
+ await mockTimeout(() =>
+ expect(document.querySelector(popupSelector).querySelectorAll('.t-cascader__item-label--filter').length).toBe(
+ 2,
+ ),
+ );
+ // 清空搜索项,无匹配任何高亮内容
+ await userEvent.type(getByPlaceholderText(placeholder), '{backspace}{backspace}{backspace}{backspace}');
+ await mockTimeout(() =>
+ expect(document.querySelector(popupSelector).querySelectorAll('.t-cascader__item-label--filter').length).toBe(
+ 0,
+ ),
+ );
+ // 匹配不到任何内容
+ await userEvent.type(getByPlaceholderText(placeholder), 'null');
+ await mockTimeout(() => expect(getByText('暂无数据')).toBeInTheDocument());
+ });
+ test('render label', async () => {
+ const label = '单选:';
+ const { getByText } = render(
);
+ expect(getByText(label)).toBeInTheDocument();
+ });
- return (
+ test('render single valueDisplay', async () => {
+ const SingleValueDisplay = ({ value, selectedOptions }: any) =>
+ value && (
+
+

+
{selectedOptions?.[0]?.label}
+
({value})
+
+ );
+ const { container } = render(
}
clearable
- />
+ >,
);
- };
- const spy = vi.spyOn(selectInputProps, 'onClear');
- const { container } = render(
);
- const wrapper = container.querySelector('.t-input__prefix');
- fireEvent.mouseOver(wrapper);
- fireEvent.click(container.querySelector('.t-input__suffix').querySelector('.t-icon'));
- expect(wrapper.querySelectorAll('.t-tag').length).toBe(0);
- expect(spy).toHaveBeenCalled();
- });
+ expect(container.querySelector('.valueDisplay')).toBeInTheDocument();
+ });
- test('selectInputProps.onPopupVisibleChange 测试,应该正确触发', async () => {
- const selectInputProps = {
- onPopupVisibleChange: () => 1,
- };
- const placeholderId = 'placeholder-id';
- const btnText = 'change';
- const TextComponent = (props) => {
- const [disabled, setDisabled] = useState(false);
- const onClick = () => {
- setDisabled(!disabled);
- };
- return (
- <>
-
{btnText}
-
- >
+ test('render multiple valueDisplay', async () => {
+ const MultipleValueDisplay = ({ value, selectedOptions, onClose }: any) =>
+ value && value.length
+ ? selectedOptions.map((option, index) => (
+
onClose(index)}>
+
+ {option.label}
+ ({option.value})
+
+ ))
+ : null;
+ const { container } = render(
+
}
+ multiple
+ clearable
+ >,
);
- };
- const spy = vi.spyOn(selectInputProps, 'onPopupVisibleChange');
- const { getByPlaceholderText, getByText } = render(
);
- // 展开收起一共触发 onPopupVisibleChange 2次
- fireEvent.click(getByPlaceholderText(placeholderId));
- expect(spy).toHaveBeenCalled();
- fireEvent.click(getByPlaceholderText(placeholderId));
- expect(spy).toHaveBeenCalledTimes(2);
- await mockTimeout(() =>
- expect(document.querySelector(popupSelector)).toHaveStyle({
- display: 'none',
- }),
- );
-
- // disabled 不会展开 popup,且不执行 onPopupVisibleChange
- fireEvent.click(getByText(btnText));
- fireEvent.click(getByPlaceholderText(placeholderId));
- expect(document.querySelector(popupSelector)).toHaveStyle({
- display: 'none',
+ const optionsValue = container.querySelectorAll('.options-value');
+ expect(optionsValue[0]).toHaveTextContent('(1.3)');
+ expect(optionsValue[1]).toHaveTextContent('(2.1)');
+ expect(optionsValue[2]).toHaveTextContent('(2.2)');
+ fireEvent.click(container.querySelector('.t-input'));
+ await mockDelay();
+ expect(document.querySelectorAll('.t-is-checked')).toHaveLength(2);
+ expect(document.querySelectorAll('.t-is-checked')[1].children[0]).toHaveAttribute('checked');
});
- expect(spy).toHaveBeenCalledTimes(2);
- });
- test('filterable 测试', async () => {
- const placeholder = 'filter';
- const filterContent = '子选项一';
- const { getByPlaceholderText, getByText } = render(
-
,
- );
- // 搜索 子选项一 ,共有两个结果,成功匹配的内容应该高亮
- fireEvent.focus(getByPlaceholderText(placeholder));
- await userEvent.type(getByPlaceholderText(placeholder), filterContent);
- await mockTimeout(() =>
- expect(document.querySelector(popupSelector).querySelectorAll('.t-cascader__item-label--filter').length).toBe(2),
- );
- // 清空搜索项,无匹配任何高亮内容
- await userEvent.type(getByPlaceholderText(placeholder), '{backspace}{backspace}{backspace}{backspace}');
- await mockTimeout(() =>
- expect(document.querySelector(popupSelector).querySelectorAll('.t-cascader__item-label--filter').length).toBe(0),
- );
- // 匹配不到任何内容
- await userEvent.type(getByPlaceholderText(placeholder), 'null');
- await mockTimeout(() => expect(getByText('暂无数据')).toBeInTheDocument());
- });
+ test('render panelTopContent', async () => {
+ const panelTopContent = 'panelTopContent';
+ const { getByText } = render(
+
,
+ );
- test('value is zero should be selected', async () => {
- const popupSelector = '.t-popup';
- const labelText = 'my value is 0 that typeof number';
- const TestComponent = () => {
- const [value, setValue] = useState('');
- const options = [
- {
- value: 0,
- label: labelText,
- },
- ];
- const onChange = (value) => {
- setValue(value);
- };
+ await fireEvent.click(document.querySelector('input'));
+ expect(getByText(panelTopContent)).toBeInTheDocument();
+ });
- return
;
- };
- const { getByText } = render(
);
- fireEvent.click(document.querySelector('input'));
- expect(document.querySelector(popupSelector)).toHaveTextContent(labelText);
- await mockTimeout(() => fireEvent.click(getByText(labelText)));
- expect(document.querySelector('.t-input__inner')).toHaveValue(labelText);
- });
+ test('render panelBottomContent', async () => {
+ const panelBottomContent = 'panelBottomContent';
+ const { getByText } = render(
+
,
+ );
- test('multiple Clicking the clear all button only triggers onChange once', async () => {
- const onChange = vi.fn();
- const onRemove = vi.fn();
- const { container } = render(
-
,
- );
- fireEvent.mouseEnter(container.querySelector('.t-input'));
- await mockDelay();
- // 点击清除按钮只触发一次onChange,不触发onRemove
- expect(container.querySelector('.t-tag-input__suffix-clear')).toBeTruthy();
- fireEvent.click(container.querySelector('.t-tag-input__suffix-clear'));
- expect(onChange).toHaveBeenCalledTimes(1);
- expect(onRemove).toHaveBeenCalledTimes(0);
- // 点击tag onRemove,触发一次onRemove,触发两次onChange
- fireEvent.click(container.querySelectorAll('.t-tag__icon-close')[0]);
- expect(onRemove).toHaveBeenCalledTimes(1);
- expect(onChange).toHaveBeenCalledTimes(2);
+ await fireEvent.click(document.querySelector('input'));
+ expect(getByText(panelBottomContent)).toBeInTheDocument();
+ });
});
- test('render label', async () => {
- const label = '单选:';
- const { getByText } = render(
);
- expect(getByText(label)).toBeInTheDocument();
- });
+ describe('events', () => {
+ test('onBlur 测试,应该正确触发', async () => {
+ const onBlur = vi.fn();
+ const { container } = render(
);
+ // 模拟 blur 时触发 onBlur
+ fireEvent.click(container.querySelector('.t-input'));
+ await mockDelay(100);
+ fireEvent.mouseDown(document);
+ expect(onBlur).toHaveBeenCalled();
+ });
- test('render single valueDisplay', async () => {
- const SingleValueDisplay = ({ value, selectedOptions }: any) =>
- value && (
-
-

-
{selectedOptions?.[0]?.label}
-
({value})
-
- );
- const { container } = render(
-
}
- clearable
- >,
- );
- expect(container.querySelector('.valueDisplay')).toBeInTheDocument();
- });
+ test('selectInputProps.onInputChange 测试,应该正确触发', async () => {
+ const selectInputProps = {
+ onInputChange: () => 1,
+ };
+ const enterText = 'test';
+ const spy = vi.spyOn(selectInputProps, 'onInputChange');
+ render(
);
+ // 模拟用户键盘输入 "test" ,一共会触发四次 onInputChange
+ await userEvent.type(document.querySelector('input'), enterText);
+ await mockTimeout(() => expect(spy).toHaveBeenCalledTimes(enterText.length));
+ });
- test('render multiple valueDisplay', async () => {
- const MultipleValueDisplay = ({ value, selectedOptions, onClose }: any) =>
- value && value.length
- ? selectedOptions.map((option, index) => (
-
onClose(index)}>
-
- {option.label}
- ({option.value})
-
- ))
- : null;
- const { container } = render(
-
}
- multiple
- clearable
- >,
- );
- const optionsValue = container.querySelectorAll('.options-value');
- expect(optionsValue[0]).toHaveTextContent('(1.3)');
- expect(optionsValue[1]).toHaveTextContent('(2.1)');
- expect(optionsValue[2]).toHaveTextContent('(2.2)');
- fireEvent.click(container.querySelector('.t-input'));
- await mockDelay();
- expect(document.querySelectorAll('.t-is-checked')).toHaveLength(2);
- expect(document.querySelectorAll('.t-is-checked')[1].children[0]).toHaveAttribute('checked');
- });
+ test('selectInputProps.onTagChange 测试,应该正确触发且页面展示正常', async () => {
+ const selectInputProps = {
+ onTagChange: () => 1,
+ allowInput: true,
+ };
+ const TextComponent = (props) => {
+ const [value, setValue] = useState(['1.1', '1.2']);
+ const onChange = (val) => {
+ setValue(val);
+ };
- test('render panelTopContent', async () => {
- const panelTopContent = 'panelTopContent';
- const { getByText } = render(
-
,
- );
+ return (
+
+ );
+ };
- await fireEvent.click(document.querySelector('input'));
- expect(getByText(panelTopContent)).toBeInTheDocument();
- });
+ const spy = vi.spyOn(selectInputProps, 'onTagChange');
+ const { container } = render(
);
+ const wrapper = container.querySelector('.t-input__prefix');
+ // 初始时有两个 tag
+ expect(wrapper.querySelectorAll('.t-tag').length).toBe(2);
+ fireEvent.click(container.querySelector('.t-icon-close'));
+ expect(spy).toHaveBeenCalledTimes(1);
+ fireEvent.click(container.querySelector('.t-icon-close'));
+ // 删除两次后清空全部 tag,触发两次 onTagChange
+ expect(wrapper.querySelectorAll('.t-tag').length).toBe(0);
+ expect(spy).toHaveBeenCalledTimes(2);
+ // trigger 为 'enter' 时不执行,调用次数依然为 2
+ const input = container.querySelector('input');
+ await userEvent.type(input, 'abc{enter}');
+ expect(input).toHaveValue('abc');
+ expect(spy).toHaveBeenCalledTimes(2);
+ });
- test('render panelBottomContent', async () => {
- const panelBottomContent = 'panelBottomContent';
- const { getByText } = render(
-
,
- );
+ test('selectInputProps.onClear 测试,应该正确触发且页面展示正常', () => {
+ const selectInputProps = {
+ onClear: () => 1,
+ };
+ const TextComponent = (props) => {
+ const [value, setValue] = useState(['1.1', '1.2']);
+ const onChange = (val) => {
+ setValue(val);
+ };
- await fireEvent.click(document.querySelector('input'));
- expect(getByText(panelBottomContent)).toBeInTheDocument();
- });
-});
+ return (
+
+ );
+ };
+ const spy = vi.spyOn(selectInputProps, 'onClear');
+ const { container } = render(
);
+ const wrapper = container.querySelector('.t-input__prefix');
+ fireEvent.mouseOver(wrapper);
+ fireEvent.click(container.querySelector('.t-input__suffix').querySelector('.t-icon'));
+ expect(wrapper.querySelectorAll('.t-tag').length).toBe(0);
+ expect(spy).toHaveBeenCalled();
+ });
-describe('Cascader Panel 组件测试', () => {
- test('CascaderPanel 基础测试', () => {
- const btnText = 'change';
- const TestComponent = () => {
- const [value, setValue] = useState();
- const [multiple, setMultiple] = useState(false);
- const onChange = (value) => {
- setValue(value);
+ test('selectInputProps.onPopupVisibleChange 测试,应该正确触发', async () => {
+ const selectInputProps = {
+ onPopupVisibleChange: () => 1,
};
- const onClick = () => {
- setMultiple(!multiple);
+ const placeholderId = 'placeholder-id';
+ const btnText = 'change';
+ const TextComponent = (props) => {
+ const [disabled, setDisabled] = useState(false);
+ const onClick = () => {
+ setDisabled(!disabled);
+ };
+ return (
+ <>
+
{btnText}
+
+ >
+ );
};
- return (
- <>
-
{btnText}
-
- >
+ const spy = vi.spyOn(selectInputProps, 'onPopupVisibleChange');
+ const { getByPlaceholderText, getByText } = render(
);
+ // 展开收起一共触发 onPopupVisibleChange 2次
+ fireEvent.click(getByPlaceholderText(placeholderId));
+ expect(spy).toHaveBeenCalled();
+ fireEvent.click(getByPlaceholderText(placeholderId));
+ expect(spy).toHaveBeenCalledTimes(2);
+ await mockTimeout(() =>
+ expect(document.querySelector(popupSelector)).toHaveStyle({
+ display: 'none',
+ }),
);
- };
-
- const { container, getByText } = render(
);
- expect(getByText('选项一')).toBeInTheDocument();
- expect(container.querySelectorAll('.t-cascader__menu').length).toBe(1);
- // 首次展开子选项会插入新的 ul
- fireEvent.click(getByText('选项一'));
- expect(getByText('子选项一')).toBeInTheDocument();
- expect(container.querySelectorAll('.t-cascader__menu').length).toBe(2);
- // multiple 测试,存在 checkbox
- expect(container.querySelector('input')).toBeNull();
- fireEvent.click(getByText(btnText));
- expect(container.querySelector('input')).toBeInTheDocument();
- });
- test('Panel组件 trigger 为 hover 时,应该正确展开下一层级', () => {
- const { container, getByText } = render(
);
- expect(container.querySelectorAll('.t-cascader__menu').length).toBe(1);
- fireEvent.mouseEnter(getByText('选项一'));
- expect(getByText('子选项一')).toBeInTheDocument();
- expect(container.querySelectorAll('.t-cascader__menu').length).toBe(2);
+ // disabled 不会展开 popup,且不执行 onPopupVisibleChange
+ fireEvent.click(getByText(btnText));
+ fireEvent.click(getByPlaceholderText(placeholderId));
+ expect(document.querySelector(popupSelector)).toHaveStyle({
+ display: 'none',
+ });
+ expect(spy).toHaveBeenCalledTimes(2);
+ });
});
- test('Panel组件 multiple 测试', () => {
- const { getByText, getByTitle } = render(
);
- fireEvent.click(getByText('选项一'));
- expect(getByTitle('子选项一')).not.toHaveClass('t-is-checked');
- // 选中一个子选项,父级应为 indeterminate 状态
- fireEvent.click(getByText('子选项一'));
- expect(getByTitle('选项一')).toHaveClass('t-is-indeterminate');
- expect(getByTitle('子选项一')).toHaveClass('t-is-checked');
- // 选中全部子选项,父级应该为 checked 状态
- fireEvent.click(getByText('子选项二'));
- expect(getByTitle('选项一')).toHaveClass('t-is-checked');
- expect(getByTitle('子选项二')).toHaveClass('t-is-checked');
- });
+ describe('scenarios', () => {
+ test('value is zero should be selected', async () => {
+ const popupSelector = '.t-popup';
+ const labelText = 'my value is 0 that typeof number';
+ const TestComponent = () => {
+ const [value, setValue] = useState('');
+ const options = [
+ {
+ value: 0,
+ label: labelText,
+ },
+ ];
+ const onChange = (value) => {
+ setValue(value);
+ };
+
+ return
;
+ };
+ const { getByText } = render(
);
+ fireEvent.click(document.querySelector('input'));
+ expect(document.querySelector(popupSelector)).toHaveTextContent(labelText);
+ await mockTimeout(() => fireEvent.click(getByText(labelText)));
+ expect(document.querySelector('.t-input__inner')).toHaveValue(labelText);
+ });
- test('Panel组件 multiple 时设置 max 测试', async () => {
- const btnText = 'set max 1';
- const TestComponent = () => {
- const [max, setMax] = useState(3);
- return (
- <>
-
setMax(1)}>{btnText}
-
- >
+ test('multiple Clicking the clear all button only triggers onChange once', async () => {
+ const onChange = vi.fn();
+ const onRemove = vi.fn();
+ const { container } = render(
+
,
);
- };
- const { getByText, getByTitle } = render(
);
- // 所选内容不超过 max ,都可选中
- fireEvent.click(getByTitle('选项一').querySelector('input'));
- expect(getByTitle('选项一')).toHaveClass('t-is-checked');
- expect(getByTitle('子选项一')).toHaveClass('t-is-checked');
- expect(getByTitle('子选项二')).toHaveClass('t-is-checked');
- // 清空所有选中
- fireEvent.click(getByTitle('选项一').querySelector('input'));
- // 设置 max 为 1,点击父级无法选中任何节点
- fireEvent.click(getByText(btnText));
- fireEvent.click(getByTitle('选项一'));
- fireEvent.click(getByTitle('选项一').querySelector('input'));
- expect(getByTitle('选项一')).not.toHaveClass('t-is-checked');
- expect(getByTitle('子选项一')).not.toHaveClass('t-is-checked');
- // 选中一个子节点后所有节点为 disabled
- fireEvent.click(getByTitle('子选项一'));
- expect(getByTitle('子选项一')).toHaveClass('t-is-checked');
- expect(getByTitle('选项二')).toHaveClass('t-is-disabled');
- });
+ fireEvent.mouseEnter(container.querySelector('.t-input'));
+ await mockDelay();
+ // 点击清除按钮只触发一次onChange,不触发onRemove
+ expect(container.querySelector('.t-tag-input__suffix-clear')).toBeTruthy();
+ fireEvent.click(container.querySelector('.t-tag-input__suffix-clear'));
+ expect(onChange).toHaveBeenCalledTimes(1);
+ expect(onRemove).toHaveBeenCalledTimes(0);
+ // 点击tag onRemove,触发一次onRemove,触发两次onChange
+ fireEvent.click(container.querySelectorAll('.t-tag__icon-close')[0]);
+ expect(onRemove).toHaveBeenCalledTimes(1);
+ expect(onChange).toHaveBeenCalledTimes(2);
+ });
- test('multiple 应按用户勾选顺序保留 value', async () => {
- const onChange = vi.fn();
- const TestComponent = () => {
- const [value, setValue] = useState
([]);
- return (
- {
- onChange(val, ctx);
- setValue(val as any[]);
- }}
- />
+ test('multiple 应按用户勾选顺序保留 value', async () => {
+ const onChange = vi.fn();
+ const TestComponent = () => {
+ const [value, setValue] = useState([]);
+ return (
+ {
+ onChange(val, ctx);
+ setValue(val as any[]);
+ }}
+ />
+ );
+ };
+ const { getByText } = render();
+ fireEvent.click(document.querySelector('input'));
+ await mockDelay();
+
+ // 切到「选项二」面板,勾选 2.1
+ fireEvent.click(getByText('选项二'));
+ fireEvent.click(document.querySelector('.t-checkbox input[name="2.1"]'));
+ expect(onChange).toHaveBeenLastCalledWith(['2.1'], expect.any(Object));
+
+ // 切到「选项一」面板,勾选 1.1(最新点击的项应排在末尾)
+ fireEvent.click(getByText('选项一'));
+ fireEvent.click(document.querySelector('.t-checkbox input[name="1.1"]'));
+ expect(onChange).toHaveBeenLastCalledWith(['2.1', '1.1'], expect.any(Object));
+
+ // 继续切到「选项二」勾选 2.2
+ fireEvent.click(getByText('选项二'));
+ fireEvent.click(document.querySelector('.t-checkbox input[name="2.2"]'));
+ expect(onChange).toHaveBeenLastCalledWith(['2.1', '1.1', '2.2'], expect.any(Object));
+
+ // 取消勾选 2.1,已有项的相对顺序应保留
+ fireEvent.click(document.querySelector('.t-checkbox input[name="2.1"]'));
+ expect(onChange).toHaveBeenLastCalledWith(['1.1', '2.2'], expect.any(Object));
+ });
+
+ test('multiple + valueType=full 应按用户勾选顺序保留 value', async () => {
+ const onChange = vi.fn();
+ const TestComponent = () => {
+ const [value, setValue] = useState([]);
+ return (
+ {
+ onChange(val, ctx);
+ setValue(val as any[]);
+ }}
+ />
+ );
+ };
+ const { getByText } = render();
+ fireEvent.click(document.querySelector('input'));
+ await mockDelay();
+
+ fireEvent.click(getByText('选项二'));
+ fireEvent.click(document.querySelector('.t-checkbox input[name="2.1"]'));
+ expect(onChange).toHaveBeenLastCalledWith([['2', '2.1']], expect.any(Object));
+
+ fireEvent.click(getByText('选项一'));
+ fireEvent.click(document.querySelector('.t-checkbox input[name="1.1"]'));
+ expect(onChange).toHaveBeenLastCalledWith(
+ [
+ ['2', '2.1'],
+ ['1', '1.1'],
+ ],
+ expect.any(Object),
);
- };
- const { getByText } = render();
- fireEvent.click(document.querySelector('input'));
- await mockDelay();
-
- // 切到「选项二」面板,勾选 2.1
- fireEvent.click(getByText('选项二'));
- fireEvent.click(document.querySelector('.t-checkbox input[name="2.1"]'));
- expect(onChange).toHaveBeenLastCalledWith(['2.1'], expect.any(Object));
-
- // 切到「选项一」面板,勾选 1.1(最新点击的项应排在末尾)
- fireEvent.click(getByText('选项一'));
- fireEvent.click(document.querySelector('.t-checkbox input[name="1.1"]'));
- expect(onChange).toHaveBeenLastCalledWith(['2.1', '1.1'], expect.any(Object));
-
- // 继续切到「选项二」勾选 2.2
- fireEvent.click(getByText('选项二'));
- fireEvent.click(document.querySelector('.t-checkbox input[name="2.2"]'));
- expect(onChange).toHaveBeenLastCalledWith(['2.1', '1.1', '2.2'], expect.any(Object));
-
- // 取消勾选 2.1,已有项的相对顺序应保留
- fireEvent.click(document.querySelector('.t-checkbox input[name="2.1"]'));
- expect(onChange).toHaveBeenLastCalledWith(['1.1', '2.2'], expect.any(Object));
- });
- test('multiple + valueType=full 应按用户勾选顺序保留 value', async () => {
- const onChange = vi.fn();
- const TestComponent = () => {
- const [value, setValue] = useState([]);
- return (
- {
- onChange(val, ctx);
- setValue(val as any[]);
- }}
- />
+ fireEvent.click(getByText('选项二'));
+ fireEvent.click(document.querySelector('.t-checkbox input[name="2.2"]'));
+ expect(onChange).toHaveBeenLastCalledWith(
+ [
+ ['2', '2.1'],
+ ['1', '1.1'],
+ ['2', '2.2'],
+ ],
+ expect.any(Object),
);
- };
- const { getByText } = render();
- fireEvent.click(document.querySelector('input'));
- await mockDelay();
-
- fireEvent.click(getByText('选项二'));
- fireEvent.click(document.querySelector('.t-checkbox input[name="2.1"]'));
- expect(onChange).toHaveBeenLastCalledWith([['2', '2.1']], expect.any(Object));
-
- fireEvent.click(getByText('选项一'));
- fireEvent.click(document.querySelector('.t-checkbox input[name="1.1"]'));
- expect(onChange).toHaveBeenLastCalledWith(
- [
- ['2', '2.1'],
- ['1', '1.1'],
- ],
- expect.any(Object),
- );
-
- fireEvent.click(getByText('选项二'));
- fireEvent.click(document.querySelector('.t-checkbox input[name="2.2"]'));
- expect(onChange).toHaveBeenLastCalledWith(
- [
- ['2', '2.1'],
- ['1', '1.1'],
- ['2', '2.2'],
- ],
- expect.any(Object),
- );
+ });
});
});
diff --git a/packages/components/checkbox/__tests__/checkbox-group.test.tsx b/packages/components/checkbox/__tests__/checkbox-group.test.tsx
new file mode 100644
index 0000000000..5d45d8bcd5
--- /dev/null
+++ b/packages/components/checkbox/__tests__/checkbox-group.test.tsx
@@ -0,0 +1,94 @@
+import React from 'react';
+import { fireEvent, render, vi } from '@test/utils';
+
+import Checkbox from '../Checkbox';
+
+describe('CheckboxGroup', () => {
+ describe('props', () => {
+ test('value', () => {
+ const { container } = render(
+
+ 广州
+
+ 深圳
+
+ ,
+ );
+ expect(container.firstChild.firstChild).toHaveClass('t-is-checked');
+ });
+
+ test('value is string', () => {
+ const { container } = render();
+ expect(container.firstChild.firstChild).toHaveClass('t-is-checked');
+ });
+
+ test('value is number', () => {
+ const { container } = render();
+ expect(container.firstChild.firstChild).toHaveClass('t-is-checked');
+ });
+
+ test('defaultValue', () => {
+ const { container } = render(
+
+ 广州
+
+ 深圳
+
+ ,
+ );
+ expect(container.firstChild.firstChild).toHaveClass('t-is-checked');
+ });
+ });
+
+ describe('events', () => {
+ test('onChange', () => {
+ const fn = vi.fn();
+ const { container } = render(
+
+ 广州
+
+ 深圳
+
+ ,
+ );
+ fireEvent.click(container.firstChild.firstChild);
+ expect(fn).toHaveBeenCalledTimes(1);
+ });
+ });
+
+ describe('scenarios', () => {
+ test('option', () => {
+ const { container } = render(
+ ,
+ );
+ fireEvent.click(container.firstChild.lastChild);
+ expect(container.firstChild.firstChild).toHaveClass('t-is-checked');
+ const options = container.firstChild.childNodes;
+ // 0 is rendered as string '0'
+ expect(options.item(4).textContent).toBe('0');
+ });
+
+ test('max', () => {
+ const { container } = render(
+
+ 广州
+ 深圳
+ 北京
+ ,
+ );
+ fireEvent.click(container.firstChild.firstChild);
+ expect(container.firstChild.lastChild).toHaveClass('t-is-disabled');
+ });
+ });
+});
diff --git a/packages/components/checkbox/__tests__/checkbox.test.tsx b/packages/components/checkbox/__tests__/checkbox.test.tsx
index 2645000fee..b67f24df3c 100644
--- a/packages/components/checkbox/__tests__/checkbox.test.tsx
+++ b/packages/components/checkbox/__tests__/checkbox.test.tsx
@@ -4,123 +4,45 @@ import { fireEvent, render, vi } from '@test/utils';
import Checkbox from '../Checkbox';
describe('Checkbox', () => {
- test('checked & children', () => {
- const { container, queryByText } = render(选中项);
- expect(container.firstChild).toHaveClass('t-checkbox', 't-is-checked');
- expect(queryByText('选中项')).toBeInTheDocument();
- });
-
- test('defaultChecked', () => {
- const { container } = render();
- expect(container.firstChild).toHaveClass('t-checkbox', 't-is-checked');
- });
-
- test('disabled', () => {
- const fn = vi.fn();
- const { container } = render();
- expect(container.firstChild).toHaveClass('t-is-disabled');
- fireEvent.click(container.firstChild);
- expect(fn).toHaveBeenCalledTimes(0);
- });
-
- test('indeterminate', () => {
- const { container } = render();
- expect(container.firstChild).toHaveClass('t-is-indeterminate');
- });
-
- test('label', () => {
- const { queryByText } = render();
- expect(queryByText('选中项')).toBeInTheDocument();
- });
-
- test('onChange', () => {
- const fn = vi.fn();
- const { container } = render();
- fireEvent.click(container.firstChild);
- expect(fn).toHaveBeenCalledTimes(0);
- });
-});
-
-describe('CheckboxGroup', () => {
- test('value', () => {
- const { container } = render(
-
- 广州
-
- 深圳
-
- ,
- );
- expect(container.firstChild.firstChild).toHaveClass('t-is-checked');
- });
-
- test('onChange', () => {
- const fn = vi.fn();
- const { container } = render(
-
- 广州
-
- 深圳
-
- ,
- );
- fireEvent.click(container.firstChild.firstChild);
- expect(fn).toHaveBeenCalledTimes(1);
- });
-
- test('option', () => {
- const { container } = render(
- ,
- );
- fireEvent.click(container.firstChild.lastChild);
- expect(container.firstChild.firstChild).toHaveClass('t-is-checked');
- const options = container.firstChild.childNodes;
- // 0 is rendered as string '0'
- expect(options.item(4).textContent).toBe('0');
- });
-
- test('value is string', () => {
- const { container } = render();
- expect(container.firstChild.firstChild).toHaveClass('t-is-checked');
- });
-
- test('value is number', () => {
- const { container } = render();
- expect(container.firstChild.firstChild).toHaveClass('t-is-checked');
- });
-
- test('defaultValue', () => {
- const { container } = render(
-
- 广州
-
- 深圳
-
- ,
- );
- expect(container.firstChild.firstChild).toHaveClass('t-is-checked');
- });
-
- test('max', () => {
- const { container } = render(
-
- 广州
- 深圳
- 北京
- ,
- );
- fireEvent.click(container.firstChild.firstChild);
- expect(container.firstChild.lastChild).toHaveClass('t-is-disabled');
+ describe('props', () => {
+ test('defaultChecked', () => {
+ const { container } = render();
+ expect(container.firstChild).toHaveClass('t-checkbox', 't-is-checked');
+ });
+
+ test('indeterminate', () => {
+ const { container } = render();
+ expect(container.firstChild).toHaveClass('t-is-indeterminate');
+ });
+
+ test('label', () => {
+ const { queryByText } = render();
+ expect(queryByText('选中项')).toBeInTheDocument();
+ });
+ });
+
+ describe('events', () => {
+ test('onChange', () => {
+ const fn = vi.fn();
+ const { container } = render();
+ fireEvent.click(container.firstChild);
+ expect(fn).toHaveBeenCalledTimes(0);
+ });
+ });
+
+ describe('scenarios', () => {
+ test('checked & children', () => {
+ const { container, queryByText } = render(选中项);
+ expect(container.firstChild).toHaveClass('t-checkbox', 't-is-checked');
+ expect(queryByText('选中项')).toBeInTheDocument();
+ });
+
+ test('disabled', () => {
+ const fn = vi.fn();
+ const { container } = render();
+ expect(container.firstChild).toHaveClass('t-is-disabled');
+ fireEvent.click(container.firstChild);
+ expect(fn).toHaveBeenCalledTimes(0);
+ });
});
});
diff --git a/packages/components/collapse/__tests__/collapse.test.tsx b/packages/components/collapse/__tests__/collapse.test.tsx
index ae26bf85a4..6d90e65760 100644
--- a/packages/components/collapse/__tests__/collapse.test.tsx
+++ b/packages/components/collapse/__tests__/collapse.test.tsx
@@ -19,35 +19,37 @@ const CollapseTestComponent = (props: TestComponentProps) => (
);
-describe('Collapse Unit Test', () => {
- // 渲染测试
- test('create', async () => {
- const { container, queryByText } = render();
- expect(container.firstElementChild.classList.contains('t-collapse')).toBeTruthy();
- expect(queryByText(panelContent)).toBeInTheDocument();
- });
-
- // 测试点击事件
- test('click event', async () => {
- const CollapseTest = () => (
-
-
- 这部分是每个折叠面板折叠或展开的内容,可根据不同业务或用户的使用诉求,进行自定义填充。可以是纯文本、图文、子列表等内容形式。
-
-
- );
- const { container } = render();
-
- // 获取 element
- const element = container.querySelector('.t-collapse-panel__header');
- expect(element).not.toBeNull();
-
- // 默认展开,点击关闭
- fireEvent.click(element);
- expect(document.querySelector('.t-collapse-panel__body--collapsed')).toBeNull();
-
- // 当前关闭,点击展开
- fireEvent.click(element);
- expect(document.querySelector('.t-collapse-panel__body--collapsed')).not.toBeNull();
+describe('Collapse', () => {
+ describe('scenarios', () => {
+ // 渲染测试
+ test('create', async () => {
+ const { container, queryByText } = render();
+ expect(container.firstElementChild.classList.contains('t-collapse')).toBeTruthy();
+ expect(queryByText(panelContent)).toBeInTheDocument();
+ });
+
+ // 测试点击事件
+ test('click event', async () => {
+ const CollapseTest = () => (
+
+
+ 这部分是每个折叠面板折叠或展开的内容,可根据不同业务或用户的使用诉求,进行自定义填充。可以是纯文本、图文、子列表等内容形式。
+
+
+ );
+ const { container } = render();
+
+ // 获取 element
+ const element = container.querySelector('.t-collapse-panel__header');
+ expect(element).not.toBeNull();
+
+ // 默认展开,点击关闭
+ fireEvent.click(element);
+ expect(document.querySelector('.t-collapse-panel__body--collapsed')).toBeNull();
+
+ // 当前关闭,点击展开
+ fireEvent.click(element);
+ expect(document.querySelector('.t-collapse-panel__body--collapsed')).not.toBeNull();
+ });
});
});
diff --git a/packages/components/color-picker/__tests__/color-picker-panel.test.tsx b/packages/components/color-picker/__tests__/color-picker-panel.test.tsx
new file mode 100644
index 0000000000..ab2f2ecfca
--- /dev/null
+++ b/packages/components/color-picker/__tests__/color-picker-panel.test.tsx
@@ -0,0 +1,98 @@
+import React, { useState } from 'react';
+import { fireEvent, render, vi } from '@test/utils';
+
+import ColorPickerPanel from '../ColorPickerPanel';
+
+describe('ColorPickerPanel', () => {
+ describe('scenarios', () => {
+ test('ColorPickerPanel 测试', () => {
+ const { queryByText } = render();
+ expect(queryByText('最近使用颜色')).toBeInTheDocument();
+ });
+
+ test('渐变颜色更新 测试', async () => {
+ const { container } = render(
+ ,
+ );
+
+ // 点击第二个渐变点
+ fireEvent.click(container.querySelectorAll('li.t-color-picker__thumb')[1]);
+
+ // 点击 Saturation 板上的点,并模拟鼠标移动
+ const thumb = container.querySelector('span.t-color-picker__thumb');
+ fireEvent.mouseDown(thumb);
+ fireEvent.mouseMove(thumb, { clientX: 50, clientY: 50 });
+ fireEvent.mouseUp(thumb);
+
+ // 获取移动后的色值
+ const { color } = getComputedStyle(thumb);
+
+ const rgb2Rgba = (rgb: string) => {
+ const rgba = rgb.replace('rgb', 'rgba').replace(')', ', 1)');
+ return rgba;
+ };
+
+ // 检查 CSS Input 生成的新渐变色
+ expect(container.querySelectorAll('.t-input__inner')[2]).toHaveValue(
+ `linear-gradient(45deg,rgb(79, 172, 255) 0%,${rgb2Rgba(color)} 100%)`,
+ );
+ });
+
+ test('enableAlpha 开启透明通道', () => {
+ const btnText = 'changeAlpha';
+ const [defaultValue, changeValue] = ['rgba(0, 82, 217, 1)', 'rgba(0, 82, 217, 0.32)'];
+ const TestComponent = () => {
+ const [value, setValue] = useState(defaultValue);
+ const onClick = () => {
+ setValue(changeValue);
+ };
+ return (
+ <>
+ {btnText}
+
+ >
+ );
+ };
+ const { container, getByText } = render();
+ expect(container.querySelector('.t-color-picker__alpha')).toBeInTheDocument();
+ expect(container.querySelector('.t-color-picker__sliders-preview-inner')).toHaveStyle({
+ background: defaultValue,
+ });
+ fireEvent.click(getByText(btnText));
+ expect(container.querySelector('.t-color-picker__sliders-preview-inner')).toHaveStyle({
+ background: changeValue,
+ });
+ });
+
+ test('最近使用颜色 recentColors 测试', async () => {
+ const onRecentColorsChange = vi.fn();
+ const TestComponent = () => {
+ const value = '#0052d9';
+ return ;
+ };
+ const { container } = render();
+
+ // 点击添加,当前颜色成功加入且为激活状态,且删除按钮出现
+ fireEvent.click(container.querySelector('.t-icon-add'));
+ expect(container.querySelector('.t-is-active')).toBeInTheDocument();
+ expect(container.querySelector('.t-color-picker__swatches--item__inner')).toHaveStyle({
+ background: 'rgb(0, 82, 217)',
+ });
+ // 不能重复添加同个颜色值
+ fireEvent.click(container.querySelector('.t-icon-add'));
+ expect(
+ container.querySelector('.t-color-picker__swatches--items').querySelectorAll('.t-color-picker__swatches--item')
+ .length,
+ ).toBe(1);
+ expect(container.querySelector('.t-icon-delete')).toBeInTheDocument();
+ // 删除当前激活的颜色
+ fireEvent.click(container.querySelector('.t-icon-delete'));
+ expect(container.querySelector('.t-icon-delete')).toBeNull();
+ expect(container.querySelector('.t-is-active')).toBeNull();
+ expect(onRecentColorsChange).toHaveBeenCalled();
+ });
+ });
+});
diff --git a/packages/components/color-picker/__tests__/color-picker.test.tsx b/packages/components/color-picker/__tests__/color-picker.test.tsx
index 733d026989..9469fd8c72 100644
--- a/packages/components/color-picker/__tests__/color-picker.test.tsx
+++ b/packages/components/color-picker/__tests__/color-picker.test.tsx
@@ -1,140 +1,56 @@
-import React, { useState } from 'react';
-import { fireEvent, mockTimeout, render, userEvent, vi } from '@test/utils';
+import React from 'react';
+import { fireEvent, mockTimeout, render, userEvent } from '@test/utils';
import ColorPicker from '../ColorPicker';
-import ColorPickerPanel from '../ColorPickerPanel';
-describe('ColorPicker 组件测试', () => {
+describe('ColorPicker', () => {
const user = userEvent.setup();
- test('ColorPicker Trigger 测试', async () => {
- const { container } = render();
- expect(container.querySelector('.t-input__inner')).toHaveValue('#0052d9');
- // 测试 input 改变值失焦时触发 onChange 改变颜色值
- fireEvent.focus(container.querySelector('.t-input__inner'));
- await user.type(container.querySelector('.t-input__inner'), '{end}{backspace}8');
- fireEvent.blur(container.querySelector('.t-input__inner'));
- await mockTimeout(() => expect(container.querySelector('.t-input__inner')).toHaveValue('#0052d8'));
- // 测试颜色格式正确展示(不传入 format 时默认为 RGB)
- fireEvent.click(container);
- fireEvent.click(document.querySelector('.t-color-picker__swatches--item'));
- expect(container.querySelector('.t-input__inner')).toHaveValue('rgb(236, 242, 254)');
- });
-
- test('ColorPicker 预设颜色切换 测试', () => {
- const { container } = render(
- ,
- );
- fireEvent.click(container.querySelector('.t-input'));
- expect(document.querySelector('.t-color-picker__gradient')).toBeInTheDocument();
- // 点击系统预设颜色的第一个
- fireEvent.click(document.querySelector('.t-color-picker__swatches--item'));
- // 渐变模式下切换为对应的纯色
- expect(container.querySelector('.t-input__inner')).toHaveValue('rgba(236, 242, 254, 1)');
- });
-
- test(':disabled 测试', () => {
- const { container } = render();
- expect(container.querySelector('.t-input__inner')).toBeDisabled();
- });
- test('饱和度选择测试', () => {
- const defaultValue = '#fff';
- const { container } = render();
- fireEvent.click(container.querySelector('.t-input__inner'));
- expect(container.querySelector('.t-input__inner')).toHaveValue(defaultValue);
- const wrapper = document.querySelector('.t-color-picker__saturation');
- fireEvent.mouseDown(wrapper);
- fireEvent.mouseMove(wrapper, { deltaX: 232, deltaY: 160 });
- expect(container.querySelector('.t-input__inner')).toHaveValue('rgb(0, 0, 0)');
- fireEvent.mouseMove(wrapper, { deltaX: -232, deltaY: -160 });
- expect(container.querySelector('.t-input__inner')).toHaveValue('rgb(255, 255, 255)');
- });
-});
-
-describe('ColorPickerPanel 组件测试', () => {
- test('ColorPickerPanel 测试', () => {
- const { queryByText } = render();
- expect(queryByText('最近使用颜色')).toBeInTheDocument();
+ describe('props', () => {
+ test(':disabled 测试', () => {
+ const { container } = render();
+ expect(container.querySelector('.t-input__inner')).toBeDisabled();
+ });
});
- test('渐变颜色更新 测试', async () => {
- const { container } = render(
- ,
- );
-
- // 点击第二个渐变点
- fireEvent.click(container.querySelectorAll('li.t-color-picker__thumb')[1]);
-
- // 点击 Saturation 板上的点,并模拟鼠标移动
- const thumb = container.querySelector('span.t-color-picker__thumb');
- fireEvent.mouseDown(thumb);
- fireEvent.mouseMove(thumb, { clientX: 50, clientY: 50 });
- fireEvent.mouseUp(thumb);
-
- // 获取移动后的色值
- const { color } = getComputedStyle(thumb);
-
- const rgb2Rgba = (rgb: string) => {
- const rgba = rgb.replace('rgb', 'rgba').replace(')', ', 1)');
- return rgba;
- };
-
- // 检查 CSS Input 生成的新渐变色
- expect(container.querySelectorAll('.t-input__inner')[2]).toHaveValue(
- `linear-gradient(45deg,rgb(79, 172, 255) 0%,${rgb2Rgba(color)} 100%)`,
- );
- });
+ describe('scenarios', () => {
+ test('ColorPicker Trigger 测试', async () => {
+ const { container } = render();
+ expect(container.querySelector('.t-input__inner')).toHaveValue('#0052d9');
+ // 测试 input 改变值失焦时触发 onChange 改变颜色值
+ fireEvent.focus(container.querySelector('.t-input__inner'));
+ await user.type(container.querySelector('.t-input__inner'), '{end}{backspace}8');
+ fireEvent.blur(container.querySelector('.t-input__inner'));
+ await mockTimeout(() => expect(container.querySelector('.t-input__inner')).toHaveValue('#0052d8'));
+ // 测试颜色格式正确展示(不传入 format 时默认为 RGB)
+ fireEvent.click(container);
+ fireEvent.click(document.querySelector('.t-color-picker__swatches--item'));
+ expect(container.querySelector('.t-input__inner')).toHaveValue('rgb(236, 242, 254)');
+ });
- test('enableAlpha 开启透明通道', () => {
- const btnText = 'changeAlpha';
- const [defaultValue, changeValue] = ['rgba(0, 82, 217, 1)', 'rgba(0, 82, 217, 0.32)'];
- const TestComponent = () => {
- const [value, setValue] = useState(defaultValue);
- const onClick = () => {
- setValue(changeValue);
- };
- return (
- <>
- {btnText}
-
- >
+ test('ColorPicker 预设颜色切换 测试', () => {
+ const { container } = render(
+ ,
);
- };
- const { container, getByText } = render();
- expect(container.querySelector('.t-color-picker__alpha')).toBeInTheDocument();
- expect(container.querySelector('.t-color-picker__sliders-preview-inner')).toHaveStyle({ background: defaultValue });
- fireEvent.click(getByText(btnText));
- expect(container.querySelector('.t-color-picker__sliders-preview-inner')).toHaveStyle({ background: changeValue });
- });
-
- test('最近使用颜色 recentColors 测试', async () => {
- const onRecentColorsChange = vi.fn();
- const TestComponent = () => {
- const value = '#0052d9';
- return ;
- };
- const { container } = render();
+ fireEvent.click(container.querySelector('.t-input'));
+ expect(document.querySelector('.t-color-picker__gradient')).toBeInTheDocument();
+ // 点击系统预设颜色的第一个
+ fireEvent.click(document.querySelector('.t-color-picker__swatches--item'));
+ // 渐变模式下切换为对应的纯色
+ expect(container.querySelector('.t-input__inner')).toHaveValue('rgba(236, 242, 254, 1)');
+ });
- // 点击添加,当前颜色成功加入且为激活状态,且删除按钮出现
- fireEvent.click(container.querySelector('.t-icon-add'));
- expect(container.querySelector('.t-is-active')).toBeInTheDocument();
- expect(container.querySelector('.t-color-picker__swatches--item__inner')).toHaveStyle({
- background: 'rgb(0, 82, 217)',
+ test('饱和度选择测试', () => {
+ const defaultValue = '#fff';
+ const { container } = render();
+ fireEvent.click(container.querySelector('.t-input__inner'));
+ expect(container.querySelector('.t-input__inner')).toHaveValue(defaultValue);
+ const wrapper = document.querySelector('.t-color-picker__saturation');
+ fireEvent.mouseDown(wrapper);
+ fireEvent.mouseMove(wrapper, { deltaX: 232, deltaY: 160 });
+ expect(container.querySelector('.t-input__inner')).toHaveValue('rgb(0, 0, 0)');
+ fireEvent.mouseMove(wrapper, { deltaX: -232, deltaY: -160 });
+ expect(container.querySelector('.t-input__inner')).toHaveValue('rgb(255, 255, 255)');
});
- // 不能重复添加同个颜色值
- fireEvent.click(container.querySelector('.t-icon-add'));
- expect(
- container.querySelector('.t-color-picker__swatches--items').querySelectorAll('.t-color-picker__swatches--item')
- .length,
- ).toBe(1);
- expect(container.querySelector('.t-icon-delete')).toBeInTheDocument();
- // 删除当前激活的颜色
- fireEvent.click(container.querySelector('.t-icon-delete'));
- expect(container.querySelector('.t-icon-delete')).toBeNull();
- expect(container.querySelector('.t-is-active')).toBeNull();
- expect(onRecentColorsChange).toHaveBeenCalled();
});
});
diff --git a/packages/components/comment/__tests__/comment.test.tsx b/packages/components/comment/__tests__/comment.test.tsx
index 3062b19a73..bea29c4299 100644
--- a/packages/components/comment/__tests__/comment.test.tsx
+++ b/packages/components/comment/__tests__/comment.test.tsx
@@ -4,32 +4,32 @@ import { render } from '@test/utils';
import Comment from '../Comment';
describe('Comment', () => {
- test('author', () => {
- const { container } = render();
- expect(container.querySelector('.t-comment__author > .t-comment__name')).toContainHTML('评论作者名');
- });
+ describe('props', () => {
+ test('author', () => {
+ const { container } = render();
+ expect(container.querySelector('.t-comment__author > .t-comment__name')).toContainHTML('评论作者名');
+ });
- test('datetime', () => {
- const { container } = render();
- expect(container.querySelector('.t-comment__author > .t-comment__time')).toContainHTML('今天16:38');
- });
+ test('datetime', () => {
+ const { container } = render();
+ expect(container.querySelector('.t-comment__author > .t-comment__time')).toContainHTML('今天16:38');
+ });
- test('content', () => {
- const { container } = render();
- expect(container.querySelector('.t-comment__detail')).toContainHTML('评论内容');
- });
+ test('content', () => {
+ const { container } = render();
+ expect(container.querySelector('.t-comment__detail')).toContainHTML('评论内容');
+ });
- test('reply', () => {
- const { container } = render();
- expect(container.querySelector('.t-comment__reply')).toContainHTML('回复内容');
- });
+ test('reply', () => {
+ const { container } = render();
+ expect(container.querySelector('.t-comment__reply')).toContainHTML('回复内容');
+ });
- test('quote', () => {
- const { container } = render();
- expect(container.querySelector('.t-comment__quote')).toContainHTML('引用内容');
- });
+ test('quote', () => {
+ const { container } = render();
+ expect(container.querySelector('.t-comment__quote')).toContainHTML('引用内容');
+ });
- describe('avatar', () => {
test('avatar is url string', () => {
const { container } = render();
expect(container.querySelector('.t-comment__avatar-image')).toHaveAttribute(
@@ -37,7 +37,6 @@ describe('Comment', () => {
'https://tdesign.gtimg.com/site/images/list-icon.png',
);
});
-
test('avatar is custom element', () => {
const { container } = render(
{
expect(container.querySelector('.t-comment__avatar-image')).toBeNull();
expect(container.querySelector('.t-comment__avatar > img')).toHaveClass('custom-image');
});
- });
- test('actions with ReactNode items', () => {
- const actions = [
-
- 6
- ,
-
- 回复
- ,
- ];
+ test('actions with ReactNode items', () => {
+ const actions = [
+
+ 6
+ ,
+
+ 回复
+ ,
+ ];
- const { container } = render();
- expect(container.querySelector('.t-comment__actions')).toBeInTheDocument();
- expect(container.querySelectorAll('.t-comment__actions .t-button')).toHaveLength(2);
- });
+ const { container } = render();
+ expect(container.querySelector('.t-comment__actions')).toBeInTheDocument();
+ expect(container.querySelectorAll('.t-comment__actions .t-button')).toHaveLength(2);
+ });
- test('actions with a single ReactNode', () => {
- const { container } = render(操作}>);
- expect(container.querySelectorAll('.t-comment__actions .t-button')).toHaveLength(1);
- expect(container.querySelector('.single-action')).toHaveTextContent('操作');
- });
+ test('actions with a single ReactNode', () => {
+ const { container } = render(操作}>);
+ expect(container.querySelectorAll('.t-comment__actions .t-button')).toHaveLength(1);
+ expect(container.querySelector('.single-action')).toHaveTextContent('操作');
+ });
- test('actions with a Fragment TNode', () => {
- const actions = (
- <>
-
-
- 6
-
-
-
- 回复
-
- >
- );
+ test('actions with a Fragment TNode', () => {
+ const actions = (
+ <>
+
+
+ 6
+
+
+
+ 回复
+
+ >
+ );
- const { container } = render();
- const buttons = container.querySelectorAll('.t-comment__actions .t-button');
- expect(buttons).toHaveLength(2);
- expect(buttons[0]).toContainElement(container.querySelector('.thumb-up-icon'));
- expect(buttons[0]).toHaveTextContent('6');
- expect(buttons[1]).toContainElement(container.querySelector('.chat-icon'));
- expect(buttons[1]).toHaveTextContent('回复');
+ const { container } = render();
+ const buttons = container.querySelectorAll('.t-comment__actions .t-button');
+ expect(buttons).toHaveLength(2);
+ expect(buttons[0]).toContainElement(container.querySelector('.thumb-up-icon'));
+ expect(buttons[0]).toHaveTextContent('6');
+ expect(buttons[1]).toContainElement(container.querySelector('.chat-icon'));
+ expect(buttons[1]).toHaveTextContent('回复');
+ });
});
});
diff --git a/packages/components/date-picker/__tests__/date-picker-panel.test.tsx b/packages/components/date-picker/__tests__/date-picker-panel.test.tsx
index 70d65ad191..0e9c2f84e2 100644
--- a/packages/components/date-picker/__tests__/date-picker-panel.test.tsx
+++ b/packages/components/date-picker/__tests__/date-picker-panel.test.tsx
@@ -23,141 +23,149 @@ describe('DatePickerPanel', () => {
vi.useRealTimers();
});
- test('value props', async () => {
- const { container } = render();
- expect(container.querySelector('.t-date-picker__cell--active')).toBeInTheDocument();
- expect(container.querySelector('.t-date-picker__cell--active').firstChild).toHaveTextContent('14');
-
- const { container: container2 } = render();
- expect(container2.querySelector('.t-date-picker__cell--active')).toBeInTheDocument();
- expect(container2.querySelector('.t-date-picker__cell--active').firstChild).toHaveTextContent('12');
+ describe('props', () => {
+ test('value props', async () => {
+ const { container } = render();
+ expect(container.querySelector('.t-date-picker__cell--active')).toBeInTheDocument();
+ expect(container.querySelector('.t-date-picker__cell--active').firstChild).toHaveTextContent('14');
+
+ const { container: container2 } = render();
+ expect(container2.querySelector('.t-date-picker__cell--active')).toBeInTheDocument();
+ expect(container2.querySelector('.t-date-picker__cell--active').firstChild).toHaveTextContent('12');
+ });
+
+ test('disableDate props', async () => {
+ const { container: container1 } = render(
+ ,
+ );
+ expect(container1.querySelector('.t-date-picker__cell--disabled')).toBeInTheDocument();
+ expect(container1.querySelector('.t-date-picker__cell--disabled').firstChild).toHaveTextContent('30');
+
+ const { container: container2 } = render(
+ ,
+ );
+ expect(container2.querySelector('.t-date-picker__cell--disabled')).toBeInTheDocument();
+ expect(container2.querySelector('.t-date-picker__cell--disabled').firstChild).toHaveTextContent('2');
+
+ const { container: container3 } = render(
+ ,
+ );
+ expect(container3.querySelector('.t-date-picker__cell--disabled')).toBeInTheDocument();
+ expect(container3.querySelector('.t-date-picker__cell--disabled').firstChild).toHaveTextContent('28');
+ });
+
+ test('enableTimePicker props', async () => {
+ const { container } = render();
+ expect(container.querySelector('.t-time-picker__panel')).toBeInTheDocument();
+ });
+
+ test('firstDayOfWeek props', async () => {
+ const { container } = render();
+ expect(container.querySelector('.t-date-picker__table table thead tr').firstChild).toHaveTextContent('二');
+ });
+
+ test('format props', async () => {
+ const { container } = render();
+ expect(container.querySelector('.t-date-picker__cell--active').firstChild).toHaveTextContent('2');
+ });
+
+ test('mode props', async () => {
+ const { container: container1 } = render();
+ expect(container1.querySelector('.t-date-picker__cell--active').firstChild).toHaveTextContent('3');
+
+ const { container: container2 } = render();
+ expect(container2.querySelector('.t-date-picker__table-week-row--active')).toBeInTheDocument();
+ expect(container2.querySelector('.t-date-picker__table-week-row--active td').firstChild).toHaveTextContent('36');
+
+ const { container: container3 } = render();
+ expect(container3.querySelector('.t-date-picker__cell--active').firstChild).toHaveTextContent('11 月');
+
+ const { container: container4 } = render();
+ expect(container4.querySelector('.t-date-picker__cell--active').firstChild).toHaveTextContent('2024');
+
+ // const { container: container5 } = render();
+ // expect(container5.querySelector('.t-date-picker__cell--active')).toHaveTextContent('二季度');
+ });
+
+ test('disableTime', async () => {
+ const { container } = render(
+ ,
+ );
+
+ expect(container.querySelector('.t-date-picker__cell--active').firstChild.firstChild).toHaveTextContent('26');
+ expect(container.querySelectorAll('.t-time-picker__panel-body-scroll')[0].children).toHaveLength(17);
+ });
});
- test('disableDate props', async () => {
- const { container: container1 } = render(
- ,
- );
- expect(container1.querySelector('.t-date-picker__cell--disabled')).toBeInTheDocument();
- expect(container1.querySelector('.t-date-picker__cell--disabled').firstChild).toHaveTextContent('30');
-
- const { container: container2 } = render(
- ,
- );
- expect(container2.querySelector('.t-date-picker__cell--disabled')).toBeInTheDocument();
- expect(container2.querySelector('.t-date-picker__cell--disabled').firstChild).toHaveTextContent('2');
-
- const { container: container3 } = render(
- ,
- );
- expect(container3.querySelector('.t-date-picker__cell--disabled')).toBeInTheDocument();
- expect(container3.querySelector('.t-date-picker__cell--disabled').firstChild).toHaveTextContent('28');
+ describe('events', () => {
+ test('cell handleClick', async () => {
+ const fn = vi.fn();
+ const { container } = render();
+
+ fireEvent.click(container.querySelector('.t-date-picker__cell'));
+ expect(fn).toHaveBeenCalledTimes(1);
+ });
+
+ test('onJumperClick', async () => {
+ const fn = vi.fn();
+ const { container } = render();
+
+ const jumperPrev = container.querySelector('.t-pagination-mini__prev');
+ fireEvent.click(jumperPrev);
+ expect(fn).toHaveBeenCalledTimes(1);
+
+ const jumperNext = container.querySelector('.t-pagination-mini__next');
+ fireEvent.click(jumperNext);
+ expect(fn).toHaveBeenCalledTimes(2);
+
+ const jumperCurrent = container.querySelector('.t-pagination-mini__current');
+ fireEvent.click(jumperCurrent);
+ });
+
+ test('onPresetClick', async () => {
+ const fn = vi.fn();
+ const { getByText } = render(
+ ,
+ );
+
+ const christmasBtn = getByText('圣诞节');
+ fireEvent.click(christmasBtn);
+ expect(fn).toHaveBeenCalledTimes(1);
+ });
});
- test('enableTimePicker props', async () => {
- const { container } = render();
- expect(container.querySelector('.t-time-picker__panel')).toBeInTheDocument();
- });
-
- test('firstDayOfWeek props', async () => {
- const { container } = render();
- expect(container.querySelector('.t-date-picker__table table thead tr').firstChild).toHaveTextContent('二');
- });
-
- test('format props', async () => {
- const { container } = render();
- expect(container.querySelector('.t-date-picker__cell--active').firstChild).toHaveTextContent('2');
- });
-
- test('mode props', async () => {
- const { container: container1 } = render();
- expect(container1.querySelector('.t-date-picker__cell--active').firstChild).toHaveTextContent('3');
-
- const { container: container2 } = render();
- expect(container2.querySelector('.t-date-picker__table-week-row--active')).toBeInTheDocument();
- expect(container2.querySelector('.t-date-picker__table-week-row--active td').firstChild).toHaveTextContent('36');
-
- const { container: container3 } = render();
- expect(container3.querySelector('.t-date-picker__cell--active').firstChild).toHaveTextContent('11 月');
-
- const { container: container4 } = render();
- expect(container4.querySelector('.t-date-picker__cell--active').firstChild).toHaveTextContent('2024');
-
- // const { container: container5 } = render();
- // expect(container5.querySelector('.t-date-picker__cell--active')).toHaveTextContent('二季度');
- });
-
- test('presets、presetsPlacement props', async () => {
- const { container } = render();
- expect(container.querySelector('.t-date-picker__presets')).toBeInTheDocument();
- expect(container.querySelector('.t-date-picker__presets').firstChild.firstChild).toHaveTextContent('今天');
- expect(container.querySelector('.t-date-picker__presets').parentNode).toHaveClass('t-date-picker__footer--left');
- });
-
- test('cell handleClick', async () => {
- const fn = vi.fn();
- const { container } = render();
-
- fireEvent.click(container.querySelector('.t-date-picker__cell'));
- expect(fn).toHaveBeenCalledTimes(1);
- });
-
- test('onJumperClick', async () => {
- const fn = vi.fn();
- const { container } = render();
-
- const jumperPrev = container.querySelector('.t-pagination-mini__prev');
- fireEvent.click(jumperPrev);
- expect(fn).toHaveBeenCalledTimes(1);
-
- const jumperNext = container.querySelector('.t-pagination-mini__next');
- fireEvent.click(jumperNext);
- expect(fn).toHaveBeenCalledTimes(2);
-
- const jumperCurrent = container.querySelector('.t-pagination-mini__current');
- fireEvent.click(jumperCurrent);
- });
-
- test('onTimePickerChange & onConfirmClick', async () => {
- const { container, getByText } = render();
-
- expect(container.querySelector('.t-date-picker__panel-time')).toBeTruthy();
- expect(getByText('确定')).toBeTruthy();
- });
-
- test('onPresetClick', async () => {
- const fn = vi.fn();
- const { getByText } = render();
-
- const christmasBtn = getByText('圣诞节');
- fireEvent.click(christmasBtn);
- expect(fn).toHaveBeenCalledTimes(1);
- });
-
- test('onYearChange & onMonthChange', async () => {
- const { container } = render();
-
- const yearSelect = container.querySelector('.t-date-picker__header-controller-year');
- fireEvent.click(yearSelect);
- const monthSelect = container.querySelector('.t-date-picker__header-controller-month');
- fireEvent.click(monthSelect);
- });
-
- test('disableTime', async () => {
- const { container } = render(
- ,
- );
-
- expect(container.querySelector('.t-date-picker__cell--active').firstChild.firstChild).toHaveTextContent('26');
- expect(container.querySelectorAll('.t-time-picker__panel-body-scroll')[0].children).toHaveLength(17);
+ describe('scenarios', () => {
+ test('presets、presetsPlacement props', async () => {
+ const { container } = render();
+ expect(container.querySelector('.t-date-picker__presets')).toBeInTheDocument();
+ expect(container.querySelector('.t-date-picker__presets').firstChild.firstChild).toHaveTextContent('今天');
+ expect(container.querySelector('.t-date-picker__presets').parentNode).toHaveClass('t-date-picker__footer--left');
+ });
+
+ test('onTimePickerChange & onConfirmClick', async () => {
+ const { container, getByText } = render();
+
+ expect(container.querySelector('.t-date-picker__panel-time')).toBeTruthy();
+ expect(getByText('确定')).toBeTruthy();
+ });
+
+ test('onYearChange & onMonthChange', async () => {
+ const { container } = render();
+
+ const yearSelect = container.querySelector('.t-date-picker__header-controller-year');
+ fireEvent.click(yearSelect);
+ const monthSelect = container.querySelector('.t-date-picker__header-controller-month');
+ fireEvent.click(monthSelect);
+ });
});
});
diff --git a/packages/components/date-picker/__tests__/date-picker.test.tsx b/packages/components/date-picker/__tests__/date-picker.test.tsx
index d13d09ba51..f92aa41740 100644
--- a/packages/components/date-picker/__tests__/date-picker.test.tsx
+++ b/packages/components/date-picker/__tests__/date-picker.test.tsx
@@ -26,360 +26,375 @@ describe('DatePicker', () => {
vi.useRealTimers();
});
- test('clearable', async () => {
- const { container } = render();
- // 模拟鼠标进入
- fireEvent.mouseEnter(container.querySelector('input'));
- const clearElement = await waitFor(() => document.querySelector('.t-input__suffix-clear'));
- expect(clearElement).not.toBeNull();
- fireEvent.click(clearElement);
- });
-
- test('disableDate', async () => {
- const disabledDate = (date: DateValue) => dayjs().isBefore(date);
- const { container: container1 } = render();
- fireEvent.mouseDown(container1.querySelector('input'));
- const { container: container2 } = render( dayjs(date).day() === 6} />);
- fireEvent.mouseDown(container2.querySelector('input'));
-
- const { container: container3 } = render(
- ,
- );
- fireEvent.mouseDown(container3.querySelector('input'));
- const { container: container4 } = render();
- fireEvent.mouseDown(container4.querySelector('input'));
-
- const { container: container5 } = render(
- ,
- );
- fireEvent.mouseDown(container5.querySelector('input'));
-
- const disabledEle = await waitFor(() => document.querySelector('.t-date-picker__cell--disabled'));
- expect(disabledEle).not.toBeNull();
- });
-
- test('disabled', () => {
- const { container } = render();
- const inputElement = container.querySelector('.t-input__inner');
- expect((inputElement as HTMLInputElement).disabled).toBe(true);
- });
-
- test('enableTimePicker', async () => {
- const { container } = render();
- fireEvent.mouseDown(container.querySelector('input'));
- const panelElement = await waitFor(() => document.querySelector('.t-date-picker__panel-time'));
- expect(panelElement).toBeInTheDocument();
- });
-
- test('firstDayOfWeek', async () => {
- const { container } = render();
- fireEvent.mouseDown(container.querySelector('input'));
- const weekElement = await waitFor(() => document.querySelector('.t-date-picker__table table thead tr th'));
- expect(weekElement).toHaveTextContent('三');
- });
+ describe('props', () => {
+ test('clearable', async () => {
+ const { container } = render();
+ // 模拟鼠标进入
+ fireEvent.mouseEnter(container.querySelector('input'));
+ const clearElement = await waitFor(() => document.querySelector('.t-input__suffix-clear'));
+ expect(clearElement).not.toBeNull();
+ fireEvent.click(clearElement);
+ });
- test('defaultValue value format', async () => {
- const { container: container1 } = render();
- const inputElement1 = container1.querySelector('.t-input__inner');
- expect((inputElement1 as HTMLInputElement).value).toEqual('2022-09-14');
+ test('disableDate', async () => {
+ const disabledDate = (date: DateValue) => dayjs().isBefore(date);
+ const { container: container1 } = render();
+ fireEvent.mouseDown(container1.querySelector('input'));
+ const { container: container2 } = render( dayjs(date).day() === 6} />);
+ fireEvent.mouseDown(container2.querySelector('input'));
+
+ const { container: container3 } = render(
+ ,
+ );
+ fireEvent.mouseDown(container3.querySelector('input'));
+ const { container: container4 } = render();
+ fireEvent.mouseDown(container4.querySelector('input'));
+
+ const { container: container5 } = render(
+ ,
+ );
+ fireEvent.mouseDown(container5.querySelector('input'));
+
+ const disabledEle = await waitFor(() => document.querySelector('.t-date-picker__cell--disabled'));
+ expect(disabledEle).not.toBeNull();
+ });
- const { container: container2 } = render();
- const inputElement2 = container2.querySelector('.t-input__inner');
- expect((inputElement2 as HTMLInputElement).value).toEqual('2022-09-14');
- });
+ test('disabled', () => {
+ const { container } = render();
+ const inputElement = container.querySelector('.t-input__inner');
+ expect((inputElement as HTMLInputElement).disabled).toBe(true);
+ });
- test('inputProps', async () => {
- const { container } = render();
- const inputWrapElement = container.querySelector('.t-input__inner');
- expect((inputWrapElement as HTMLInputElement).value).toEqual('test-inputProps');
- });
+ test('enableTimePicker', async () => {
+ const { container } = render();
+ fireEvent.mouseDown(container.querySelector('input'));
+ const panelElement = await waitFor(() => document.querySelector('.t-date-picker__panel-time'));
+ expect(panelElement).toBeInTheDocument();
+ });
- test('mode week', async () => {
- const { container: container1 } = render();
- fireEvent.mouseDown(container1.querySelector('input'));
- const weekEle = await waitFor(() => document.querySelector('.t-date-picker__panel-week'));
- expect(weekEle).not.toBeNull();
- });
+ test('firstDayOfWeek', async () => {
+ const { container } = render();
+ fireEvent.mouseDown(container.querySelector('input'));
+ const weekElement = await waitFor(() => document.querySelector('.t-date-picker__table table thead tr th'));
+ expect(weekElement).toHaveTextContent('三');
+ });
- test('mode month', async () => {
- const { container } = render();
- fireEvent.mouseDown(container.querySelector('input'));
- const pickerTable = await waitFor(() => document.querySelector('tbody'));
- expect(pickerTable.firstChild.firstChild.firstChild).toHaveTextContent('1 月');
- });
+ test('inputProps', async () => {
+ const { container } = render();
+ const inputWrapElement = container.querySelector('.t-input__inner');
+ expect((inputWrapElement as HTMLInputElement).value).toEqual('test-inputProps');
+ });
- test('mode quarter', async () => {
- const { container } = render();
- fireEvent.mouseDown(container.querySelector('input'));
- const pickerTable = await waitFor(() => document.querySelector('.t-date-picker__table'));
- expect(pickerTable).toHaveTextContent('一季度');
- });
+ test('mode week', async () => {
+ const { container: container1 } = render();
+ fireEvent.mouseDown(container1.querySelector('input'));
+ const weekEle = await waitFor(() => document.querySelector('.t-date-picker__panel-week'));
+ expect(weekEle).not.toBeNull();
+ });
- test('mode year', async () => {
- const { container } = render();
- fireEvent.mouseDown(container.querySelector('input'));
- const weekEle = await waitFor(() => document.querySelector('.t-date-picker__panel-year'));
- expect(weekEle).not.toBeNull();
- });
+ test('mode month', async () => {
+ const { container } = render();
+ fireEvent.mouseDown(container.querySelector('input'));
+ const pickerTable = await waitFor(() => document.querySelector('tbody'));
+ expect(pickerTable.firstChild.firstChild.firstChild).toHaveTextContent('1 月');
+ });
- test('placeholder', () => {
- const wrapper = render();
- expect(wrapper.container.querySelector('input')?.placeholder).toEqual('请选择日期');
- });
+ test('mode quarter', async () => {
+ const { container } = render();
+ fireEvent.mouseDown(container.querySelector('input'));
+ const pickerTable = await waitFor(() => document.querySelector('.t-date-picker__table'));
+ expect(pickerTable).toHaveTextContent('一季度');
+ });
- test('popupProps', async () => {
- const { container } = render();
- fireEvent.mouseDown(container.querySelector('input'));
- const popupArrow = await waitFor(() => document.querySelector('.t-popup__arrow'));
- expect(popupArrow).toBeInTheDocument();
- });
+ test('mode year', async () => {
+ const { container } = render();
+ fireEvent.mouseDown(container.querySelector('input'));
+ const weekEle = await waitFor(() => document.querySelector('.t-date-picker__panel-year'));
+ expect(weekEle).not.toBeNull();
+ });
- test('prefixIcon suffixIcon', async () => {
- const { container } = render(} suffixIcon={} />);
- const iconBrowse = container.querySelector('.t-icon-browse');
- const lockOn = container.querySelector('.t-icon-lock-on');
+ test('placeholder', () => {
+ const wrapper = render();
+ expect(wrapper.container.querySelector('input')?.placeholder).toEqual('请选择日期');
+ });
- expect(iconBrowse).toBeInTheDocument();
- expect(lockOn).toBeInTheDocument();
- });
+ test('popupProps', async () => {
+ const { container } = render();
+ fireEvent.mouseDown(container.querySelector('input'));
+ const popupArrow = await waitFor(() => document.querySelector('.t-popup__arrow'));
+ expect(popupArrow).toBeInTheDocument();
+ });
- test('presets bottom top', async () => {
- const presets = {
- 昨天: dayjs().subtract(1, 'day').format('YYYY-MM-DD'),
- };
- const { container } = render();
- fireEvent.mouseDown(container.querySelector('input'));
- const table = await waitFor(() => document.querySelector('table'));
- fireEvent.mouseEnter(table);
- const pickerPresets = await waitFor(() => document.querySelector('.t-date-picker__presets'));
- expect(pickerPresets).toHaveTextContent('昨天');
- });
+ test('presets bottom top', async () => {
+ const presets = {
+ 昨天: dayjs().subtract(1, 'day').format('YYYY-MM-DD'),
+ };
+ const { container } = render();
+ fireEvent.mouseDown(container.querySelector('input'));
+ const table = await waitFor(() => document.querySelector('table'));
+ fireEvent.mouseEnter(table);
+ const pickerPresets = await waitFor(() => document.querySelector('.t-date-picker__presets'));
+ expect(pickerPresets).toHaveTextContent('昨天');
+ });
- test('status', async () => {
- const { container } = render();
- const tInput = container.querySelector('.t-input');
- expect(tInput.classList.contains('t-is-warning')).toBeTruthy();
- });
+ test('status', async () => {
+ const { container } = render();
+ const tInput = container.querySelector('.t-input');
+ expect(tInput.classList.contains('t-is-warning')).toBeTruthy();
+ });
- test('timePickerProps', async () => {
- const { container } = render();
- fireEvent.mouseDown(container.querySelector('input'));
- const panelElement = await waitFor(() => document.querySelector('.t-date-picker__panel-time .t-is-current'));
- expect(panelElement).toHaveTextContent('13');
- });
+ test('timePickerProps', async () => {
+ const { container } = render();
+ fireEvent.mouseDown(container.querySelector('input'));
+ const panelElement = await waitFor(() => document.querySelector('.t-date-picker__panel-time .t-is-current'));
+ expect(panelElement).toHaveTextContent('13');
+ });
- test('tips', async () => {
- const tips = 'test-tips';
- const { queryByText } = render();
- expect(queryByText(tips)).toBeInTheDocument();
- });
+ test('tips', async () => {
+ const tips = 'test-tips';
+ const { queryByText } = render();
+ expect(queryByText(tips)).toBeInTheDocument();
+ });
- test('label', async () => {
- const label = 'test-label';
- const { container } = render();
- const prefix = container.querySelector('.t-input__prefix');
- expect(prefix).toBeTruthy();
- expect(prefix).toHaveTextContent(label);
- });
+ test('disableTime', async () => {
+ const { container } = render(
+ ,
+ );
- test('onBlur onFocus', async () => {
- const blurFn = vi.fn();
- const focusFn = vi.fn();
+ fireEvent.mouseDown(container.querySelector('input'));
- const { container } = render();
- const InputDom = container.querySelector('.t-input__inner');
- fireEvent.focus(InputDom);
- expect(focusFn).toHaveBeenCalledTimes(1);
- fireEvent.blur(InputDom);
- expect(blurFn).toHaveBeenCalledTimes(1);
- });
+ await waitFor(() => {
+ expect(document.querySelector('.t-date-picker__cell--active')?.firstChild?.firstChild).toHaveTextContent('26');
+ expect(document.querySelectorAll('.t-time-picker__panel-body-scroll')[0].children).toHaveLength(17);
+ });
+ });
+ test('prefixIcon suffixIcon', async () => {
+ const { container } = render(} suffixIcon={} />);
+ const iconBrowse = container.querySelector('.t-icon-browse');
+ const lockOn = container.querySelector('.t-icon-lock-on');
- test('onChange onPick', async () => {
- const changeFn = vi.fn();
- const pickFn = vi.fn();
- const { container } = render();
- fireEvent.mouseDown(container.querySelector('input'));
+ expect(iconBrowse).toBeInTheDocument();
+ expect(lockOn).toBeInTheDocument();
+ });
- const firstDay = document.querySelector('.t-date-picker__cell--first-day-of-month');
- fireEvent.click(firstDay);
- expect(changeFn).toHaveBeenCalledTimes(1);
- expect(pickFn).toHaveBeenCalledTimes(1);
+ test('label', async () => {
+ const label = 'test-label';
+ const { container } = render();
+ const prefix = container.querySelector('.t-input__prefix');
+ expect(prefix).toBeTruthy();
+ expect(prefix).toHaveTextContent(label);
+ });
});
- test('onChange onPick', async () => {
- const changeFn = vi.fn();
- const pickFn = vi.fn();
- const { container } = render();
- fireEvent.mouseDown(container.querySelector('input'));
+ describe('events', () => {
+ test('onBlur onFocus', async () => {
+ const blurFn = vi.fn();
+ const focusFn = vi.fn();
- const firstDay = await waitFor(() => document.querySelector('.t-date-picker__cell--first-day-of-month'));
- fireEvent.click(firstDay);
- expect(changeFn).toHaveBeenCalledTimes(1);
- expect(pickFn).toHaveBeenCalledTimes(1);
- });
-
- test('onYearChange', async () => {
- const yearChangeFn = vi.fn();
- const { container } = render();
- fireEvent.mouseDown(container.querySelector('input'));
+ const { container } = render();
+ const InputDom = container.querySelector('.t-input__inner');
+ fireEvent.focus(InputDom);
+ expect(focusFn).toHaveBeenCalledTimes(1);
+ fireEvent.blur(InputDom);
+ expect(blurFn).toHaveBeenCalledTimes(1);
+ });
- const yearInput = await waitFor(() =>
- document.querySelector('.t-popup .t-date-picker__header-controller-year .t-input'),
- );
- fireEvent.click(yearInput);
+ test('onChange onPick', async () => {
+ const changeFn = vi.fn();
+ const pickFn = vi.fn();
+ const { container } = render();
+ fireEvent.mouseDown(container.querySelector('input'));
- const yearOptionNode = await waitFor(() => document.querySelector('.t-popup .t-select-option span[title="2021"]'));
+ const firstDay = document.querySelector('.t-date-picker__cell--first-day-of-month');
+ fireEvent.click(firstDay);
+ expect(changeFn).toHaveBeenCalledTimes(1);
+ expect(pickFn).toHaveBeenCalledTimes(1);
+ });
- fireEvent.click(yearOptionNode);
- expect(yearChangeFn).toHaveBeenCalledTimes(1);
- });
+ test('onChange onPick', async () => {
+ const changeFn = vi.fn();
+ const pickFn = vi.fn();
+ const { container } = render();
+ fireEvent.mouseDown(container.querySelector('input'));
- test('onMonthChange', async () => {
- const monthChangeFn = vi.fn();
- const { container } = render();
- fireEvent.mouseDown(container.querySelector('input'));
+ const firstDay = await waitFor(() => document.querySelector('.t-date-picker__cell--first-day-of-month'));
+ fireEvent.click(firstDay);
+ expect(changeFn).toHaveBeenCalledTimes(1);
+ expect(pickFn).toHaveBeenCalledTimes(1);
+ });
- // 先模拟点击某个过去的年份,保证不会在以后因为处于当前的年份和月份,导致 onMonthChange 事件不触发
- const yearInput = await waitFor(() =>
- document.querySelector('.t-popup .t-date-picker__header-controller-year .t-input'),
- );
- fireEvent.click(yearInput);
- const yearOptionNode = await waitFor(() => document.querySelector('.t-popup .t-select-option span[title="2021"]'));
- fireEvent.click(yearOptionNode);
+ test('onYearChange', async () => {
+ const yearChangeFn = vi.fn();
+ const { container } = render();
+ fireEvent.mouseDown(container.querySelector('input'));
- const monthInput = await waitFor(() =>
- document.querySelector('.t-popup .t-date-picker__header-controller-month .t-input'),
- );
- fireEvent.click(monthInput);
+ const yearInput = await waitFor(() =>
+ document.querySelector('.t-popup .t-date-picker__header-controller-year .t-input'),
+ );
+ fireEvent.click(yearInput);
- const monthOptionNode = await waitFor(() => document.querySelector('.t-popup .t-select-option span[title="1 月"]'));
+ const yearOptionNode = await waitFor(() =>
+ document.querySelector('.t-popup .t-select-option span[title="2021"]'),
+ );
- fireEvent.click(monthOptionNode);
- expect(monthChangeFn).toHaveBeenCalledTimes(1);
- });
+ fireEvent.click(yearOptionNode);
+ expect(yearChangeFn).toHaveBeenCalledTimes(1);
+ });
- test('panel select month and year', async () => {
- const { container } = render();
- fireEvent.mouseDown(container.querySelector('input'));
-
- const panelEle = await waitFor(() => document.querySelector('.t-date-picker__panel-date'));
-
- const monthPanel = panelEle.querySelector('.t-date-picker__header-controller-month .t-input');
- fireEvent.click(monthPanel);
- const monthPopup = await waitFor(() => document.querySelector('.t-select__list'));
- fireEvent.click(monthPopup.firstChild);
-
- const monthInput = await waitFor(() =>
- document.querySelector('.t-date-picker__header-controller-month .t-input__inner'),
- );
- expect((monthInput as HTMLInputElement).value).toEqual('1 月');
-
- const yearPanel = panelEle.querySelector('.t-date-picker__header-controller-year .t-input');
- fireEvent.click(yearPanel);
-
- const yearPopup = await waitFor(() =>
- document.querySelector('.t-date-picker__header-controller-year .t-select__list .t-is-selected'),
- );
- fireEvent.click(yearPopup.nextElementSibling);
- const yearInput = await waitFor(() =>
- document.querySelector('.t-date-picker__header-controller-year .t-input__inner'),
- );
- expect((yearInput as HTMLInputElement).value).toEqual('2023');
+ test('onMonthChange', async () => {
+ const monthChangeFn = vi.fn();
+ const { container } = render();
+ fireEvent.mouseDown(container.querySelector('input'));
+
+ // 先模拟点击某个过去的年份,保证不会在以后因为处于当前的年份和月份,导致 onMonthChange 事件不触发
+ const yearInput = await waitFor(() =>
+ document.querySelector('.t-popup .t-date-picker__header-controller-year .t-input'),
+ );
+ fireEvent.click(yearInput);
+ const yearOptionNode = await waitFor(() =>
+ document.querySelector('.t-popup .t-select-option span[title="2021"]'),
+ );
+ fireEvent.click(yearOptionNode);
+
+ const monthInput = await waitFor(() =>
+ document.querySelector('.t-popup .t-date-picker__header-controller-month .t-input'),
+ );
+ fireEvent.click(monthInput);
+
+ const monthOptionNode = await waitFor(() =>
+ document.querySelector('.t-popup .t-select-option span[title="1 月"]'),
+ );
+
+ fireEvent.click(monthOptionNode);
+ expect(monthChangeFn).toHaveBeenCalledTimes(1);
+ });
});
- test('panel select year, popup scroll', async () => {
- const { container } = render();
- fireEvent.mouseDown(container.querySelector('input'));
+ describe('scenarios', () => {
+ test('defaultValue value format', async () => {
+ const { container: container1 } = render();
+ const inputElement1 = container1.querySelector('.t-input__inner');
+ expect((inputElement1 as HTMLInputElement).value).toEqual('2022-09-14');
- const panelEle = await waitFor(() => document.querySelector('.t-date-picker__panel-date'));
- const yearPanel = panelEle.querySelector('.t-date-picker__header-controller-year .t-input');
- fireEvent.click(yearPanel);
- const popupContent = panelEle.querySelector('.t-date-picker__header-controller-year-popup .t-popup__content');
- fireEvent.scroll(popupContent, { target: { scrollY: 100, scrollTop: 0 } });
- });
+ const { container: container2 } = render();
+ const inputElement2 = container2.querySelector('.t-input__inner');
+ expect((inputElement2 as HTMLInputElement).value).toEqual('2022-09-14');
+ });
- test('pure trigger onChange onPick', async () => {
- const defaultValue = '2022-09-14 20:08:08';
- const { container } = render(
- ,
- );
- const inputEle = container.querySelector('.t-input__inner');
- fireEvent.change(inputEle, { target: { value: '2022-09-16 20:08:08' } });
- expect((inputEle as HTMLInputElement).value).toEqual('2022-09-16 20:08:08');
- });
+ test('panel select month and year', async () => {
+ const { container } = render();
+ fireEvent.mouseDown(container.querySelector('input'));
+
+ const panelEle = await waitFor(() => document.querySelector('.t-date-picker__panel-date'));
+
+ const monthPanel = panelEle.querySelector('.t-date-picker__header-controller-month .t-input');
+ fireEvent.click(monthPanel);
+ const monthPopup = await waitFor(() => document.querySelector('.t-select__list'));
+ fireEvent.click(monthPopup.firstChild);
+
+ const monthInput = await waitFor(() =>
+ document.querySelector('.t-date-picker__header-controller-month .t-input__inner'),
+ );
+ expect((monthInput as HTMLInputElement).value).toEqual('1 月');
+
+ const yearPanel = panelEle.querySelector('.t-date-picker__header-controller-year .t-input');
+ fireEvent.click(yearPanel);
+
+ const yearPopup = await waitFor(() =>
+ document.querySelector('.t-date-picker__header-controller-year .t-select__list .t-is-selected'),
+ );
+ fireEvent.click(yearPopup.nextElementSibling);
+ const yearInput = await waitFor(() =>
+ document.querySelector('.t-date-picker__header-controller-year .t-input__inner'),
+ );
+ expect((yearInput as HTMLInputElement).value).toEqual('2023');
+ });
- test('cell handleMouseEnter', async () => {
- const { container, getByText } = render();
- const inputEle = container.querySelector('.t-input__inner') as HTMLInputElement;
- fireEvent.mouseDown(inputEle);
+ test('panel select year, popup scroll', async () => {
+ const { container } = render();
+ fireEvent.mouseDown(container.querySelector('input'));
+
+ const panelEle = await waitFor(() => document.querySelector('.t-date-picker__panel-date'));
+ const yearPanel = panelEle.querySelector('.t-date-picker__header-controller-year .t-input');
+ fireEvent.click(yearPanel);
+ const popupContent = panelEle.querySelector('.t-date-picker__header-controller-year-popup .t-popup__content');
+ fireEvent.scroll(popupContent, {
+ target: { scrollY: 100, scrollTop: 0 },
+ });
+ });
- const cellBtn = getByText('25');
- fireEvent.mouseEnter(cellBtn);
- expect(inputEle.value).toEqual('2022-08-25');
- fireEvent.mouseLeave(cellBtn);
- expect(inputEle.value).not.toEqual('2022-08-25');
- });
+ test('pure trigger onChange onPick', async () => {
+ const defaultValue = '2022-09-14 20:08:08';
+ const { container } = render(
+ ,
+ );
+ const inputEle = container.querySelector('.t-input__inner');
+ fireEvent.change(inputEle, { target: { value: '2022-09-16 20:08:08' } });
+ expect((inputEle as HTMLInputElement).value).toEqual('2022-09-16 20:08:08');
+ });
- test('cell handleClick', async () => {
- const { container, getByText } = render();
- const inputEle = container.querySelector('.t-input__inner') as HTMLInputElement;
- fireEvent.mouseDown(inputEle);
+ test('cell handleMouseEnter', async () => {
+ const { container, getByText } = render();
+ const inputEle = container.querySelector('.t-input__inner') as HTMLInputElement;
+ fireEvent.mouseDown(inputEle);
- const cellBtn = getByText('25');
- fireEvent.click(cellBtn);
- expect(inputEle.value).toEqual('2022-08-25');
- });
-
- test('onJumperClick', async () => {
- const { container, getByText } = render();
- const inputEle = container.querySelector('.t-input__inner') as HTMLInputElement;
- fireEvent.mouseDown(inputEle);
+ const cellBtn = getByText('25');
+ fireEvent.mouseEnter(cellBtn);
+ expect(inputEle.value).toEqual('2022-08-25');
+ fireEvent.mouseLeave(cellBtn);
+ expect(inputEle.value).not.toEqual('2022-08-25');
+ });
- const jumperPrev = await waitFor(() => document.querySelector('.t-pagination-mini__prev'));
- fireEvent.click(jumperPrev);
- const cellBtn = getByText('25');
- fireEvent.click(cellBtn);
- expect(inputEle.value).toEqual('2022-07-25');
- });
+ test('cell handleClick', async () => {
+ const { container, getByText } = render();
+ const inputEle = container.querySelector('.t-input__inner') as HTMLInputElement;
+ fireEvent.mouseDown(inputEle);
- test('onTimePickerChange & onConfirmClick', async () => {
- const { container, getByText } = render();
- fireEvent.mouseDown(container.querySelector('input'));
+ const cellBtn = getByText('25');
+ fireEvent.click(cellBtn);
+ expect(inputEle.value).toEqual('2022-08-25');
+ });
- const timePickerItem = await waitFor(() => document.querySelector('.t-time-picker__panel-body-scroll-item'));
- fireEvent.click(timePickerItem);
- const confirmBtn = getByText('确定');
- fireEvent.click(confirmBtn);
- });
+ test('onJumperClick', async () => {
+ const { container, getByText } = render();
+ const inputEle = container.querySelector('.t-input__inner') as HTMLInputElement;
+ fireEvent.mouseDown(inputEle);
- test('onPresetClick', async () => {
- const { container, getByText } = render();
- const inputEle = container.querySelector('.t-date-picker .t-input__inner');
- fireEvent.mouseDown(inputEle);
+ const jumperPrev = await waitFor(() => document.querySelector('.t-pagination-mini__prev'));
+ fireEvent.click(jumperPrev);
+ const cellBtn = getByText('25');
+ fireEvent.click(cellBtn);
+ expect(inputEle.value).toEqual('2022-07-25');
+ });
- const christmasBtn = await waitFor(() => getByText('圣诞节'));
- fireEvent.click(christmasBtn);
- expect((inputEle as HTMLInputElement).value).toEqual('2023-12-25');
- });
+ test('onTimePickerChange & onConfirmClick', async () => {
+ const { container, getByText } = render();
+ fireEvent.mouseDown(container.querySelector('input'));
- test('disableTime', async () => {
- const { container } = render();
+ const timePickerItem = await waitFor(() => document.querySelector('.t-time-picker__panel-body-scroll-item'));
+ fireEvent.click(timePickerItem);
+ const confirmBtn = getByText('确定');
+ fireEvent.click(confirmBtn);
+ });
- fireEvent.mouseDown(container.querySelector('input'));
+ test('onPresetClick', async () => {
+ const { container, getByText } = render();
+ const inputEle = container.querySelector('.t-date-picker .t-input__inner');
+ fireEvent.mouseDown(inputEle);
- await waitFor(() => {
- expect(document.querySelector('.t-date-picker__cell--active')?.firstChild?.firstChild).toHaveTextContent('26');
- expect(document.querySelectorAll('.t-time-picker__panel-body-scroll')[0].children).toHaveLength(17);
+ const christmasBtn = await waitFor(() => getByText('圣诞节'));
+ fireEvent.click(christmasBtn);
+ expect((inputEle as HTMLInputElement).value).toEqual('2023-12-25');
});
});
});
diff --git a/packages/components/date-picker/__tests__/date-range-picker-panel.test.tsx b/packages/components/date-picker/__tests__/date-range-picker-panel.test.tsx
index 27fe63441d..5afcbcb3c0 100644
--- a/packages/components/date-picker/__tests__/date-range-picker-panel.test.tsx
+++ b/packages/components/date-picker/__tests__/date-range-picker-panel.test.tsx
@@ -14,218 +14,226 @@ describe('DateRangePickerPanel', () => {
vi.useRealTimers();
});
- test('value props', async () => {
- const { container } = render();
- expect(container.querySelector('.t-date-picker__cell--active')).toBeInTheDocument();
- expect(container.querySelector('.t-date-picker__cell--active').firstChild).toHaveTextContent('14');
-
- const { container: container2 } = render();
- expect(container2.querySelector('.t-date-picker__cell--active')).toBeInTheDocument();
- expect(container2.querySelector('.t-date-picker__cell--active').firstChild).toHaveTextContent('12');
- });
-
- test('disableDate props', async () => {
- const { container: container1 } = render(
- ,
- );
- expect(container1.querySelector('.t-date-picker__cell--disabled')).toBeInTheDocument();
- expect(container1.querySelector('.t-date-picker__cell--disabled').firstChild).toHaveTextContent('30');
-
- const { container: container2 } = render(
- ,
- );
- expect(container2.querySelector('.t-date-picker__cell--disabled')).toBeInTheDocument();
- expect(container2.querySelector('.t-date-picker__cell--disabled').firstChild).toHaveTextContent('2');
-
- const { container: container3 } = render(
- ,
- );
- expect(container3.querySelector('.t-date-picker__cell--disabled')).toBeInTheDocument();
- expect(container3.querySelector('.t-date-picker__cell--disabled').firstChild).toHaveTextContent('28');
- });
-
- test('enableTimePicker props', async () => {
- const { container } = render();
- expect(container.querySelector('.t-time-picker__panel')).toBeInTheDocument();
- });
-
- test('firstDayOfWeek props', async () => {
- const { container } = render();
- expect(container.querySelector('.t-date-picker__table table thead tr').firstChild).toHaveTextContent('二');
- });
-
- test('format props', async () => {
- const { container } = render(
- ,
- );
- expect(container.querySelector('.t-date-picker__cell--active').firstChild).toHaveTextContent('2');
- });
-
- test('mode props', async () => {
- const { container: container1 } = render(
- ,
- );
- expect(container1.querySelector('.t-date-picker__cell--active').firstChild).toHaveTextContent('3');
-
- const { container: container2 } = render(
- ,
- );
- expect(container2.querySelector('.t-date-picker__table-week-row--active')).toBeInTheDocument();
- expect(container2.querySelector('.t-date-picker__table-week-row--active td').firstChild).toHaveTextContent('36');
-
- const { container: container3 } = render(
- ,
- );
- expect(container3.querySelector('.t-date-picker__cell--active').firstChild).toHaveTextContent('11 月');
-
- const { container: container4 } = render();
- expect(container4.querySelector('.t-date-picker__cell--active').firstChild).toHaveTextContent('2024');
-
- // const { container: container5 } = render();
- // expect(container5.querySelector('.t-date-picker__cell--active')).toHaveTextContent('二季度');
- });
-
- test('presets props', async () => {
- const { container } = render();
- expect(container.querySelector('.t-date-picker__presets')).toBeInTheDocument();
- expect(container.querySelector('.t-date-picker__presets').firstChild.firstChild).toHaveTextContent('今天');
- });
-
- test('presets、presetsPlacement props', async () => {
- const { container } = render(
- ,
- );
- expect(container.querySelector('.t-date-picker__presets')).toBeInTheDocument();
- expect(container.querySelector('.t-date-picker__presets').firstChild.firstChild).toHaveTextContent('今天');
- expect(container.querySelector('.t-date-picker__presets').parentNode).toHaveClass('t-date-picker__footer--left');
- });
-
- test('cell handleClick', async () => {
- const fn = vi.fn();
- const { container } = render();
-
- fireEvent.click(container.querySelector('.t-date-picker__cell'));
- fireEvent.click(container.querySelector('.t-date-picker__cell'));
- expect(fn).toHaveBeenCalledTimes(1);
- });
-
- test('onJumperClick', async () => {
- const fn = vi.fn();
- const { container } = render();
-
- const jumperPrev = container.querySelector('.t-pagination-mini__prev');
- fireEvent.click(jumperPrev);
- expect(fn).toHaveBeenCalledTimes(1);
- });
-
- test('onTimePickerChange & onConfirmClick', async () => {
- const { container, getByText } = render();
-
- expect(container.querySelector('.t-date-picker__panel-time')).toBeTruthy();
- expect(getByText('确定')).toBeTruthy();
- });
-
- test('onPresetClick', async () => {
- const fn = vi.fn();
- const { getByText } = render(
- ,
- );
-
- const christmasBtn = getByText('圣诞节');
- fireEvent.click(christmasBtn);
- expect(fn).toHaveBeenCalledTimes(1);
- });
-
- test('onYearChange & onMonthChange', async () => {
- const { container } = render();
-
- const yearSelect = container.querySelector('.t-date-picker__header-controller-year');
- fireEvent.click(yearSelect);
- const monthSelect = container.querySelector('.t-date-picker__header-controller-month');
- fireEvent.click(monthSelect);
- });
-
- test('cell handleMouseEnter', async () => {
- const { container } = render();
- const inputEle = container.querySelector('.t-input__inner');
- fireEvent.mouseDown(inputEle);
-
- fireEvent.mouseEnter(document.querySelector('.t-date-picker__cell-inner'));
- fireEvent.mouseLeave(document.querySelector('.t-date-picker__cell-inner'));
- });
-
- test('cell handleClick', async () => {
- const { container } = render();
- const inputEle = container.querySelector('.t-input__inner');
- fireEvent.mouseDown(inputEle);
-
- fireEvent.click(document.querySelector('.t-date-picker__cell-inner'));
- fireEvent.click(document.querySelector('.t-date-picker__cell-inner'));
- });
-
- test('onJumperClick', async () => {
- const { container } = render();
- const inputEle = container.querySelector('.t-input__inner');
- fireEvent.mouseDown(inputEle);
-
- const jumperPrev = await waitFor(() => document.querySelector('.t-pagination-mini__prev'));
- fireEvent.click(jumperPrev);
- const jumperNext = await waitFor(() => document.querySelector('.t-pagination-mini__next'));
- fireEvent.click(jumperNext);
- const jumperCurrent = await waitFor(() => document.querySelector('.t-pagination-mini__current'));
- fireEvent.click(jumperCurrent);
- });
-
- test('onTimePickerChange & onConfirmClick', async () => {
- const { container, getByText } = render();
- fireEvent.mouseDown(container.querySelector('input'));
-
- const timePickerItem = await waitFor(() => document.querySelector('.t-time-picker__panel-body-scroll-item'));
- fireEvent.click(timePickerItem);
- const confirmBtn = getByText('确定');
- fireEvent.click(confirmBtn);
- });
-
- test('onPresetClick', async () => {
- const { container, getByText } = render(
- ,
- );
- const inputEle = container.querySelector('.t-input__inner');
- fireEvent.mouseDown(inputEle);
-
- const christmasBtn = await waitFor(() => getByText('圣诞节'));
- expect(christmasBtn).toBeTruthy();
- fireEvent.click(christmasBtn);
- });
-
- test('onYearChange', async () => {
- const { container } = render();
- const inputEle = container.querySelector('.t-input__inner');
- fireEvent.mouseDown(inputEle);
-
- const yearSelect = await waitFor(() => document.querySelector('.t-date-picker__header-controller-year'));
- fireEvent.click(yearSelect);
-
- const monthSelect = await waitFor(() => document.querySelector('.t-date-picker__header-controller-month'));
- fireEvent.click(monthSelect);
+ describe('props', () => {
+ test('value props', async () => {
+ const { container } = render();
+ expect(container.querySelector('.t-date-picker__cell--active')).toBeInTheDocument();
+ expect(container.querySelector('.t-date-picker__cell--active').firstChild).toHaveTextContent('14');
+
+ const { container: container2 } = render();
+ expect(container2.querySelector('.t-date-picker__cell--active')).toBeInTheDocument();
+ expect(container2.querySelector('.t-date-picker__cell--active').firstChild).toHaveTextContent('12');
+ });
+
+ test('disableDate props', async () => {
+ const { container: container1 } = render(
+ ,
+ );
+ expect(container1.querySelector('.t-date-picker__cell--disabled')).toBeInTheDocument();
+ expect(container1.querySelector('.t-date-picker__cell--disabled').firstChild).toHaveTextContent('30');
+
+ const { container: container2 } = render(
+ ,
+ );
+ expect(container2.querySelector('.t-date-picker__cell--disabled')).toBeInTheDocument();
+ expect(container2.querySelector('.t-date-picker__cell--disabled').firstChild).toHaveTextContent('2');
+
+ const { container: container3 } = render(
+ ,
+ );
+ expect(container3.querySelector('.t-date-picker__cell--disabled')).toBeInTheDocument();
+ expect(container3.querySelector('.t-date-picker__cell--disabled').firstChild).toHaveTextContent('28');
+ });
+
+ test('enableTimePicker props', async () => {
+ const { container } = render();
+ expect(container.querySelector('.t-time-picker__panel')).toBeInTheDocument();
+ });
+
+ test('firstDayOfWeek props', async () => {
+ const { container } = render();
+ expect(container.querySelector('.t-date-picker__table table thead tr').firstChild).toHaveTextContent('二');
+ });
+
+ test('format props', async () => {
+ const { container } = render(
+ ,
+ );
+ expect(container.querySelector('.t-date-picker__cell--active').firstChild).toHaveTextContent('2');
+ });
+
+ test('mode props', async () => {
+ const { container: container1 } = render(
+ ,
+ );
+ expect(container1.querySelector('.t-date-picker__cell--active').firstChild).toHaveTextContent('3');
+
+ const { container: container2 } = render(
+ ,
+ );
+ expect(container2.querySelector('.t-date-picker__table-week-row--active')).toBeInTheDocument();
+ expect(container2.querySelector('.t-date-picker__table-week-row--active td').firstChild).toHaveTextContent('36');
+
+ const { container: container3 } = render(
+ ,
+ );
+ expect(container3.querySelector('.t-date-picker__cell--active').firstChild).toHaveTextContent('11 月');
+
+ const { container: container4 } = render();
+ expect(container4.querySelector('.t-date-picker__cell--active').firstChild).toHaveTextContent('2024');
+
+ // const { container: container5 } = render();
+ // expect(container5.querySelector('.t-date-picker__cell--active')).toHaveTextContent('二季度');
+ });
+
+ test('presets props', async () => {
+ const { container } = render();
+ expect(container.querySelector('.t-date-picker__presets')).toBeInTheDocument();
+ expect(container.querySelector('.t-date-picker__presets').firstChild.firstChild).toHaveTextContent('今天');
+ });
+ });
+
+ describe('events', () => {
+ test('cell handleClick', async () => {
+ const fn = vi.fn();
+ const { container } = render();
+
+ fireEvent.click(container.querySelector('.t-date-picker__cell'));
+ fireEvent.click(container.querySelector('.t-date-picker__cell'));
+ expect(fn).toHaveBeenCalledTimes(1);
+ });
+
+ test('onJumperClick', async () => {
+ const fn = vi.fn();
+ const { container } = render();
+
+ const jumperPrev = container.querySelector('.t-pagination-mini__prev');
+ fireEvent.click(jumperPrev);
+ expect(fn).toHaveBeenCalledTimes(1);
+ });
+
+ test('onPresetClick', async () => {
+ const fn = vi.fn();
+ const { getByText } = render(
+ ,
+ );
+
+ const christmasBtn = getByText('圣诞节');
+ fireEvent.click(christmasBtn);
+ expect(fn).toHaveBeenCalledTimes(1);
+ });
+ });
+
+ describe('scenarios', () => {
+ test('presets、presetsPlacement props', async () => {
+ const { container } = render(
+ ,
+ );
+ expect(container.querySelector('.t-date-picker__presets')).toBeInTheDocument();
+ expect(container.querySelector('.t-date-picker__presets').firstChild.firstChild).toHaveTextContent('今天');
+ expect(container.querySelector('.t-date-picker__presets').parentNode).toHaveClass('t-date-picker__footer--left');
+ });
+
+ test('onTimePickerChange & onConfirmClick', async () => {
+ const { container, getByText } = render();
+
+ expect(container.querySelector('.t-date-picker__panel-time')).toBeTruthy();
+ expect(getByText('确定')).toBeTruthy();
+ });
+
+ test('onYearChange & onMonthChange', async () => {
+ const { container } = render();
+
+ const yearSelect = container.querySelector('.t-date-picker__header-controller-year');
+ fireEvent.click(yearSelect);
+ const monthSelect = container.querySelector('.t-date-picker__header-controller-month');
+ fireEvent.click(monthSelect);
+ });
+
+ test('cell handleMouseEnter', async () => {
+ const { container } = render();
+ const inputEle = container.querySelector('.t-input__inner');
+ fireEvent.mouseDown(inputEle);
+
+ fireEvent.mouseEnter(document.querySelector('.t-date-picker__cell-inner'));
+ fireEvent.mouseLeave(document.querySelector('.t-date-picker__cell-inner'));
+ });
+
+ test('cell handleClick', async () => {
+ const { container } = render();
+ const inputEle = container.querySelector('.t-input__inner');
+ fireEvent.mouseDown(inputEle);
+
+ fireEvent.click(document.querySelector('.t-date-picker__cell-inner'));
+ fireEvent.click(document.querySelector('.t-date-picker__cell-inner'));
+ });
+
+ test('onJumperClick', async () => {
+ const { container } = render();
+ const inputEle = container.querySelector('.t-input__inner');
+ fireEvent.mouseDown(inputEle);
+
+ const jumperPrev = await waitFor(() => document.querySelector('.t-pagination-mini__prev'));
+ fireEvent.click(jumperPrev);
+ const jumperNext = await waitFor(() => document.querySelector('.t-pagination-mini__next'));
+ fireEvent.click(jumperNext);
+ const jumperCurrent = await waitFor(() => document.querySelector('.t-pagination-mini__current'));
+ fireEvent.click(jumperCurrent);
+ });
+
+ test('onTimePickerChange & onConfirmClick', async () => {
+ const { container, getByText } = render();
+ fireEvent.mouseDown(container.querySelector('input'));
+
+ const timePickerItem = await waitFor(() => document.querySelector('.t-time-picker__panel-body-scroll-item'));
+ fireEvent.click(timePickerItem);
+ const confirmBtn = getByText('确定');
+ fireEvent.click(confirmBtn);
+ });
+
+ test('onPresetClick', async () => {
+ const { container, getByText } = render(
+ ,
+ );
+ const inputEle = container.querySelector('.t-input__inner');
+ fireEvent.mouseDown(inputEle);
+
+ const christmasBtn = await waitFor(() => getByText('圣诞节'));
+ expect(christmasBtn).toBeTruthy();
+ fireEvent.click(christmasBtn);
+ });
+
+ test('onYearChange', async () => {
+ const { container } = render();
+ const inputEle = container.querySelector('.t-input__inner');
+ fireEvent.mouseDown(inputEle);
+
+ const yearSelect = await waitFor(() => document.querySelector('.t-date-picker__header-controller-year'));
+ fireEvent.click(yearSelect);
+
+ const monthSelect = await waitFor(() => document.querySelector('.t-date-picker__header-controller-month'));
+ fireEvent.click(monthSelect);
+ });
});
});
diff --git a/packages/components/date-picker/__tests__/date-range-picker.test.tsx b/packages/components/date-picker/__tests__/date-range-picker.test.tsx
index cfa6775ef1..7dc3d945eb 100644
--- a/packages/components/date-picker/__tests__/date-range-picker.test.tsx
+++ b/packages/components/date-picker/__tests__/date-range-picker.test.tsx
@@ -16,277 +16,282 @@ describe('DateRangePicker', () => {
vi.useRealTimers();
});
- it('clearable', async () => {
- const { container } = render();
- // 模拟鼠标进入
- fireEvent.mouseEnter(container.querySelector('input'));
-
- const clearElement = document.querySelector('.t-range-input__suffix-clear');
- expect(clearElement).not.toBeNull();
- });
-
- it('disabled', () => {
- const { container } = render();
- const inputElement = container.querySelector('.t-input__inner');
- expect((inputElement as HTMLInputElement).disabled).toBe(true);
- });
+ describe('props', () => {
+ it('clearable', async () => {
+ const { container } = render();
+ // 模拟鼠标进入
+ fireEvent.mouseEnter(container.querySelector('input'));
+
+ const clearElement = document.querySelector('.t-range-input__suffix-clear');
+ expect(clearElement).not.toBeNull();
+ });
- it('enableTimePicker', async () => {
- const { container } = render();
- act(() => {
- fireEvent.mouseDown(container.querySelector('input'));
- vi.runAllTimers();
+ it('disabled', () => {
+ const { container } = render();
+ const inputElement = container.querySelector('.t-input__inner');
+ expect((inputElement as HTMLInputElement).disabled).toBe(true);
});
- const panelElement = document.querySelector('.t-date-picker__panel-time');
- expect(panelElement).toBeInTheDocument();
- });
- it('firstDayOfWeek', async () => {
- const { container } = render();
- act(() => {
- fireEvent.mouseDown(container.querySelector('input'));
- vi.runAllTimers();
+ it('enableTimePicker', async () => {
+ const { container } = render();
+ act(() => {
+ fireEvent.mouseDown(container.querySelector('input'));
+ vi.runAllTimers();
+ });
+ const panelElement = document.querySelector('.t-date-picker__panel-time');
+ expect(panelElement).toBeInTheDocument();
});
- const weekElement = document.querySelector('.t-date-picker__table table thead tr th');
- expect(weekElement).toHaveTextContent('三');
- });
- it('defaultValue value format', async () => {
- const { container: container1 } = render(
- ,
- );
- const inputElement1 = container1.querySelector('.t-input__inner');
- expect((inputElement1 as HTMLInputElement).value).toEqual('2022-09-14');
+ it('firstDayOfWeek', async () => {
+ const { container } = render();
+ act(() => {
+ fireEvent.mouseDown(container.querySelector('input'));
+ vi.runAllTimers();
+ });
+ const weekElement = document.querySelector('.t-date-picker__table table thead tr th');
+ expect(weekElement).toHaveTextContent('三');
+ });
- const { container: container2 } = render();
- const inputElement2 = container2.querySelector('.t-input__inner');
- expect((inputElement2 as HTMLInputElement).value).toEqual('2022-09-14');
- });
+ it('mode', async () => {
+ const { container } = render();
+ act(() => {
+ fireEvent.mouseDown(container.querySelector('input'));
+ vi.runAllTimers();
+ });
+ const pickerTable = document.querySelector('.t-date-picker__table');
+ expect(pickerTable).toHaveTextContent('一季度');
+ });
- it('mode', async () => {
- const { container } = render();
- act(() => {
- fireEvent.mouseDown(container.querySelector('input'));
- vi.runAllTimers();
+ it('mode', async () => {
+ const { container } = render();
+ act(() => {
+ fireEvent.mouseDown(container.querySelector('input'));
+ vi.runAllTimers();
+ });
+ const weekEle = document.querySelector('.t-date-picker__panel-week');
+ expect(weekEle).not.toBeNull();
});
- const pickerTable = document.querySelector('.t-date-picker__table');
- expect(pickerTable).toHaveTextContent('一季度');
- });
- it('mode', async () => {
- const { container } = render();
- act(() => {
- fireEvent.mouseDown(container.querySelector('input'));
- vi.runAllTimers();
+ it('placeholder', () => {
+ const wrapper = render();
+ expect(wrapper.container.querySelector('input')?.placeholder).toEqual('请选择日期');
});
- const weekEle = document.querySelector('.t-date-picker__panel-week');
- expect(weekEle).not.toBeNull();
- });
- it('placeholder', () => {
- const wrapper = render();
- expect(wrapper.container.querySelector('input')?.placeholder).toEqual('请选择日期');
- });
+ it('popupProps', async () => {
+ const { container } = render();
+ act(() => {
+ fireEvent.mouseDown(container.querySelector('input'));
+ vi.runAllTimers();
+ });
+ const popupArrow = document.querySelector('.t-popup__arrow');
+ expect(popupArrow).toBeInTheDocument();
+ });
- it('popupProps', async () => {
- const { container } = render();
- act(() => {
- fireEvent.mouseDown(container.querySelector('input'));
- vi.runAllTimers();
+ it('presets', async () => {
+ const { container } = render();
+ act(() => {
+ fireEvent.mouseDown(container.querySelector('input'));
+ vi.runAllTimers();
+ });
+ const pickerPresets = document.querySelector('.t-date-picker__presets');
+ expect(pickerPresets).toHaveTextContent('特定日期范围');
});
- const popupArrow = document.querySelector('.t-popup__arrow');
- expect(popupArrow).toBeInTheDocument();
- });
- it('prefixIcon suffixIcon', async () => {
- const { container } = render(} suffixIcon={} />);
- const iconBrowse = container.querySelector('.t-icon-browse');
- const lockOn = container.querySelector('.t-icon-lock-on');
+ it('inputProps', async () => {
+ const { container } = render(
+ ,
+ );
+ const inputWrapElement = container.querySelector('.t-input__inner');
+ expect((inputWrapElement as HTMLInputElement).value).toEqual('test-inputProps');
+ });
- expect(iconBrowse).toBeInTheDocument();
- expect(lockOn).toBeInTheDocument();
- });
+ it('separator', async () => {
+ const { container } = render();
+ const inputWrapElement = container.querySelector('.t-range-input__inner-separator');
+ expect(inputWrapElement).toHaveTextContent('#');
+ });
- it('presets', async () => {
- const { container } = render();
- act(() => {
- fireEvent.mouseDown(container.querySelector('input'));
- vi.runAllTimers();
+ it('status', async () => {
+ const { container } = render();
+ const tInput = container.querySelector('.t-range-input');
+ expect(tInput.classList.contains('t-is-warning')).toBeTruthy();
});
- const pickerPresets = document.querySelector('.t-date-picker__presets');
- expect(pickerPresets).toHaveTextContent('特定日期范围');
- });
- it('inputProps', async () => {
- const { container } = render(
- ,
- );
- const inputWrapElement = container.querySelector('.t-input__inner');
- expect((inputWrapElement as HTMLInputElement).value).toEqual('test-inputProps');
- });
+ it('timePickerProps', async () => {
+ const { container } = render();
+ act(() => {
+ fireEvent.mouseDown(container.querySelector('input'));
+ vi.runAllTimers();
+ });
+ const panelElement = document.querySelector('.t-date-picker__panel-time .t-is-current');
+ expect(panelElement).toHaveTextContent('13');
+ });
- it('separator', async () => {
- const { container } = render();
- const inputWrapElement = container.querySelector('.t-range-input__inner-separator');
- expect(inputWrapElement).toHaveTextContent('#');
- });
+ it('tips', async () => {
+ const tips = 'test-tips';
+ const { queryByText } = render();
+ expect(queryByText(tips)).toBeInTheDocument();
+ });
+ it('prefixIcon suffixIcon', async () => {
+ const { container } = render(} suffixIcon={} />);
+ const iconBrowse = container.querySelector('.t-icon-browse');
+ const lockOn = container.querySelector('.t-icon-lock-on');
- it('status', async () => {
- const { container } = render();
- const tInput = container.querySelector('.t-range-input');
- expect(tInput.classList.contains('t-is-warning')).toBeTruthy();
- });
+ expect(iconBrowse).toBeInTheDocument();
+ expect(lockOn).toBeInTheDocument();
+ });
- it('timePickerProps', async () => {
- const { container } = render();
- act(() => {
- fireEvent.mouseDown(container.querySelector('input'));
- vi.runAllTimers();
+ it('label', async () => {
+ const label = 'test-label';
+ const { container } = render();
+ const prefix = container.querySelector('.t-input__prefix');
+ expect(prefix).toBeTruthy();
+ expect(prefix).toHaveTextContent(label);
});
- const panelElement = document.querySelector('.t-date-picker__panel-time .t-is-current');
- expect(panelElement).toHaveTextContent('13');
});
- it('tips', async () => {
- const tips = 'test-tips';
- const { queryByText } = render();
- expect(queryByText(tips)).toBeInTheDocument();
- });
+ describe('events', () => {
+ it('onBlur onFocus', async () => {
+ const blurFn = vi.fn();
+ const focusFn = vi.fn();
+
+ const { container } = render();
+ const InputDom = container.querySelector('.t-input__inner');
+ fireEvent.focus(InputDom);
+ expect(focusFn).toHaveBeenCalledTimes(1);
+ fireEvent.blur(InputDom);
+ expect(blurFn).toHaveBeenCalledTimes(1);
+ });
- it('label', async () => {
- const label = 'test-label';
- const { container } = render();
- const prefix = container.querySelector('.t-input__prefix');
- expect(prefix).toBeTruthy();
- expect(prefix).toHaveTextContent(label);
- });
+ it('onChange onPick onInput', async () => {
+ const changeFn = vi.fn();
+ const pickFn = vi.fn();
+ const { container } = render(
+ ,
+ );
+ fireEvent.mouseDown(container.querySelector('input'));
- it('onBlur onFocus', async () => {
- const blurFn = vi.fn();
- const focusFn = vi.fn();
+ const firstTBody = document.querySelector('tbody');
+ fireEvent.click(firstTBody.firstChild.firstChild.firstChild);
+ fireEvent.click(firstTBody.firstChild.firstChild.firstChild);
- const { container } = render();
- const InputDom = container.querySelector('.t-input__inner');
- fireEvent.focus(InputDom);
- expect(focusFn).toHaveBeenCalledTimes(1);
- fireEvent.blur(InputDom);
- expect(blurFn).toHaveBeenCalledTimes(1);
+ expect(changeFn).toHaveBeenCalledTimes(2);
+ expect(pickFn).toHaveBeenCalledTimes(2);
+ });
});
- it('onChange onPick onInput', async () => {
- const changeFn = vi.fn();
- const pickFn = vi.fn();
- const { container } = render(
- ,
- );
- fireEvent.mouseDown(container.querySelector('input'));
-
- const firstTBody = document.querySelector('tbody');
- fireEvent.click(firstTBody.firstChild.firstChild.firstChild);
- fireEvent.click(firstTBody.firstChild.firstChild.firstChild);
-
- expect(changeFn).toHaveBeenCalledTimes(2);
- expect(pickFn).toHaveBeenCalledTimes(2);
- });
+ describe('scenarios', () => {
+ it('defaultValue value format', async () => {
+ const { container: container1 } = render(
+ ,
+ );
+ const inputElement1 = container1.querySelector('.t-input__inner');
+ expect((inputElement1 as HTMLInputElement).value).toEqual('2022-09-14');
+
+ const { container: container2 } = render();
+ const inputElement2 = container2.querySelector('.t-input__inner');
+ expect((inputElement2 as HTMLInputElement).value).toEqual('2022-09-14');
+ });
- it('panel select month and year', async () => {
- const { container } = render();
- fireEvent.mouseDown(container.querySelector('input'));
+ it('panel select month and year', async () => {
+ const { container } = render();
+ fireEvent.mouseDown(container.querySelector('input'));
- const panelEle = document.querySelector('.t-date-picker__panel-date');
+ const panelEle = document.querySelector('.t-date-picker__panel-date');
- const monthPanel = panelEle.querySelector('.t-date-picker__header-controller-month .t-input');
- fireEvent.click(monthPanel);
- const monthPopup = document.querySelector('.t-select__list');
- fireEvent.click(monthPopup.firstChild);
+ const monthPanel = panelEle.querySelector('.t-date-picker__header-controller-month .t-input');
+ fireEvent.click(monthPanel);
+ const monthPopup = document.querySelector('.t-select__list');
+ fireEvent.click(monthPopup.firstChild);
- const monthInput = document.querySelector('.t-date-picker__header-controller-month .t-input__inner');
+ const monthInput = document.querySelector('.t-date-picker__header-controller-month .t-input__inner');
- expect((monthInput as HTMLInputElement).value).toEqual('1 月');
+ expect((monthInput as HTMLInputElement).value).toEqual('1 月');
- const yearPanel = panelEle.querySelector('.t-date-picker__header-controller-year .t-input');
- fireEvent.click(yearPanel);
- const yearPopup = document.querySelector('.t-date-picker__header-controller-year .t-select__list .t-is-selected');
- fireEvent.click(yearPopup.nextElementSibling);
- const yearInput = document.querySelector('.t-date-picker__header-controller-year .t-input__inner');
- expect((yearInput as HTMLInputElement).value).toEqual('2023');
- });
+ const yearPanel = panelEle.querySelector('.t-date-picker__header-controller-year .t-input');
+ fireEvent.click(yearPanel);
+ const yearPopup = document.querySelector('.t-date-picker__header-controller-year .t-select__list .t-is-selected');
+ fireEvent.click(yearPopup.nextElementSibling);
+ const yearInput = document.querySelector('.t-date-picker__header-controller-year .t-input__inner');
+ expect((yearInput as HTMLInputElement).value).toEqual('2023');
+ });
- it('pure trigger onChange onPick', async () => {
- const { container } = render(
- ,
- );
- const inputEle = container.querySelector('.t-input__inner');
- fireEvent.change(inputEle, { target: { value: '2022-09-10' } });
- expect((inputEle as HTMLInputElement).value).toEqual('2022-09-10');
- });
+ it('pure trigger onChange onPick', async () => {
+ const { container } = render(
+ ,
+ );
+ const inputEle = container.querySelector('.t-input__inner');
+ fireEvent.change(inputEle, { target: { value: '2022-09-10' } });
+ expect((inputEle as HTMLInputElement).value).toEqual('2022-09-10');
+ });
- test('cell handleMouseEnter', async () => {
- const { container } = render();
- const inputEle = container.querySelector('.t-input__inner');
- fireEvent.mouseDown(inputEle);
+ test('cell handleMouseEnter', async () => {
+ const { container } = render();
+ const inputEle = container.querySelector('.t-input__inner');
+ fireEvent.mouseDown(inputEle);
- fireEvent.mouseEnter(document.querySelector('.t-date-picker__cell'));
- fireEvent.mouseLeave(document.querySelector('.t-date-picker__cell'));
- });
+ fireEvent.mouseEnter(document.querySelector('.t-date-picker__cell'));
+ fireEvent.mouseLeave(document.querySelector('.t-date-picker__cell'));
+ });
- test('cell handleClick', async () => {
- const { container } = render();
- const inputEle = container.querySelector('.t-input__inner');
- fireEvent.mouseDown(inputEle);
+ test('cell handleClick', async () => {
+ const { container } = render();
+ const inputEle = container.querySelector('.t-input__inner');
+ fireEvent.mouseDown(inputEle);
- fireEvent.click(document.querySelector('.t-date-picker__cell-inner'));
- fireEvent.click(document.querySelector('.t-date-picker__cell-inner'));
- });
+ fireEvent.click(document.querySelector('.t-date-picker__cell-inner'));
+ fireEvent.click(document.querySelector('.t-date-picker__cell-inner'));
+ });
- test('onJumperClick', async () => {
- const { container } = render();
- const inputEle = container.querySelector('.t-input__inner');
- fireEvent.mouseDown(inputEle);
-
- const jumperPrev = document.querySelector('.t-pagination-mini__prev');
- fireEvent.click(jumperPrev);
- const jumperNext = document.querySelector('.t-pagination-mini__next');
- fireEvent.click(jumperNext);
- const jumperCurrent = document.querySelector('.t-pagination-mini__current');
- fireEvent.click(jumperCurrent);
- });
+ test('onJumperClick', async () => {
+ const { container } = render();
+ const inputEle = container.querySelector('.t-input__inner');
+ fireEvent.mouseDown(inputEle);
+
+ const jumperPrev = document.querySelector('.t-pagination-mini__prev');
+ fireEvent.click(jumperPrev);
+ const jumperNext = document.querySelector('.t-pagination-mini__next');
+ fireEvent.click(jumperNext);
+ const jumperCurrent = document.querySelector('.t-pagination-mini__current');
+ fireEvent.click(jumperCurrent);
+ });
- test('onTimePickerChange & onConfirmClick', async () => {
- const { container, getByText } = render();
- fireEvent.mouseDown(container.querySelector('input'));
+ test('onTimePickerChange & onConfirmClick', async () => {
+ const { container, getByText } = render();
+ fireEvent.mouseDown(container.querySelector('input'));
- const timePickerItem = document.querySelector('.t-time-picker__panel-body-scroll-item');
- fireEvent.click(timePickerItem);
- const confirmBtn = getByText('确定');
- fireEvent.click(confirmBtn);
- });
+ const timePickerItem = document.querySelector('.t-time-picker__panel-body-scroll-item');
+ fireEvent.click(timePickerItem);
+ const confirmBtn = getByText('确定');
+ fireEvent.click(confirmBtn);
+ });
- test('onPresetClick', async () => {
- const { container } = render(
- ,
- );
- const inputEle = container.querySelector('.t-input__inner');
- fireEvent.mouseDown(inputEle);
-
- const christmasBtn = document.querySelector('.t-date-picker__presets .t-button');
- fireEvent.click(christmasBtn);
- expect(christmasBtn).toBeTruthy();
- });
+ test('onPresetClick', async () => {
+ const { container } = render(
+ ,
+ );
+ const inputEle = container.querySelector('.t-input__inner');
+ fireEvent.mouseDown(inputEle);
+
+ const christmasBtn = document.querySelector('.t-date-picker__presets .t-button');
+ fireEvent.click(christmasBtn);
+ expect(christmasBtn).toBeTruthy();
+ });
- test('onYearChange', async () => {
- const { container } = render();
- const inputEle = container.querySelector('.t-input__inner');
- fireEvent.mouseDown(inputEle);
+ test('onYearChange', async () => {
+ const { container } = render();
+ const inputEle = container.querySelector('.t-input__inner');
+ fireEvent.mouseDown(inputEle);
- const yearSelect = document.querySelector('.t-date-picker__header-controller-year');
- fireEvent.click(yearSelect);
+ const yearSelect = document.querySelector('.t-date-picker__header-controller-year');
+ fireEvent.click(yearSelect);
- const monthSelect = document.querySelector('.t-date-picker__header-controller-month');
- fireEvent.click(monthSelect);
+ const monthSelect = document.querySelector('.t-date-picker__header-controller-month');
+ fireEvent.click(monthSelect);
+ });
});
});
diff --git a/packages/components/descriptions/__tests__/descriptions.test.tsx b/packages/components/descriptions/__tests__/descriptions.test.tsx
index 344bfa4050..ae726660cd 100644
--- a/packages/components/descriptions/__tests__/descriptions.test.tsx
+++ b/packages/components/descriptions/__tests__/descriptions.test.tsx
@@ -26,258 +26,266 @@ const items = [
},
];
-describe('Descriptions 组件测试', () => {
- // base
- test('base', () => {
- const { container } = render();
+describe('Descriptions', () => {
+ describe('props', () => {
+ // bordered
+ test('bordered', () => {
+ const { container } = render();
- expect(container.querySelector('.t-descriptions')).toBeInTheDocument();
- });
+ expect(container.querySelector('.t-descriptions__body--border')).toBeTruthy();
+ });
- // bordered
- test('bordered', () => {
- const { container } = render();
+ // colon
+ test('colon', () => {
+ const { container } = render();
- expect(container.querySelector('.t-descriptions__body--border')).toBeTruthy();
- });
+ expect(container.querySelector('.t-descriptions__label')).toHaveTextContent(':');
+ });
- // colon
- test('colon', () => {
- const { container } = render();
+ test('column:4', () => {
+ const { container } = render();
- expect(container.querySelector('.t-descriptions__label')).toHaveTextContent(':');
- });
+ const tbody = container.querySelector('tbody');
- // column
- test('column=2', () => {
- const { container } = render();
+ // 检查 tbody 下面是否只有 1 个 tr 元素
+ expect(tbody.querySelectorAll('tr')).toHaveLength(1);
- const tbody = container.querySelector('tbody');
+ const firstTr = tbody.querySelectorAll('tr')[0];
- // 检查 tbody 下面是否只有 2 个 tr 元素
- expect(tbody.querySelectorAll('tr')).toHaveLength(2);
+ // 检查第 1 个 tr 元素中是否只有 8 个 td 元素
+ expect(firstTr.querySelectorAll('td')).toHaveLength(8);
- const secondTr = tbody.querySelectorAll('tr')[1];
+ // 检查第 2 个 tr 元素中的第 4 个 td 元素是否具有 colspan 属性,并检查其值是否为 1
+ expect(firstTr.querySelectorAll('td')[7].getAttribute('colspan')).toBe('1');
+ });
- // 检查第 2 个 tr 元素中是否只有 4 个 td 元素
- expect(secondTr.querySelectorAll('td')).toHaveLength(4);
+ // size
+ test(':size', () => {
+ const sizeList: SizeEnum[] = ['small', 'medium', 'large'];
+ sizeList.forEach((size) => {
+ const { container } = render(
+ ,
+ );
+ const body = container.querySelector('.t-descriptions__body');
+ expect(body).toHaveClass(`t-size-${size.slice(0, 1)}`);
+ });
+ });
+ // jsx
+ test('jsx and DescriptionsItem span', () => {
+ const { container } = render(
+
+ TDesign
+ 139****0609
+ China Tencent Headquarters
+
+ Shenzhen Penguin Island D1 4A Mail Center
+
+ ,
+ );
+
+ expect(container.querySelector('.t-descriptions')).toBeInTheDocument();
+ });
- // 检查第 2 个 tr 元素中的第 4 个 td 元素是否具有 colspan 属性,并检查其值是否为 1
- expect(secondTr.querySelectorAll('td')[3].getAttribute('colspan')).toBe('1');
+ // props jsx
+ test('props jsx', () => {
+ const itemsProps = [
+ { label: 'Name', content: 'TDesign' },
+ { label: Telephone Number, content: '139****0609' },
+ { label: 'Area', content: China Tencent Headquarters
},
+ {
+ label: Address,
+ content: Shenzhen Penguin Island D1 4A Mail Center,
+ },
+ ];
+ const { container } = render();
+
+ expect(container.querySelector('.t-descriptions')).toBeInTheDocument();
+ });
});
- test('column:4', () => {
- const { container } = render();
+ describe('scenarios', () => {
+ // base
+ test('base', () => {
+ const { container } = render();
- const tbody = container.querySelector('tbody');
+ expect(container.querySelector('.t-descriptions')).toBeInTheDocument();
+ });
- // 检查 tbody 下面是否只有 1 个 tr 元素
- expect(tbody.querySelectorAll('tr')).toHaveLength(1);
+ // column
+ test('column=2', () => {
+ const { container } = render();
- const firstTr = tbody.querySelectorAll('tr')[0];
+ const tbody = container.querySelector('tbody');
- // 检查第 1 个 tr 元素中是否只有 8 个 td 元素
- expect(firstTr.querySelectorAll('td')).toHaveLength(8);
+ // 检查 tbody 下面是否只有 2 个 tr 元素
+ expect(tbody.querySelectorAll('tr')).toHaveLength(2);
- // 检查第 2 个 tr 元素中的第 4 个 td 元素是否具有 colspan 属性,并检查其值是否为 1
- expect(firstTr.querySelectorAll('td')[7].getAttribute('colspan')).toBe('1');
- });
+ const secondTr = tbody.querySelectorAll('tr')[1];
- // custom-style
- test('custom-style', () => {
- const customLabelClassName: React.CSSProperties = {
- width: '100px',
- textAlign: 'left',
- };
- const customContentClassName: React.CSSProperties = {
- textAlign: 'center',
- };
-
- const { container } = render(
- ,
- );
-
- expect(container.querySelector('.t-descriptions__label')).toHaveStyle('width: 100px; text-align: left;');
- expect(container.querySelector('.t-descriptions__content')).toHaveStyle('text-align: center;');
- });
+ // 检查第 2 个 tr 元素中是否只有 4 个 td 元素
+ expect(secondTr.querySelectorAll('td')).toHaveLength(4);
- // direction
- test('layout=horizontal columns=3', () => {
- const { container } = render();
- const tbody = container.querySelector('tbody');
+ // 检查第 2 个 tr 元素中的第 4 个 td 元素是否具有 colspan 属性,并检查其值是否为 1
+ expect(secondTr.querySelectorAll('td')[3].getAttribute('colspan')).toBe('1');
+ });
- // 检查 tbody 下面是否只有 2 个 tr 元素
- expect(tbody.querySelectorAll('tr')).toHaveLength(2);
+ // custom-style
+ test('custom-style', () => {
+ const customLabelClassName: React.CSSProperties = {
+ width: '100px',
+ textAlign: 'left',
+ };
+ const customContentClassName: React.CSSProperties = {
+ textAlign: 'center',
+ };
+
+ const { container } = render(
+ ,
+ );
+
+ expect(container.querySelector('.t-descriptions__label')).toHaveStyle('width: 100px; text-align: left;');
+ expect(container.querySelector('.t-descriptions__content')).toHaveStyle('text-align: center;');
+ });
- // 检查第 1 个 tr 元素中是否只有 6 个 td 元素
- const firstTr = tbody.querySelectorAll('tr')[0];
- expect(firstTr.querySelectorAll('td')).toHaveLength(6);
+ // direction
+ test('layout=horizontal columns=3', () => {
+ const { container } = render();
+ const tbody = container.querySelector('tbody');
- // 检查第 2 个 tr 元素中是否只有 2 个 td 元素
- const secondTr = tbody.querySelectorAll('tr')[1];
- expect(secondTr.querySelectorAll('td')).toHaveLength(2);
+ // 检查 tbody 下面是否只有 2 个 tr 元素
+ expect(tbody.querySelectorAll('tr')).toHaveLength(2);
- // 检查第 2 个 tr 元素中的第 2 个 td 元素是否具有 colspan 属性,并检查其值是否为 5
- const secondTrTd = secondTr.querySelectorAll('td')[1];
- expect(secondTrTd.getAttribute('colspan')).toBe('5');
- });
+ // 检查第 1 个 tr 元素中是否只有 6 个 td 元素
+ const firstTr = tbody.querySelectorAll('tr')[0];
+ expect(firstTr.querySelectorAll('td')).toHaveLength(6);
- // vertical
- test('layout=vertical columns=3', () => {
- const { container } = render(
- ,
- );
- const tbody = container.querySelector('tbody');
+ // 检查第 2 个 tr 元素中是否只有 2 个 td 元素
+ const secondTr = tbody.querySelectorAll('tr')[1];
+ expect(secondTr.querySelectorAll('td')).toHaveLength(2);
- // 检查 tbody 下面是否只有 4 个 tr 元素
- expect(tbody.querySelectorAll('tr')).toHaveLength(4);
+ // 检查第 2 个 tr 元素中的第 2 个 td 元素是否具有 colspan 属性,并检查其值是否为 5
+ const secondTrTd = secondTr.querySelectorAll('td')[1];
+ expect(secondTrTd.getAttribute('colspan')).toBe('5');
+ });
- // 检查第 1 个 tr 元素中是否只有 2 个 td 元素
- const firstTr = tbody.querySelectorAll('tr')[0];
- expect(firstTr.querySelectorAll('td')).toHaveLength(2);
+ // vertical
+ test('layout=vertical columns=3', () => {
+ const { container } = render(
+ ,
+ );
+ const tbody = container.querySelector('tbody');
- // 检查第 3 个 tr 元素中是否只有 2 个 td 元素
- const thirdTr = tbody.querySelectorAll('tr')[2];
- expect(thirdTr.querySelectorAll('td')).toHaveLength(2);
+ // 检查 tbody 下面是否只有 4 个 tr 元素
+ expect(tbody.querySelectorAll('tr')).toHaveLength(4);
- // 检查第 3 个 tr 元素中的第 1 个 td 元素是否具有 colspan 属性,并检查其值是否为 1
- const thirdTrTd = thirdTr.querySelectorAll('td')[0];
- expect(thirdTrTd.getAttribute('colspan')).toBe('1');
- });
+ // 检查第 1 个 tr 元素中是否只有 2 个 td 元素
+ const firstTr = tbody.querySelectorAll('tr')[0];
+ expect(firstTr.querySelectorAll('td')).toHaveLength(2);
- // itemLayout=vertical
- it('itemLayout=vertical', () => {
- const { container } = render(
- ,
- );
+ // 检查第 3 个 tr 元素中是否只有 2 个 td 元素
+ const thirdTr = tbody.querySelectorAll('tr')[2];
+ expect(thirdTr.querySelectorAll('td')).toHaveLength(2);
- const tbody = container.querySelector('tbody');
- // 检查 tbody 下面是否只有 4 个 tr 元素
- expect(tbody.querySelectorAll('tr')).toHaveLength(4);
+ // 检查第 3 个 tr 元素中的第 1 个 td 元素是否具有 colspan 属性,并检查其值是否为 1
+ const thirdTrTd = thirdTr.querySelectorAll('td')[0];
+ expect(thirdTrTd.getAttribute('colspan')).toBe('1');
+ });
- // 检查第 1 个 tr 元素中是否只有 3 个 td 元素
- const firstTr = tbody.querySelectorAll('tr')[0];
- expect(firstTr.querySelectorAll('td')).toHaveLength(3);
+ // itemLayout=vertical
+ it('itemLayout=vertical', () => {
+ const { container } = render(
+ ,
+ );
- // 检查第 3 个 tr 元素中是否只有 1 个 td 元素
- const thirdTr = tbody.querySelectorAll('tr')[2];
- expect(thirdTr.querySelectorAll('td')).toHaveLength(1);
+ const tbody = container.querySelector('tbody');
+ // 检查 tbody 下面是否只有 4 个 tr 元素
+ expect(tbody.querySelectorAll('tr')).toHaveLength(4);
- // 检查第 3 个 tr 元素中的第 1 个 td 元素是否具有 colspan 属性,并检查其值是否为 3
- const thirdTrTd = thirdTr.querySelectorAll('td')[0];
- expect(thirdTrTd.getAttribute('colspan')).toBe('3');
- });
+ // 检查第 1 个 tr 元素中是否只有 3 个 td 元素
+ const firstTr = tbody.querySelectorAll('tr')[0];
+ expect(firstTr.querySelectorAll('td')).toHaveLength(3);
- // layout=vertical itemLayout=vertical
- it('layout=vertical itemLayout=vertical', () => {
- const { container } = render(
- ,
- );
-
- const tbody = container.querySelector('tbody');
- // 检查 tbody 下面是否只有 8 个 tr 元素
- expect(tbody.querySelectorAll('tr')).toHaveLength(8);
-
- // 检查第 1 个 tr 元素中是否只有 1 个 td 元素
- const firstTr = tbody.querySelectorAll('tr')[0];
- expect(firstTr.querySelectorAll('td')).toHaveLength(1);
-
- // 检查第 7 个 tr 元素中是否只有 1 个 td 元素
- const thirdTr = tbody.querySelectorAll('tr')[2];
- expect(thirdTr.querySelectorAll('td')).toHaveLength(1);
-
- // 检查第 7 个 tr 元素中的第 1 个 td 元素是否具有 colspan 属性,并检查其值是否为 1
- const thirdTrTd = thirdTr.querySelectorAll('td')[0];
- expect(thirdTrTd.getAttribute('colspan')).toBe('1');
- });
+ // 检查第 3 个 tr 元素中是否只有 1 个 td 元素
+ const thirdTr = tbody.querySelectorAll('tr')[2];
+ expect(thirdTr.querySelectorAll('td')).toHaveLength(1);
- // size
- test(':size', () => {
- const sizeList: SizeEnum[] = ['small', 'medium', 'large'];
- sizeList.forEach((size) => {
- const { container } = render();
- const body = container.querySelector('.t-descriptions__body');
- expect(body).toHaveClass(`t-size-${size.slice(0, 1)}`);
+ // 检查第 3 个 tr 元素中的第 1 个 td 元素是否具有 colspan 属性,并检查其值是否为 3
+ const thirdTrTd = thirdTr.querySelectorAll('td')[0];
+ expect(thirdTrTd.getAttribute('colspan')).toBe('3');
});
- });
-
- // jsx
- test('jsx and DescriptionsItem span', () => {
- const { container } = render(
-
- TDesign
- 139****0609
- China Tencent Headquarters
-
- Shenzhen Penguin Island D1 4A Mail Center
-
- ,
- );
-
- expect(container.querySelector('.t-descriptions')).toBeInTheDocument();
- });
- // props jsx
- test('props jsx', () => {
- const itemsProps = [
- { label: 'Name', content: 'TDesign' },
- { label: Telephone Number, content: '139****0609' },
- { label: 'Area', content: China Tencent Headquarters
},
- { label: Address, content: Shenzhen Penguin Island D1 4A Mail Center },
- ];
- const { container } = render();
-
- expect(container.querySelector('.t-descriptions')).toBeInTheDocument();
- });
+ // layout=vertical itemLayout=vertical
+ it('layout=vertical itemLayout=vertical', () => {
+ const { container } = render(
+ ,
+ );
+
+ const tbody = container.querySelector('tbody');
+ // 检查 tbody 下面是否只有 8 个 tr 元素
+ expect(tbody.querySelectorAll('tr')).toHaveLength(8);
+
+ // 检查第 1 个 tr 元素中是否只有 1 个 td 元素
+ const firstTr = tbody.querySelectorAll('tr')[0];
+ expect(firstTr.querySelectorAll('td')).toHaveLength(1);
+
+ // 检查第 7 个 tr 元素中是否只有 1 个 td 元素
+ const thirdTr = tbody.querySelectorAll('tr')[2];
+ expect(thirdTr.querySelectorAll('td')).toHaveLength(1);
+
+ // 检查第 7 个 tr 元素中的第 1 个 td 元素是否具有 colspan 属性,并检查其值是否为 1
+ const thirdTrTd = thirdTr.querySelectorAll('td')[0];
+ expect(thirdTrTd.getAttribute('colspan')).toBe('1');
+ });
- // nest
- test('nest', () => {
- const itemsContent = [
- {
- label: 'City',
- content: 'Shenzhen',
- },
- {
- label: 'Detail',
- content: 'Penguin Island D1 4A Mail Center',
- },
- ];
-
- const items = [
- {
- label: 'Name',
- content: 'TDesign',
- },
- {
- label: 'Telephone Number',
- content: '139****0609',
- },
- {
- label: 'Area',
- content: 'China Tencent Headquarters',
- },
- {
- label: 'Address',
- content: ,
- },
- ];
- render();
- expect(screen.getByText('Shenzhen')).not.toBeNull();
- expect(screen.getByText('Shenzhen')).toBeInTheDocument();
+ // nest
+ test('nest', () => {
+ const itemsContent = [
+ {
+ label: 'City',
+ content: 'Shenzhen',
+ },
+ {
+ label: 'Detail',
+ content: 'Penguin Island D1 4A Mail Center',
+ },
+ ];
+
+ const items = [
+ {
+ label: 'Name',
+ content: 'TDesign',
+ },
+ {
+ label: 'Telephone Number',
+ content: '139****0609',
+ },
+ {
+ label: 'Area',
+ content: 'China Tencent Headquarters',
+ },
+ {
+ label: 'Address',
+ content: ,
+ },
+ ];
+ render();
+ expect(screen.getByText('Shenzhen')).not.toBeNull();
+ expect(screen.getByText('Shenzhen')).toBeInTheDocument();
+ });
});
});
diff --git a/packages/components/dialog/__tests__/dialog.test.tsx b/packages/components/dialog/__tests__/dialog.test.tsx
index d771b36de2..69081a8ba9 100644
--- a/packages/components/dialog/__tests__/dialog.test.tsx
+++ b/packages/components/dialog/__tests__/dialog.test.tsx
@@ -41,216 +41,222 @@ function DialogDemo(props) {
);
}
-describe('Dialog组件测试', () => {
+describe('Dialog', () => {
const user = userEvent.setup();
- test('BasicDialog', () => {
- const { getByText } = render();
- expect(document.querySelector('.t-dialog__modal')).not.toBeInTheDocument();
- fireEvent.click(getByText('Open Dialog Modal'));
- expect(document.querySelector('.t-dialog__modal')).toBeInTheDocument();
- });
+ describe('props', () => {
+ test('Dislog props.header render', async () => {
+ const { container } = render(
+ ,
+ );
- test('CloseDialog', async () => {
- const { getByText } = render();
- fireEvent.click(getByText('Open Dialog Modal'));
- expect(document.querySelector('.t-dialog__modal')).toBeInTheDocument();
- fireEvent.click(document.querySelector('.t-dialog__close'));
- await mockTimeout(() => expect(document.querySelector('.t-dialog__modal')).not.toBeInTheDocument(), 400);
+ expect(container.querySelector('.t-dialog__header')).toBeNull();
+ });
});
- test('EscCloseDialog', async () => {
- const onEscKeydown = vi.fn();
- const { getByText } = render();
+ describe('scenarios', () => {
+ test('BasicDialog', () => {
+ const { getByText } = render();
+ expect(document.querySelector('.t-dialog__modal')).not.toBeInTheDocument();
+ fireEvent.click(getByText('Open Dialog Modal'));
+ expect(document.querySelector('.t-dialog__modal')).toBeInTheDocument();
+ });
- await fireEvent.click(getByText('Open Dialog Modal'));
- expect(document.querySelector('.t-dialog__modal')).toBeInTheDocument();
- await user.keyboard('{Escape}');
- expect(onEscKeydown).toHaveBeenCalled();
- });
+ test('CloseDialog', async () => {
+ const { getByText } = render();
+ fireEvent.click(getByText('Open Dialog Modal'));
+ expect(document.querySelector('.t-dialog__modal')).toBeInTheDocument();
+ fireEvent.click(document.querySelector('.t-dialog__close'));
+ await mockTimeout(() => expect(document.querySelector('.t-dialog__modal')).not.toBeInTheDocument(), 400);
+ });
- test('EnterConfirm', async () => {
- const onConfirm = vi.fn();
- const { getByText } = render();
+ test('EscCloseDialog', async () => {
+ const onEscKeydown = vi.fn();
+ const { getByText } = render();
- expect(document.querySelector('.t-dialog__modal')).not.toBeInTheDocument();
+ await fireEvent.click(getByText('Open Dialog Modal'));
+ expect(document.querySelector('.t-dialog__modal')).toBeInTheDocument();
+ await user.keyboard('{Escape}');
+ expect(onEscKeydown).toHaveBeenCalled();
+ });
- fireEvent.click(getByText('Open Dialog Modal'));
- expect(document.querySelector('.t-dialog__modal')).toBeInTheDocument();
- await user.keyboard('{Enter}');
- expect(onConfirm).toHaveBeenCalled();
- });
+ test('EnterConfirm', async () => {
+ const onConfirm = vi.fn();
+ const { getByText } = render();
- test('DraggableDialog', () => {
- const { getByText } = render();
- fireEvent.click(getByText('Open Dialog Modal'));
- expect(document.querySelector('.t-dialog__modeless')).toBeInTheDocument();
- fireEvent.mouseDown(document.querySelector('.t-dialog'));
- fireEvent.mouseMove(document.querySelector('.t-dialog'));
- expect(document.querySelector('.t-dialog')).toHaveStyle({
- cursor: 'move',
- position: 'absolute',
- });
- fireEvent.mouseUp(document.querySelector('.t-dialog'));
- userEvent.keyboard('{esc}');
- expect(document.querySelector('.t-dialog')).toHaveStyle({
- left: '0px',
- top: '0px',
+ expect(document.querySelector('.t-dialog__modal')).not.toBeInTheDocument();
+
+ fireEvent.click(getByText('Open Dialog Modal'));
+ expect(document.querySelector('.t-dialog__modal')).toBeInTheDocument();
+ await user.keyboard('{Enter}');
+ expect(onConfirm).toHaveBeenCalled();
});
- });
- test('DialogPlugin', async () => {
- const showDialog = () => {
- const myDialog = DialogPlugin({
- header: 'Dialog-Plugin',
- body: '函数调用Dialog方式一',
- onConfirm: () => {
- myDialog.hide();
- },
- onClose: () => {
- myDialog.hide();
- },
- });
- };
- const onConfirm = () => {
- const confirmDia = DialogPlugin.confirm({
- header: 'Dialog-Confirm-Plugin',
- body: '函数调用Dialog方式二',
- confirmBtn: 'ok',
- cancelBtn: 'cancel',
- onConfirm: () => {
- confirmDia.hide();
- },
- onClose: () => {
- confirmDia.hide();
- },
- });
- };
- const onAlert = () => {
- const alertDia = DialogPlugin.alert({
- header: 'Dialog-Alert-Plugin',
- body: '函数调用Dialog方式三',
- confirmBtn: {
- content: 'Got it!',
- variant: 'base',
- theme: 'danger',
- },
- onConfirm: () => {
- alertDia.hide();
- },
- onClose: () => {
- alertDia.hide();
- },
+ test('DraggableDialog', () => {
+ const { getByText } = render();
+ fireEvent.click(getByText('Open Dialog Modal'));
+ expect(document.querySelector('.t-dialog__modeless')).toBeInTheDocument();
+ fireEvent.mouseDown(document.querySelector('.t-dialog'));
+ fireEvent.mouseMove(document.querySelector('.t-dialog'));
+ expect(document.querySelector('.t-dialog')).toHaveStyle({
+ cursor: 'move',
+ position: 'absolute',
});
- };
- const handleDialogNode = () => {
- const dialogNode = DialogPlugin({
- header: 'Dialog-Plugin',
- body: 'HandleDialogNode',
+ fireEvent.mouseUp(document.querySelector('.t-dialog'));
+ userEvent.keyboard('{esc}');
+ expect(document.querySelector('.t-dialog')).toHaveStyle({
+ left: '0px',
+ top: '0px',
});
- dialogNode.update({
- header: 'Updated-Dialog-Plugin',
- cancelBtn: null,
- confirmBtn: {
- content: 'GET IT!',
- variant: 'base',
- theme: 'danger',
- id: 'test',
- },
- onConfirm: () => {
- dialogNode.hide();
- dialogNode.destroy();
- },
- onClose: () => {
- dialogNode.hide();
- },
- });
- };
-
- const { getByText } = render(
- <>
- Show Dialog
- Confirm Dialog
- Alert Dialog
- Handle Dialog
- >,
- );
- fireEvent.click(getByText('Show Dialog'));
- expect(document.querySelector('.t-dialog__modal')).toBeInTheDocument();
- await user.keyboard('{Escape}');
- await mockTimeout(() => expect(document.querySelector('.t-dialog__modal')).not.toBeInTheDocument(), 400);
- fireEvent.click(getByText('Confirm Dialog'));
- expect(document.querySelector('.t-dialog__modal')).toBeInTheDocument();
- await user.keyboard('{Escape}');
- await mockTimeout(() => expect(document.querySelector('.t-dialog__modal')).not.toBeInTheDocument(), 400);
- fireEvent.click(getByText('Alert Dialog'));
- expect(document.querySelector('.t-dialog__modal')).toBeInTheDocument();
- await user.keyboard('{Escape}');
- await mockTimeout(() => expect(document.querySelector('.t-dialog__modal')).not.toBeInTheDocument(), 400);
- fireEvent.click(getByText('Handle Dialog'));
- expect(document.querySelector('.t-dialog__modal')).toBeInTheDocument();
- await mockTimeout(() => true, 100);
- fireEvent.click(document.querySelector('#test'));
- await mockTimeout(() => expect(document.querySelector('.t-dialog__modal')).not.toBeInTheDocument(), 400);
- });
+ });
- test('Dislog props.header render', async () => {
- const { container } = render(
- ,
- );
+ test('global dialog placement and zIndex works', async () => {
+ render(
+
+
+ ,
+ );
- expect(container.querySelector('.t-dialog__header')).toBeNull();
- });
+ expect(document.querySelector('.t-dialog--center')).toBeInTheDocument();
+ expect(document.querySelector('.t-dialog--top')).not.toBeInTheDocument();
+ expect(document.querySelector('.t-dialog__ctx')).toHaveStyle({
+ zIndex: '4321',
+ });
+ });
- test('global dialog placement and zIndex works', async () => {
- render(
- {
+ render(
+
-
- ,
- );
+ }}
+ >
+
+ ,
+ );
- expect(document.querySelector('.t-dialog--center')).toBeInTheDocument();
- expect(document.querySelector('.t-dialog--top')).not.toBeInTheDocument();
- expect(document.querySelector('.t-dialog__ctx')).toHaveStyle({
- zIndex: '4321',
+ expect(document.querySelector('.t-dialog--top')).toBeInTheDocument();
+ expect(document.querySelector('.t-dialog--center')).not.toBeInTheDocument();
+ expect(document.querySelector('.t-dialog__ctx')).toHaveStyle({
+ zIndex: '1234',
+ });
});
});
- test('dialog props should override global dialog config', async () => {
- render(
- {
+ test('DialogPlugin', async () => {
+ const showDialog = () => {
+ const myDialog = DialogPlugin({
+ header: 'Dialog-Plugin',
+ body: '函数调用Dialog方式一',
+ onConfirm: () => {
+ myDialog.hide();
},
- }}
- >
-
- ,
- );
+ onClose: () => {
+ myDialog.hide();
+ },
+ });
+ };
+ const onConfirm = () => {
+ const confirmDia = DialogPlugin.confirm({
+ header: 'Dialog-Confirm-Plugin',
+ body: '函数调用Dialog方式二',
+ confirmBtn: 'ok',
+ cancelBtn: 'cancel',
+ onConfirm: () => {
+ confirmDia.hide();
+ },
+ onClose: () => {
+ confirmDia.hide();
+ },
+ });
+ };
+ const onAlert = () => {
+ const alertDia = DialogPlugin.alert({
+ header: 'Dialog-Alert-Plugin',
+ body: '函数调用Dialog方式三',
+ confirmBtn: {
+ content: 'Got it!',
+ variant: 'base',
+ theme: 'danger',
+ },
+ onConfirm: () => {
+ alertDia.hide();
+ },
+ onClose: () => {
+ alertDia.hide();
+ },
+ });
+ };
+ const handleDialogNode = () => {
+ const dialogNode = DialogPlugin({
+ header: 'Dialog-Plugin',
+ body: 'HandleDialogNode',
+ });
+ dialogNode.update({
+ header: 'Updated-Dialog-Plugin',
+ cancelBtn: null,
+ confirmBtn: {
+ content: 'GET IT!',
+ variant: 'base',
+ theme: 'danger',
+ id: 'test',
+ },
+ onConfirm: () => {
+ dialogNode.hide();
+ dialogNode.destroy();
+ },
+ onClose: () => {
+ dialogNode.hide();
+ },
+ });
+ };
- expect(document.querySelector('.t-dialog--top')).toBeInTheDocument();
- expect(document.querySelector('.t-dialog--center')).not.toBeInTheDocument();
- expect(document.querySelector('.t-dialog__ctx')).toHaveStyle({
- zIndex: '1234',
+ const { getByText } = render(
+ <>
+ Show Dialog
+ Confirm Dialog
+ Alert Dialog
+ Handle Dialog
+ >,
+ );
+ fireEvent.click(getByText('Show Dialog'));
+ expect(document.querySelector('.t-dialog__modal')).toBeInTheDocument();
+ await user.keyboard('{Escape}');
+ await mockTimeout(() => expect(document.querySelector('.t-dialog__modal')).not.toBeInTheDocument(), 400);
+ fireEvent.click(getByText('Confirm Dialog'));
+ expect(document.querySelector('.t-dialog__modal')).toBeInTheDocument();
+ await user.keyboard('{Escape}');
+ await mockTimeout(() => expect(document.querySelector('.t-dialog__modal')).not.toBeInTheDocument(), 400);
+ fireEvent.click(getByText('Alert Dialog'));
+ expect(document.querySelector('.t-dialog__modal')).toBeInTheDocument();
+ await user.keyboard('{Escape}');
+ await mockTimeout(() => expect(document.querySelector('.t-dialog__modal')).not.toBeInTheDocument(), 400);
+ fireEvent.click(getByText('Handle Dialog'));
+ expect(document.querySelector('.t-dialog__modal')).toBeInTheDocument();
+ await mockTimeout(() => true, 100);
+ fireEvent.click(document.querySelector('#test'));
+ await mockTimeout(() => expect(document.querySelector('.t-dialog__modal')).not.toBeInTheDocument(), 400);
});
});
});
diff --git a/packages/components/divider/__tests__/__snapshots__/vitest-divider.test.jsx.snap b/packages/components/divider/__tests__/__snapshots__/divider.test.tsx.snap
similarity index 72%
rename from packages/components/divider/__tests__/__snapshots__/vitest-divider.test.jsx.snap
rename to packages/components/divider/__tests__/__snapshots__/divider.test.tsx.snap
index 67502c9491..de168d2ffb 100644
--- a/packages/components/divider/__tests__/__snapshots__/vitest-divider.test.jsx.snap
+++ b/packages/components/divider/__tests__/__snapshots__/divider.test.tsx.snap
@@ -1,6 +1,6 @@
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
-exports[`Divider Component > props.align is equal to center 1`] = `
+exports[`Divider > props > align is equal to center 1`] = `
props.align is equal to center 1`] = `
`;
-exports[`Divider Component > props.align is equal to left 1`] = `
+exports[`Divider > props > align is equal to left 1`] = `
props.align is equal to left 1`] = `
`;
-exports[`Divider Component > props.align is equal to right 1`] = `
+exports[`Divider > props > align is equal to right 1`] = `
props.align is equal to right 1`] = `
`;
-exports[`Divider Component > props.content works fine 1`] = `
+exports[`Divider > props > content 1`] = `
props.content works fine 1`] = `
`;
-exports[`Divider Component > props.layout is equal to horizontal 1`] = `
+exports[`Divider > props > layout is equal to horizontal 1`] = `
props.layout is equal to horizontal 1`] = `
`;
-exports[`Divider Component > props.layout is equal to vertical 1`] = `
+exports[`Divider > props > layout is equal to vertical 1`] = `
{
+import type { TdDividerProps } from '../type';
+
+describe('Divider', () => {
describe('props', () => {
- test('Divider 水平分割线', async () => {
- const { container } = render(
);
+ (['left', 'right', 'center'] as TdDividerProps['align'][]).forEach((item) => {
+ test(`align is equal to ${item}`, () => {
+ const { container } = render(
Text);
+ expect(container.firstChild).toHaveClass(`t-divider--with-text-${item}`);
+ expect(container).toMatchSnapshot();
+ });
+ });
- // 校验默认 className
- const defaultClass = ['t-divider', 't-divider--horizontal'];
- expect(container.firstChild).toHaveClass(...defaultClass);
+ test('dashed', () => {
+ // dashed default value is false
+ const { container: container1 } = render(
);
+ expect(container1.querySelector(`.${'t-divider--dashed'}`)).toBeFalsy();
+ // dashed = true
+ const { container: container2 } = render(
);
+ expect(container2.firstChild).toHaveClass('t-divider--dashed');
+ // dashed = false
+ const { container: container3 } = render(
);
+ expect(container3.querySelector(`.${'t-divider--dashed'}`)).toBeFalsy();
+ });
+
+ (['horizontal', 'vertical'] as TdDividerProps['layout'][]).forEach((item) => {
+ test(`layout is equal to ${item}`, () => {
+ const { container } = render(
);
+ expect(container.firstChild).toHaveClass(`t-divider--${item}`);
+ expect(container).toMatchSnapshot();
+ });
});
+
test('Divider 虚线', () => {
const { container } = render(
);
@@ -19,16 +42,7 @@ describe('Divider 组件测试', () => {
const defaultClass = ['t-divider', 't-divider--horizontal', 't-divider--dashed'];
expect(container.firstChild).toHaveClass(...defaultClass);
});
- test('Divider 带文字', () => {
- const text = '腾讯中';
- const { container, getByText } = render(
{text});
-
- // 校验默认 className
- const defaultClass = ['t-divider', 't-divider--horizontal', 't-divider--with-text'];
- expect(container.firstChild).toHaveClass(...defaultClass);
- expect(getByText(text).textContent).toBe(text);
- });
test('Divider content带文字 ', () => {
const text = '腾讯中content';
const { container, getByText } = render(
);
@@ -57,6 +71,32 @@ describe('Divider 组件测试', () => {
margin: '20px 0',
});
});
+ test('content', () => {
+ const { container } = render(
TNode}>);
+ expect(container.querySelector('.custom-node')).toBeTruthy();
+ expect(container).toMatchSnapshot();
+ });
+
+ test('Divider 带文字', () => {
+ const text = '腾讯中';
+ const { container, getByText } = render(
{text});
+
+ // 校验默认 className
+ const defaultClass = ['t-divider', 't-divider--horizontal', 't-divider--with-text'];
+ expect(container.firstChild).toHaveClass(...defaultClass);
+
+ expect(getByText(text).textContent).toBe(text);
+ });
+ });
+
+ describe('scenarios', () => {
+ test('Divider 水平分割线', async () => {
+ const { container } = render(
);
+
+ // 校验默认 className
+ const defaultClass = ['t-divider', 't-divider--horizontal'];
+ expect(container.firstChild).toHaveClass(...defaultClass);
+ });
test('Divider size vertical', () => {
const text = '腾讯中content';
diff --git a/packages/components/divider/__tests__/vitest-divider.test.jsx b/packages/components/divider/__tests__/vitest-divider.test.jsx
deleted file mode 100644
index 18b0080107..0000000000
--- a/packages/components/divider/__tests__/vitest-divider.test.jsx
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * 该文件由脚本自动生成,如需修改请联系 PMC
- * This file generated by scripts of tdesign-api. `npm run api:docs Divider React(PC) vitest,finalProject`
- * If you need to modify this file, contact PMC first please.
- */
-import React from 'react';
-import { render } from '@test/utils';
-import { Divider } from '..';
-
-describe('Divider Component', () => {
- ['left', 'right', 'center'].forEach((item) => {
- it(`props.align is equal to ${item}`, () => {
- const { container } = render(
Text);
- expect(container.firstChild).toHaveClass(`t-divider--with-text-${item}`);
- expect(container).toMatchSnapshot();
- });
- });
-
- it('props.content works fine', () => {
- const { container } = render(
TNode}>);
- expect(container.querySelector('.custom-node')).toBeTruthy();
- expect(container).toMatchSnapshot();
- });
-
- it('props.dashed works fine', () => {
- // dashed default value is false
- const { container: container1 } = render(
);
- expect(container1.querySelector(`.${'t-divider--dashed'}`)).toBeFalsy();
- // dashed = true
- const { container: container2 } = render(
);
- expect(container2.firstChild).toHaveClass('t-divider--dashed');
- // dashed = false
- const { container: container3 } = render(
);
- expect(container3.querySelector(`.${'t-divider--dashed'}`)).toBeFalsy();
- });
-
- ['horizontal', 'vertical'].forEach((item) => {
- it(`props.layout is equal to ${item}`, () => {
- const { container } = render(
);
- expect(container.firstChild).toHaveClass(`t-divider--${item}`);
- expect(container).toMatchSnapshot();
- });
- });
-});
diff --git a/packages/components/drawer/__tests__/drawer.test.tsx b/packages/components/drawer/__tests__/drawer.test.tsx
index 495a514965..c5f5eb4263 100644
--- a/packages/components/drawer/__tests__/drawer.test.tsx
+++ b/packages/components/drawer/__tests__/drawer.test.tsx
@@ -30,108 +30,116 @@ function DrawerDemo(props) {
);
}
-describe('test Drawer', () => {
- test('Drawer render', async () => {
- const { getByText } = render(
);
- fireEvent.click(getByText('Open'));
- expect(document.querySelector('.t-drawer--open')).toBeInTheDocument();
- expect(document.querySelector('.t-drawer__mask')).toBeInTheDocument();
- expect(document.querySelector('.t-drawer__content-wrapper--right')).toBeInTheDocument();
- });
- test('Drawer close', async () => {
- const { getByText } = render(
);
- fireEvent.click(getByText('Open'));
- fireEvent.click(document.querySelector('.t-drawer__close-btn'));
- expect(document.querySelector('.t-drawer--open')).not.toBeInTheDocument();
- expect(document.querySelector('.t-drawer')).toBeInTheDocument();
- });
- test('Drawer mask close', async () => {
- const { getByText } = render(
);
- fireEvent.click(getByText('Open'));
- expect(document.querySelector('.t-drawer--open')).toBeInTheDocument();
- fireEvent.click(document.querySelector('.t-drawer--open')?.children[0]);
- expect(document.querySelector('.t-drawer--open')).not.toBeInTheDocument();
- });
- test('Drawer placement', async () => {
- const { getByText } = render(
);
- fireEvent.click(getByText('Open'));
- expect(document.querySelector('.t-drawer__content-wrapper--right')).not.toBeInTheDocument();
- expect(document.querySelector('.t-drawer__content-wrapper--top')).toBeInTheDocument();
- });
- test('Drawer size', async () => {
- const { getByText } = render(
);
- fireEvent.click(getByText('Open'));
- expect(document.querySelector('.t-drawer__content-wrapper--right')).toHaveStyle({ width: '50%' });
- });
- test('Drawer showOverlay', () => {
- const { getByText } = render(
);
- fireEvent.click(getByText('Open'));
- expect(document.querySelector('.t-drawer__mask')).not.toBeInTheDocument();
- });
- test('Drawer header and footer custom', () => {
- const { getByText } = render(
自定义头部} footer={
自定义底部
} />);
- fireEvent.click(getByText('Open'));
- expect(getByText('自定义头部').parentElement).toHaveClass('t-drawer__header');
- expect(getByText('自定义底部').parentElement).toHaveClass('t-drawer__footer');
- });
- test('Drawer cancelBtn and confirmBtn custom', () => {
- const { getByText } = render(
cancelBtn } confirmBtn={
confirmBtn
} />);
- fireEvent.click(getByText('Open'));
+describe('Drawer', () => {
+ describe('props', () => {
+ test('Drawer placement', async () => {
+ const { getByText } = render(
);
+ fireEvent.click(getByText('Open'));
+ expect(document.querySelector('.t-drawer__content-wrapper--right')).not.toBeInTheDocument();
+ expect(document.querySelector('.t-drawer__content-wrapper--top')).toBeInTheDocument();
+ });
+ test('Drawer size', async () => {
+ const { getByText } = render(
);
+ fireEvent.click(getByText('Open'));
+ expect(document.querySelector('.t-drawer__content-wrapper--right')).toHaveStyle({ width: '50%' });
+ });
+ test('Drawer showOverlay', () => {
+ const { getByText } = render(
);
+ fireEvent.click(getByText('Open'));
+ expect(document.querySelector('.t-drawer__mask')).not.toBeInTheDocument();
+ });
- const cancelBtn = getByText('cancelBtn');
- const confirmBtn = getByText('confirmBtn');
+ test('Drawer cancelBtn and confirmBtn props', () => {
+ const { getByText } = render(
+
,
+ );
+ fireEvent.click(getByText('Open'));
- expect(cancelBtn.parentElement.parentElement).toHaveClass('t-drawer__footer');
- expect(confirmBtn.parentElement.parentElement).toHaveClass('t-drawer__footer');
- });
+ const confirmBtn = getByText('确认按钮');
+ const cancelBtn = getByText('取消按钮');
- test('Drawer cancelBtn and confirmBtn props', () => {
- const { getByText } = render(
-
,
- );
- fireEvent.click(getByText('Open'));
-
- const confirmBtn = getByText('确认按钮');
- const cancelBtn = getByText('取消按钮');
-
- // 是否有这两个元素
- expect(cancelBtn).toBeInTheDocument();
- expect(confirmBtn).toBeInTheDocument();
-
- expect(confirmBtn.parentElement).toHaveClass('t-drawer__confirm');
- expect(cancelBtn.parentElement).toHaveClass('t-drawer__cancel');
- expect(confirmBtn.parentElement.parentElement.parentElement).toHaveClass('t-drawer__footer');
- expect(cancelBtn.parentElement.parentElement.parentElement).toHaveClass('t-drawer__footer');
-
- expect(confirmBtn.parentElement).toHaveClass(`t-button--theme-success`);
- expect(cancelBtn.parentElement).toHaveClass(`t-button--theme-danger`);
- });
+ // 是否有这两个元素
+ expect(cancelBtn).toBeInTheDocument();
+ expect(confirmBtn).toBeInTheDocument();
+
+ expect(confirmBtn.parentElement).toHaveClass('t-drawer__confirm');
+ expect(cancelBtn.parentElement).toHaveClass('t-drawer__cancel');
+ expect(confirmBtn.parentElement.parentElement.parentElement).toHaveClass('t-drawer__footer');
+ expect(cancelBtn.parentElement.parentElement.parentElement).toHaveClass('t-drawer__footer');
+
+ expect(confirmBtn.parentElement).toHaveClass(`t-button--theme-success`);
+ expect(cancelBtn.parentElement).toHaveClass(`t-button--theme-danger`);
+ });
+
+ test('Drawer mode push', () => {
+ const { getByText } = render(
);
+ fireEvent.click(getByText('Open'));
- test('Drawer mode push', () => {
- const { getByText } = render(
);
- fireEvent.click(getByText('Open'));
+ setTimeout(() => {
+ expect(document.body).toHaveStyle({
+ margin: '0 0 0 -300px',
+ });
+ }, 1000);
+ });
+ test('Drawer header and footer custom', () => {
+ const { getByText } = render(
自定义头部 } footer={
自定义底部
} />);
+ fireEvent.click(getByText('Open'));
+ expect(getByText('自定义头部').parentElement).toHaveClass('t-drawer__header');
+ expect(getByText('自定义底部').parentElement).toHaveClass('t-drawer__footer');
+ });
+ test('Drawer cancelBtn and confirmBtn custom', () => {
+ const { getByText } = render(
cancelBtn } confirmBtn={
confirmBtn
} />);
+ fireEvent.click(getByText('Open'));
- setTimeout(() => {
- expect(document.body).toHaveStyle({
- margin: '0 0 0 -300px',
- });
- }, 1000);
+ const cancelBtn = getByText('cancelBtn');
+ const confirmBtn = getByText('confirmBtn');
+
+ expect(cancelBtn.parentElement.parentElement).toHaveClass('t-drawer__footer');
+ expect(confirmBtn.parentElement.parentElement).toHaveClass('t-drawer__footer');
+ });
+ });
+
+ describe('events', () => {
+ test('Drawer onCancel', () => {
+ const onCancelFn = vi.fn();
+ const { getByText } = render(
);
+ fireEvent.click(getByText('Open'));
+ expect(onCancelFn).not.toHaveBeenCalled();
+ fireEvent.click(getByText('取消'));
+ expect(onCancelFn).toHaveBeenCalled();
+ });
});
- test('Drawer onCancel', () => {
- const onCancelFn = vi.fn();
- const { getByText } = render(
);
- fireEvent.click(getByText('Open'));
- expect(onCancelFn).not.toHaveBeenCalled();
- fireEvent.click(getByText('取消'));
- expect(onCancelFn).toHaveBeenCalled();
+
+ describe('scenarios', () => {
+ test('Drawer render', async () => {
+ const { getByText } = render(
);
+ fireEvent.click(getByText('Open'));
+ expect(document.querySelector('.t-drawer--open')).toBeInTheDocument();
+ expect(document.querySelector('.t-drawer__mask')).toBeInTheDocument();
+ expect(document.querySelector('.t-drawer__content-wrapper--right')).toBeInTheDocument();
+ });
+ test('Drawer close', async () => {
+ const { getByText } = render(
);
+ fireEvent.click(getByText('Open'));
+ fireEvent.click(document.querySelector('.t-drawer__close-btn'));
+ expect(document.querySelector('.t-drawer--open')).not.toBeInTheDocument();
+ expect(document.querySelector('.t-drawer')).toBeInTheDocument();
+ });
+ test('Drawer mask close', async () => {
+ const { getByText } = render(
);
+ fireEvent.click(getByText('Open'));
+ expect(document.querySelector('.t-drawer--open')).toBeInTheDocument();
+ fireEvent.click(document.querySelector('.t-drawer--open')?.children[0]);
+ expect(document.querySelector('.t-drawer--open')).not.toBeInTheDocument();
+ });
});
});
diff --git a/packages/components/dropdown/__tests__/dropdown.test.tsx b/packages/components/dropdown/__tests__/dropdown.test.tsx
index 8a83066e75..9fee99c3a8 100644
--- a/packages/components/dropdown/__tests__/dropdown.test.tsx
+++ b/packages/components/dropdown/__tests__/dropdown.test.tsx
@@ -5,7 +5,7 @@ import Dropdown from '../Dropdown';
const { DropdownMenu, DropdownItem } = Dropdown;
-describe('Dropdown 组件测试', () => {
+describe('Dropdown', () => {
const triggerElement = '触发元素';
const triggerElement2 = '触发元素2';
const clickElement = '弹出层内容';
@@ -26,83 +26,85 @@ describe('Dropdown 组件测试', () => {
},
];
- test('hover 触发测试', async () => {
- const { getByText } = render(
-
- {triggerElement}
- ,
- );
+ describe('scenarios', () => {
+ test('hover 触发测试', async () => {
+ const { getByText } = render(
+
+ {triggerElement}
+ ,
+ );
- // 鼠标进入前,没有元素存在
- const popupContainer1 = document.querySelector('.t-dropdown');
- expect(popupContainer1).toBeNull();
+ // 鼠标进入前,没有元素存在
+ const popupContainer1 = document.querySelector('.t-dropdown');
+ expect(popupContainer1).toBeNull();
- // 模拟鼠标进入
- act(() => {
- fireEvent.mouseEnter(getByText(triggerElement));
- });
- expect(document.querySelector('.t-dropdown__item')).toHaveTextContent(dropOptions[0].content);
-
- // 模拟鼠标进入child
- act(() => {
- fireEvent.mouseEnter(getByText(triggerElement2));
- });
- // 鼠标进入后,有元素
- const popupContainer4 = document.querySelectorAll('.t-dropdown__item');
- expect(popupContainer4[2]).toHaveTextContent(dropOptions[1].children[0].content);
-
- // 模拟鼠标离开
- act(() => {
- fireEvent.mouseLeave(getByText(triggerElement));
- });
- expect(document.querySelector('.t-dropdown__menu')).not.toBeNull();
- });
-
- test('click 点击测试', async () => {
- const { getByText } = render(
{triggerElement});
-
- // 鼠标进入前,没有元素存在
- expect(document.querySelector('.t-dropdown')).toBeNull();
-
- act(() => {
// 模拟鼠标进入
- fireEvent.mouseEnter(getByText(triggerElement));
- });
- expect(document.querySelector('.t-dropdown')).not.toBeNull();
+ act(() => {
+ fireEvent.mouseEnter(getByText(triggerElement));
+ });
+ expect(document.querySelector('.t-dropdown__item')).toHaveTextContent(dropOptions[0].content);
+
+ // 模拟鼠标进入child
+ act(() => {
+ fireEvent.mouseEnter(getByText(triggerElement2));
+ });
+ // 鼠标进入后,有元素
+ const popupContainer4 = document.querySelectorAll('.t-dropdown__item');
+ expect(popupContainer4[2]).toHaveTextContent(dropOptions[1].children[0].content);
- act(() => {
- // 模拟鼠标点击
- fireEvent.click(getByText(clickElement));
+ // 模拟鼠标离开
+ act(() => {
+ fireEvent.mouseLeave(getByText(triggerElement));
+ });
+ expect(document.querySelector('.t-dropdown__menu')).not.toBeNull();
});
- // 鼠标点击后下拉框消失
- await mockTimeout(() => expect(document.querySelector('.t-dropdown__menu')).toBeNull());
- });
- test('child 写法模拟', async () => {
- const { getByText } = render(
-
- {triggerElement}
-
- 弹出层内容
-
- ,
- );
+ test('click 点击测试', async () => {
+ const { getByText } = render(
{triggerElement});
- // 鼠标进入前,没有元素存在
- expect(document.querySelector('.t-dropdown')).toBeNull();
+ // 鼠标进入前,没有元素存在
+ expect(document.querySelector('.t-dropdown')).toBeNull();
- act(() => {
- // 模拟鼠标进入
- fireEvent.mouseEnter(getByText(triggerElement));
- });
- expect(document.querySelector('.t-dropdown')).not.toBeNull();
+ act(() => {
+ // 模拟鼠标进入
+ fireEvent.mouseEnter(getByText(triggerElement));
+ });
+ expect(document.querySelector('.t-dropdown')).not.toBeNull();
- act(() => {
- // 模拟鼠标离开
- fireEvent.mouseLeave(getByText(triggerElement));
+ act(() => {
+ // 模拟鼠标点击
+ fireEvent.click(getByText(clickElement));
+ });
+ // 鼠标点击后下拉框消失
+ await mockTimeout(() => expect(document.querySelector('.t-dropdown__menu')).toBeNull());
});
- // 鼠标点击后下拉框消失
- await mockTimeout(() => expect(document.querySelector('.t-dropdown__menu')).toBeNull());
+ test('child 写法模拟', async () => {
+ const { getByText } = render(
+
+ {triggerElement}
+
+ 弹出层内容
+
+ ,
+ );
+
+ // 鼠标进入前,没有元素存在
+ expect(document.querySelector('.t-dropdown')).toBeNull();
+
+ act(() => {
+ // 模拟鼠标进入
+ fireEvent.mouseEnter(getByText(triggerElement));
+ });
+ expect(document.querySelector('.t-dropdown')).not.toBeNull();
+
+ act(() => {
+ // 模拟鼠标离开
+ fireEvent.mouseLeave(getByText(triggerElement));
+ });
+
+ // 鼠标点击后下拉框消失
+ await mockTimeout(() => expect(document.querySelector('.t-dropdown__menu')).toBeNull());
+ });
});
});
diff --git a/packages/components/empty/__tests__/empty.test.tsx b/packages/components/empty/__tests__/empty.test.tsx
index 7be5ce5fcc..8fe3af82ad 100644
--- a/packages/components/empty/__tests__/empty.test.tsx
+++ b/packages/components/empty/__tests__/empty.test.tsx
@@ -1,43 +1,58 @@
/* eslint-disable */
-import { render } from '@test/utils';
-import React from 'react';
-
-import Empty from '../index';
-
-describe('Empty 组件测试', () => {
- test('size', async () => {
- const { container } = render(
);
-
- expect(container.querySelector('.t-empty.t-size-s')).not.toBeNull();
- });
-
- test('title', async () => {
- const { container } = render(
);
-
- expect(container.querySelector('.t-empty__title').innerHTML).toBe('title');
- });
-
- test('description', async () => {
- const { container } = render(
);
-
- expect(container.querySelector('.t-empty__description').innerHTML).toBe('description');
- });
-
- test('action', async () => {
- const { container } = render(
action } />);
-
- expect(container.querySelector('.t-empty__action').innerHTML).toBe('
action
');
- });
-
- test('type', async () => {
- const { container } = render(
);
- const successIconPath =
- 'M24 42C33.9411 42 42 33.9411 42 24C42 14.0589 33.9411 6 24 6C14.0589 6 6 14.0589 6 24C6 33.9411 14.0589 42 24 42ZM46 24C46 36.1503 36.1503 46 24 46C11.8497 46 2 36.1503 2 24C2 11.8497 11.8497 2 24 2C36.1503 2 46 11.8497 46 24ZM21 32.8284L12.1716 24L15 21.1716L21 27.1716L33 15.1716L35.8284 18L21 32.8284Z';
- expect(container.querySelector('.t-empty__image').querySelector('path').getAttribute('d')).toBe(successIconPath);
- });
-
- test('image', async () => {
- const { container } = render(
image } />);
- expect(container.querySelector('.t-empty__image').innerHTML).toBe('
image
');
+import { render } from "@test/utils";
+import React from "react";
+
+import Empty from "../index";
+
+describe("Empty", () => {
+ describe("props", () => {
+ test("size", async () => {
+ const { container } = render(
);
+
+ expect(container.querySelector(".t-empty.t-size-s")).not.toBeNull();
+ });
+
+ test("title", async () => {
+ const { container } = render(
);
+
+ expect(container.querySelector(".t-empty__title").innerHTML).toBe(
+ "title",
+ );
+ });
+
+ test("description", async () => {
+ const { container } = render(
);
+
+ expect(container.querySelector(".t-empty__description").innerHTML).toBe(
+ "description",
+ );
+ });
+
+ test("type", async () => {
+ const { container } = render(
);
+ const successIconPath =
+ "M24 42C33.9411 42 42 33.9411 42 24C42 14.0589 33.9411 6 24 6C14.0589 6 6 14.0589 6 24C6 33.9411 14.0589 42 24 42ZM46 24C46 36.1503 36.1503 46 24 46C11.8497 46 2 36.1503 2 24C2 11.8497 11.8497 2 24 2C36.1503 2 46 11.8497 46 24ZM21 32.8284L12.1716 24L15 21.1716L21 27.1716L33 15.1716L35.8284 18L21 32.8284Z";
+ expect(
+ container
+ .querySelector(".t-empty__image")
+ .querySelector("path")
+ .getAttribute("d"),
+ ).toBe(successIconPath);
+ });
+
+ test("action", async () => {
+ const { container } = render(
action } />);
+
+ expect(container.querySelector(".t-empty__action").innerHTML).toBe(
+ "action
",
+ );
+ });
+
+ test("image", async () => {
+ const { container } = render(image } />);
+ expect(container.querySelector(".t-empty__image").innerHTML).toBe(
+ "
",
+ );
+ });
});
});
diff --git a/packages/components/form/__tests__/form-list.test.tsx b/packages/components/form/__tests__/form-list.test.tsx
index 5294322776..aeb181e548 100644
--- a/packages/components/form/__tests__/form-list.test.tsx
+++ b/packages/components/form/__tests__/form-list.test.tsx
@@ -55,936 +55,971 @@ const BasicForm = (props: FormProps & { operation }) => {
);
};
-describe('FormList 组件测试', () => {
- test('FormList basic API', async () => {
- const onValuesChangeFn = vi.fn();
- let latestFormValues = {};
+describe('FormList', () => {
+ describe('instanceFunctions', () => {
+ test('FormList basic API', async () => {
+ const onValuesChangeFn = vi.fn();
+ let latestFormValues = {};
+
+ const TestView = () => {
+ const [form] = Form.useForm();
+
+ function setFields() {
+ form.getFieldsValue(true);
+ form.setFields([{ name: 'address', value: [{ province: 'setFields' }] }]);
+ }
+
+ function setFieldsValue() {
+ form.getFieldValue('address');
+ form.setFieldsValue({ address: [{ province: 'setFieldsValue' }] });
+ }
+
+ function setValidateMessage() {
+ form.setValidateMessage({
+ address: [{ type: 'error', message: 'message: setValidateMessage' }],
+ });
+ }
+
+ function validate() {
+ form.validate();
+ }
+
+ function validateOnly() {
+ form.validateOnly();
+ }
+
+ function clearValidate() {
+ form.clearValidate();
+ }
+
+ function getFormValues() {
+ const values = form.getFieldsValue(true);
+ document.getElementById('form-values-result')?.setAttribute('data-result', JSON.stringify(values));
+ }
+
+ return (
+