-
Notifications
You must be signed in to change notification settings - Fork 10
/
unCollectedChildren.test.tsx
87 lines (68 loc) · 2 KB
/
unCollectedChildren.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
/**
* Child components that render items in an array should not need to be wrapped in collect()
*/
import React from 'react';
import { render } from '@testing-library/react';
import {
afterChange,
collect,
store as globalStore,
WithStoreProp,
} from '../..';
import { TaskType } from '../testUtils';
globalStore.tasks = [
{ id: 0, name: 'task 0', done: false },
{ id: 1, name: 'task 1', done: false },
];
const handleChange = jest.fn();
let taskListRenderCount = 0;
let taskRenderCount = 0;
afterChange(handleChange);
afterEach(() => {
handleChange.mockClear();
});
type Props = {
task: TaskType;
};
const Task = React.memo(({ task }: Props) => {
taskRenderCount++;
return (
<label>
<input
type="checkbox"
checked={task.done}
onChange={(e) => {
// eslint-disable-next-line no-param-reassign
task.done = e.target.checked;
}}
/>
{task.name}
</label>
);
});
const TaskList = ({ store }: WithStoreProp) => {
taskListRenderCount++;
return (
<div>
{store.tasks &&
store.tasks.map((task) => <Task key={task.name} task={task} />)}
</div>
);
};
const CollectedTaskList = collect(TaskList);
it('should update a parent component when a prop is changed on a child component', () => {
const { getByText, getByLabelText } = render(<CollectedTaskList />);
const getInputByLabelText = (text: string) =>
getByLabelText(text) as HTMLInputElement;
expect(taskListRenderCount).toBe(1);
expect(taskRenderCount).toBe(2);
getByText('task 0');
expect(getInputByLabelText('task 0').checked).toBe(false);
getByLabelText('task 0').click(); // in the <Task>
const changeEvent = handleChange.mock.calls[0][0];
expect(changeEvent.changedProps).toEqual(['tasks.0.done']);
expect(changeEvent.renderedComponents[0]._name).toBe('TaskList');
expect(taskListRenderCount).toBe(2);
expect(taskRenderCount).toBe(3); // only one task should update
expect(getInputByLabelText('task 0').checked).toBe(true);
});