@@ -16,11 +16,25 @@ describe('ReactDOMEventListener', () => {
16
16
let ReactDOMServer ;
17
17
let act ;
18
18
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
+ }
19
25
20
26
beforeEach ( ( ) => {
21
27
jest . resetModules ( ) ;
22
28
React = require ( 'react' ) ;
23
29
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 ;
24
38
ReactDOMClient = require ( 'react-dom/client' ) ;
25
39
ReactDOMServer = require ( 'react-dom/server' ) ;
26
40
act = require ( 'internal-test-utils' ) . act ;
@@ -443,6 +457,74 @@ describe('ReactDOMEventListener', () => {
443
457
}
444
458
} ) ;
445
459
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
+
446
528
it ( 'should dispatch loadstart only for media elements' , async ( ) => {
447
529
const container = document . createElement ( 'div' ) ;
448
530
document . body . appendChild ( container ) ;
0 commit comments