Skip to content

Commit 98f146c

Browse files
authored
Fix Textarea debounce bug (#858)
* Update textarea tests * Fix textarea debounce bug
1 parent 5961ba1 commit 98f146c

File tree

2 files changed

+23
-33
lines changed

2 files changed

+23
-33
lines changed

src/components/input/Textarea.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,14 @@ const Textarea = props => {
5757
}
5858
};
5959

60-
const onBlur = () => {
60+
const onBlur = e => {
6161
if (setProps) {
6262
const payload = {
6363
n_blur: n_blur + 1,
6464
n_blur_timestamp: Date.now()
6565
};
6666
if (debounce) {
67-
payload.value = value;
67+
payload.value = e.target.value;
6868
}
6969
setProps(payload);
7070
}
@@ -77,7 +77,7 @@ const Textarea = props => {
7777
n_submit_timestamp: Date.now()
7878
};
7979
if (debounce) {
80-
payload.value = value;
80+
payload.value = e.target.value;
8181
}
8282
setProps(payload);
8383
}

src/components/input/__tests__/Textarea.test.js

Lines changed: 20 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -98,14 +98,11 @@ describe('Textarea', () => {
9898
});
9999

100100
test('tracks changes with "value" prop', () => {
101-
fireEvent.change(textarea, {
102-
target: {value: 'some-textarea-value'}
103-
});
104-
expect(mockSetProps.mock.calls).toHaveLength(1);
105-
expect(mockSetProps.mock.calls[0][0]).toEqual({
106-
value: 'some-textarea-value'
107-
});
108-
expect(textarea).toHaveValue('some-textarea-value');
101+
userEvent.type(textarea, 'some text');
102+
// one setProps call for click, and then 9 characters
103+
expect(mockSetProps.mock.calls).toHaveLength(10);
104+
expect(mockSetProps.mock.calls[9][0]).toEqual({value: 'some text'});
105+
expect(textarea).toHaveValue('some text');
109106
});
110107

111108
test('dispatches update for each typed character', () => {
@@ -160,55 +157,48 @@ describe('Textarea', () => {
160157
beforeEach(() => {
161158
mockSetProps = jest.fn();
162159
const {container} = render(
163-
<Textarea
164-
setProps={mockSetProps}
165-
value="some-textarea-value"
166-
debounce
167-
/>
160+
<Textarea setProps={mockSetProps} value="" debounce />
168161
);
169162
textarea = container.firstChild;
170163
});
171164

172165
test("don't call setProps on change if debounce is true", () => {
173-
fireEvent.change(textarea, {
174-
target: {value: 'some-textarea-value'}
175-
});
176-
expect(mockSetProps.mock.calls).toHaveLength(0);
177-
expect(textarea).toHaveValue('some-textarea-value');
166+
userEvent.type(textarea, 'some text');
167+
// one call to setProps for clicking on the textarea
168+
expect(mockSetProps.mock.calls).toHaveLength(1);
169+
expect(textarea).toHaveValue('some text');
178170
});
179171

180172
test('dispatch value on blur if debounce is true', () => {
173+
userEvent.type(textarea, 'some text');
181174
const before = Date.now();
182175
fireEvent.blur(textarea);
183176
const after = Date.now();
184177

185-
expect(mockSetProps.mock.calls).toHaveLength(1);
178+
expect(mockSetProps.mock.calls).toHaveLength(2);
186179

187-
const [[{n_blur, n_blur_timestamp, value}]] = mockSetProps.mock.calls;
180+
const [{n_blur, n_blur_timestamp, value}] = mockSetProps.mock.calls[1];
188181
expect(n_blur).toEqual(1);
189182
expect(n_blur_timestamp).toBeGreaterThanOrEqual(before);
190183
expect(n_blur_timestamp).toBeLessThanOrEqual(after);
191-
expect(value).toEqual('some-textarea-value');
184+
expect(value).toEqual('some text');
192185
});
193186

194187
test('dispatch value on submit if debounce is true', () => {
195188
const before = Date.now();
196-
fireEvent.keyPress(textarea, {
197-
key: 'Enter',
198-
code: 13,
199-
charCode: 13
200-
});
189+
userEvent.type(textarea, 'some text{enter}');
201190
const after = Date.now();
202191

203-
expect(mockSetProps.mock.calls).toHaveLength(1);
192+
// one click and one submit
193+
expect(mockSetProps.mock.calls).toHaveLength(2);
204194

205195
const [
206-
[{n_submit, n_submit_timestamp, value}]
207-
] = mockSetProps.mock.calls;
196+
{n_submit, n_submit_timestamp, value}
197+
] = mockSetProps.mock.calls[1];
208198
expect(n_submit).toEqual(1);
209199
expect(n_submit_timestamp).toBeGreaterThanOrEqual(before);
210200
expect(n_submit_timestamp).toBeLessThanOrEqual(after);
211-
expect(value).toEqual('some-textarea-value');
201+
expect(value).toEqual('some text');
212202
});
213203
});
214204
});

0 commit comments

Comments
 (0)