Skip to content

Commit ddf843c

Browse files
committed
Added tests for reset form action when default action is prevented
1 parent ae9017c commit ddf843c

File tree

1 file changed

+82
-0
lines changed

1 file changed

+82
-0
lines changed

packages/react-dom/src/__tests__/ReactDOMEventListener-test.js

+82
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,25 @@ describe('ReactDOMEventListener', () => {
1616
let ReactDOMServer;
1717
let act;
1818
let simulateEventDispatch;
19+
let setUntrackedValue;
20+
let setUntrackedChecked;
21+
22+
function dispatchEventOnNode(node, type) {
23+
node.dispatchEvent(new Event(type, {bubbles: true, cancelable: true}));
24+
}
1925

2026
beforeEach(() => {
2127
jest.resetModules();
2228
React = require('react');
2329
ReactDOM = require('react-dom');
30+
setUntrackedValue = Object.getOwnPropertyDescriptor(
31+
HTMLInputElement.prototype,
32+
'value',
33+
).set;
34+
setUntrackedChecked = Object.getOwnPropertyDescriptor(
35+
HTMLInputElement.prototype,
36+
'checked',
37+
).set;
2438
ReactDOMClient = require('react-dom/client');
2539
ReactDOMServer = require('react-dom/server');
2640
act = require('internal-test-utils').act;
@@ -443,6 +457,74 @@ describe('ReactDOMEventListener', () => {
443457
}
444458
});
445459

460+
describe('form resetting', () => {
461+
it('should not reset form if is prevented', async () => {
462+
const container = document.createElement('div');
463+
document.body.appendChild(container);
464+
465+
try {
466+
const textRef = React.createRef();
467+
const buttonRef = React.createRef();
468+
469+
const handleChangeTextBox = jest.fn();
470+
471+
class Form extends React.Component {
472+
state = {text: 'test'};
473+
474+
render() {
475+
return (
476+
<form>
477+
<input
478+
ref={textRef}
479+
defaultValue="test"
480+
onChange={event => {
481+
this.setState({text: event.target.value});
482+
handleChangeTextBox(event);
483+
}}
484+
/>
485+
<button
486+
onClick={event => {
487+
event.preventDefault();
488+
}}
489+
ref={buttonRef}
490+
type="reset">
491+
reset
492+
</button>
493+
</form>
494+
);
495+
}
496+
}
497+
498+
const root = ReactDOMClient.createRoot(container);
499+
await act(() => {
500+
root.render(<Form />);
501+
});
502+
503+
await act(() => {
504+
setUntrackedValue.call(textRef.current, 'test1');
505+
dispatchEventOnNode(textRef.current, 'input');
506+
});
507+
508+
expect(handleChangeTextBox).toHaveBeenCalledTimes(1);
509+
510+
await act(() => {
511+
buttonRef.current.click();
512+
});
513+
514+
expect(textRef.current.value).toEqual('test1');
515+
516+
await act(() => {
517+
setUntrackedValue.call(textRef.current, 'test1');
518+
dispatchEventOnNode(textRef.current, 'input');
519+
});
520+
521+
expect(handleChangeTextBox).toHaveBeenCalledTimes(1);
522+
} finally {
523+
document.body.removeChild(container);
524+
}
525+
});
526+
});
527+
446528
it('should dispatch loadstart only for media elements', async () => {
447529
const container = document.createElement('div');
448530
document.body.appendChild(container);

0 commit comments

Comments
 (0)