forked from Expensify/App
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBaseOptionsList.perf-test.tsx
125 lines (111 loc) · 4.72 KB
/
BaseOptionsList.perf-test.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import {fireEvent} from '@testing-library/react-native';
import type {RenderResult} from '@testing-library/react-native';
import React, {useState} from 'react';
import {measurePerformance} from 'reassure';
import BaseOptionsList from '@components/OptionsList/BaseOptionsList';
import type {OptionData} from '@libs/ReportUtils';
import variables from '@styles/variables';
type BaseOptionsListWrapperProps = {
/** Whether this is a multi-select list */
canSelectMultipleOptions?: boolean;
};
describe('[BaseOptionsList]', () => {
function BaseOptionsListWrapper({canSelectMultipleOptions = false}: BaseOptionsListWrapperProps) {
const [selectedIds, setSelectedIds] = useState<string[]>([]);
const sections = [
{
data: Array.from({length: 10000}, (_, index) => ({
text: `Item ${index}`,
keyForList: `item-${index}`,
isSelected: selectedIds.includes(`item-${index}`),
reportID: `report-${index}`,
})),
isDisabled: false,
shouldShow: true,
title: 'Section 1',
},
{
data: Array.from({length: 10000}, (_, index) => ({
text: `Item ${index}`,
keyForList: `item-${index}`,
isSelected: selectedIds.includes(`item-${index}`),
reportID: `report-${index}`,
})),
isDisabled: false,
shouldShow: true,
title: 'Section 2',
},
];
const onSelectRow = (item: OptionData) => {
if (!item.keyForList) {
return;
}
if (canSelectMultipleOptions) {
if (selectedIds.includes(item.keyForList)) {
setSelectedIds(selectedIds.filter((selectedId) => selectedId === item.keyForList));
} else {
setSelectedIds([...selectedIds, item.keyForList]);
}
} else {
setSelectedIds([item.keyForList]);
}
};
return (
<BaseOptionsList
sections={sections}
headerMessage="Base Options List Header"
onSelectRow={onSelectRow}
canSelectMultipleOptions={canSelectMultipleOptions}
/>
);
}
test('Should render 1 section and a thousand items', () => {
measurePerformance(<BaseOptionsListWrapper />);
});
test('Should press a list item', () => {
// eslint-disable-next-line @typescript-eslint/require-await
const scenario = async (screen: RenderResult) => {
fireEvent.press(screen.getByText('Item 5'));
};
measurePerformance(<BaseOptionsListWrapper />, {scenario});
});
test('Should render multiple selection and select 4 items', () => {
// eslint-disable-next-line @typescript-eslint/require-await
const scenario = async (screen: RenderResult) => {
fireEvent.press(screen.getByText('Item 1'));
fireEvent.press(screen.getByText('Item 2'));
fireEvent.press(screen.getByText('Item 3'));
fireEvent.press(screen.getByText('Item 4'));
};
measurePerformance(<BaseOptionsListWrapper canSelectMultipleOptions />, {scenario});
});
test('Should scroll and select a few items', () => {
const eventData = {
nativeEvent: {
contentOffset: {
y: variables.optionRowHeight * 5,
},
contentSize: {
// Dimensions of the scrollable content
height: variables.optionRowHeight * 10,
width: 100,
},
layoutMeasurement: {
// Dimensions of the device
height: variables.optionRowHeight * 5,
width: 100,
},
},
};
// eslint-disable-next-line @typescript-eslint/require-await
const scenario = async (screen: RenderResult) => {
fireEvent.press(screen.getByText('Item 1'));
// see https://github.com/callstack/react-native-testing-library/issues/1540
fireEvent(screen.getByTestId('options-list'), 'onContentSizeChange', eventData.nativeEvent.contentSize.width, eventData.nativeEvent.contentSize.height);
fireEvent.scroll(screen.getByTestId('options-list'), eventData);
fireEvent.press(screen.getByText('Item 7'));
fireEvent.press(screen.getByText('Item 15'));
};
measurePerformance(<BaseOptionsListWrapper canSelectMultipleOptions />, {scenario});
});
});