Skip to content

Commit 73d93f4

Browse files
authored
test(tabs): add tabs test (#864)
1 parent 526aa36 commit 73d93f4

File tree

3 files changed

+815
-1
lines changed

3 files changed

+815
-1
lines changed

site/test-coverage.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ module.exports = {
5959
switch: { statements: '100%', branches: '100%', functions: '100%', lines: '100%' },
6060
tabBar: { statements: '100%', branches: '93.18%', functions: '100%', lines: '100%' },
6161
table: { statements: '100%', branches: '90%', functions: '100%', lines: '100%' },
62-
tabs: { statements: '43.22%', branches: '18.75%', functions: '56%', lines: '45.07%' },
62+
tabs: { statements: '99.35%', branches: '97.5%', functions: '100%', lines: '100%' },
6363
tag: { statements: '100%', branches: '100%', functions: '100%', lines: '100%' },
6464
textarea: { statements: '98.64%', branches: '95%', functions: '93.33%', lines: '100%' },
6565
toast: { statements: '98.73%', branches: '100%', functions: '94.11%', lines: '98.66%' },
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
import React from 'react';
2+
import { describe, it, expect, render, vi, fireEvent, beforeEach, act } from '@test/utils';
3+
import { Tabs, TabPanel } from '../index';
4+
5+
const prefix = 't';
6+
const name = `.${prefix}-tabs`;
7+
const panelClass = `.${prefix}-tab-panel`;
8+
9+
describe('TabPanel', () => {
10+
beforeEach(() => {
11+
Object.defineProperty(Element.prototype, 'scrollTo', {
12+
configurable: true,
13+
writable: true,
14+
value: vi.fn(),
15+
});
16+
});
17+
18+
describe('props', () => {
19+
it(': value', () => {
20+
const { container } = render(
21+
<Tabs defaultValue="tab1">
22+
<TabPanel label="Tab 1" value="tab1">
23+
Content 1
24+
</TabPanel>
25+
<TabPanel label="Tab 2" value="tab2">
26+
Content 2
27+
</TabPanel>
28+
</Tabs>,
29+
);
30+
31+
// 根据 value 确定激活状态
32+
const panels = container.querySelectorAll(panelClass);
33+
expect(panels[0]).toHaveStyle({ display: 'block' });
34+
expect(panels[1]).toHaveStyle({ display: 'none' });
35+
});
36+
37+
it(': label', () => {
38+
const { queryByText } = render(
39+
<Tabs defaultValue="1">
40+
<TabPanel label="自定义标签" value="1">
41+
Content
42+
</TabPanel>
43+
</Tabs>,
44+
);
45+
46+
expect(queryByText('自定义标签')).toBeInTheDocument();
47+
});
48+
49+
it(': children', () => {
50+
const { queryByText } = render(
51+
<Tabs defaultValue="1">
52+
<TabPanel label="Tab 1" value="1">
53+
子元素内容
54+
</TabPanel>
55+
</Tabs>,
56+
);
57+
58+
expect(queryByText('子元素内容')).toBeInTheDocument();
59+
});
60+
61+
it(': disabled', () => {
62+
const onChange = vi.fn();
63+
const { container } = render(
64+
<Tabs defaultValue="1" onChange={onChange}>
65+
<TabPanel label="Tab 1" value="1">
66+
Content 1
67+
</TabPanel>
68+
<TabPanel label="Tab 2" value="2" disabled>
69+
Content 2
70+
</TabPanel>
71+
</Tabs>,
72+
);
73+
74+
const tab2 = container.querySelectorAll(`${name}__item`)[1];
75+
expect(tab2).toHaveClass(`${prefix}-tabs__item--disabled`);
76+
77+
fireEvent.click(tab2);
78+
expect(onChange).not.toHaveBeenCalled();
79+
});
80+
it(': lazy', async () => {
81+
const { container, queryByText } = render(
82+
<Tabs defaultValue="1">
83+
<TabPanel label="Tab 1" value="1">
84+
Content 1
85+
</TabPanel>
86+
<TabPanel label="Tab 2" value="2" lazy>
87+
Content 2
88+
</TabPanel>
89+
</Tabs>,
90+
);
91+
92+
expect(queryByText('Content 2')).not.toBeInTheDocument();
93+
const tab2 = container.querySelectorAll(`${name}__item`)[1];
94+
fireEvent.click(tab2);
95+
96+
await act(async () => {
97+
await new Promise((resolve) => {
98+
setTimeout(resolve, 10);
99+
});
100+
});
101+
102+
expect(queryByText('Content 2')).toBeInTheDocument();
103+
});
104+
105+
it(': destroyOnHide', async () => {
106+
const { container, queryByText } = render(
107+
<Tabs defaultValue="1">
108+
<TabPanel label="Tab 1" value="1" destroyOnHide>
109+
Content 1
110+
</TabPanel>
111+
<TabPanel label="Tab 2" value="2" destroyOnHide>
112+
Content 2
113+
</TabPanel>
114+
</Tabs>,
115+
);
116+
117+
expect(queryByText('Content 1')).toBeInTheDocument();
118+
119+
const tab2 = container.querySelectorAll(`${name}__item`)[1];
120+
fireEvent.click(tab2);
121+
122+
await act(async () => {
123+
await new Promise((resolve) => {
124+
setTimeout(resolve, 10);
125+
});
126+
});
127+
128+
expect(queryByText('Content 2')).toBeInTheDocument();
129+
expect(queryByText('Content 1')).not.toBeInTheDocument();
130+
});
131+
132+
it(': badgeProps', () => {
133+
const { container } = render(
134+
<Tabs defaultValue="1">
135+
<TabPanel label="Tab 1" value="1" badgeProps={{ count: 5 }}>
136+
Content 1
137+
</TabPanel>
138+
</Tabs>,
139+
);
140+
141+
expect(container.querySelector('.t-badge')).toBeInTheDocument();
142+
});
143+
});
144+
});

0 commit comments

Comments
 (0)