Skip to content

Commit 15d458f

Browse files
committed
test: basic test case
1 parent 1abb786 commit 15d458f

File tree

7 files changed

+97
-26
lines changed

7 files changed

+97
-26
lines changed

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@
4848
},
4949
"devDependencies": {
5050
"@types/classnames": "^2.2.9",
51+
"@types/enzyme": "^3.10.8",
52+
"@types/jest": "^26.0.18",
5153
"@types/react": "^16.14.2",
5254
"@types/react-dom": "^16.9.10",
5355
"@umijs/fabric": "^2.0.8",

src/Item.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export interface ItemProps<ItemType> {
99
renderItem?: (item: ItemType) => React.ReactNode;
1010
responsive?: boolean;
1111
itemKey?: React.Key;
12-
registerSize: (key: React.Key, width: number) => void;
12+
registerSize: (key: React.Key, width: number | null) => void;
1313
children?: React.ReactNode;
1414
display: boolean;
1515
order: number;
@@ -32,13 +32,13 @@ export default function Item<ItemType>(props: ItemProps<ItemType>) {
3232
const mergedHidden = responsive && !display;
3333

3434
// ================================ Effect ================================
35-
function internalRegisterSize(width: number) {
35+
function internalRegisterSize(width: number | null) {
3636
registerSize(itemKey!, width);
3737
}
3838

3939
React.useEffect(
4040
() => () => {
41-
internalRegisterSize(0);
41+
internalRegisterSize(null);
4242
},
4343
[],
4444
);

src/Overflow.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -112,11 +112,11 @@ function Overflow<ItemType = any>(
112112
setContainerWidth(element.clientWidth);
113113
}
114114

115-
function registerSize(key: React.Key, width: number) {
115+
function registerSize(key: React.Key, width: number | null) {
116116
setItemWidths((origin) => {
117117
const clone = new Map(origin);
118118

119-
if (!width) {
119+
if (width === null) {
120120
clone.delete(key);
121121
} else {
122122
clone.set(key, width);
@@ -125,8 +125,8 @@ function Overflow<ItemType = any>(
125125
});
126126
}
127127

128-
function registerOverflowSize(_: React.Key, width: number) {
129-
setRestWidth(width);
128+
function registerOverflowSize(_: React.Key, width: number | null) {
129+
setRestWidth(width || 0);
130130
setPrevRestWidth(restWidth);
131131
}
132132

tests/index.spec.js

Lines changed: 0 additions & 6 deletions
This file was deleted.

tests/index.spec.tsx

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import React from 'react';
2+
import Overflow from '../src';
3+
import { mount } from './wrapper';
4+
5+
interface ItemType {
6+
label: string;
7+
key: number;
8+
}
9+
10+
function renderItem(item: ItemType) {
11+
return item.label;
12+
}
13+
14+
describe('Overflow', () => {
15+
function getData(count: number) {
16+
return new Array(count).fill(undefined).map((_, index) => ({
17+
label: `Label ${index}`,
18+
key: index,
19+
}));
20+
}
21+
22+
it('no maxCount', () => {
23+
const wrapper = mount(
24+
<Overflow<ItemType> data={getData(6)} renderItem={renderItem} />,
25+
);
26+
expect(wrapper.find('ResizeObserver')).toHaveLength(0);
27+
expect(wrapper.find('div.rc-overflow-item')).toHaveLength(6);
28+
expect(wrapper.findRest()).toHaveLength(0);
29+
});
30+
31+
it('number maxCount', () => {
32+
const wrapper = mount(
33+
<Overflow<ItemType>
34+
data={getData(6)}
35+
renderItem={renderItem}
36+
maxCount={4}
37+
/>,
38+
);
39+
expect(wrapper.find('ResizeObserver')).toHaveLength(0);
40+
expect(wrapper.find('div.rc-overflow-item')).toHaveLength(4 + 1);
41+
expect(wrapper.findRest()).toHaveLength(1);
42+
});
43+
44+
it('renderRest', () => {
45+
const wrapper = mount(
46+
<Overflow
47+
data={getData(6)}
48+
renderItem={renderItem}
49+
renderRest={(omittedItems) => `Bamboo: ${omittedItems.length}`}
50+
maxCount={3}
51+
/>,
52+
);
53+
54+
expect(wrapper.findRest().text()).toEqual('Bamboo: 3');
55+
});
56+
});

tests/setup.js

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,25 @@ window.requestAnimationFrame = (func) => {
1010
Enzyme.configure({ adapter: new Adapter() });
1111

1212
Object.assign(Enzyme.ReactWrapper.prototype, {
13-
triggerMotionEvent(target) {
14-
const motionEvent = new Event('transitionend');
15-
if (target) {
16-
Object.defineProperty(motionEvent, 'target', {
17-
get: () => target.getDOMNode(),
18-
});
19-
}
20-
13+
triggerResize(offsetWidth) {
2114
act(() => {
22-
const element = this.find('CSSMotion').getDOMNode();
23-
element.dispatchEvent(motionEvent);
24-
this.update();
15+
this.find('ResizeObserver').first().props().onResize({ offsetWidth });
2516
});
26-
27-
return this;
17+
},
18+
triggerItemResize(index, offsetWidth) {
19+
act(() => {
20+
this.find('Item')
21+
.at(index)
22+
.find('ResizeObserver')
23+
.props()
24+
.onResize({ offsetWidth });
25+
});
26+
},
27+
initSize(width, itemWidth) {
28+
this.triggerResize(width);
29+
this.triggerItemResize(itemWidth);
30+
},
31+
findRest() {
32+
return this.find('div.rc-overflow-item-rest');
2833
},
2934
});

tests/wrapper.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { mount as enzymeMount, ReactWrapper } from 'enzyme';
2+
3+
export type MountParam = Parameters<typeof enzymeMount>;
4+
5+
export interface WrapperType extends ReactWrapper {
6+
triggerResize: (offsetWidth: number) => WrapperType;
7+
triggerItemResize: (index: number, offsetWidth: number) => WrapperType;
8+
initSize: (width: number, itemWidth: number) => WrapperType;
9+
findRest: () => WrapperType;
10+
}
11+
12+
export function mount(...args: MountParam) {
13+
return enzymeMount(...args) as WrapperType;
14+
}

0 commit comments

Comments
 (0)