@@ -1489,4 +1489,54 @@ describe('useForm()', () => {
14891489 form . setValues ( { file : f2 } ) ;
14901490 expect ( form . values . file ) . toEqual ( f2 ) ;
14911491 } ) ;
1492+
1493+ // #4996
1494+ test ( 'resetField with undefined value should not prevent form from becoming valid' , async ( ) => {
1495+ let form ! : FormContext < { name : string } > ;
1496+
1497+ mountWithHoc ( {
1498+ setup ( ) {
1499+ form = useForm ( {
1500+ validationSchema : z . object ( {
1501+ name : z . string ( ) . min ( 1 ) ,
1502+ } ) ,
1503+ } ) ;
1504+
1505+ form . defineField ( 'name' ) ;
1506+
1507+ return { } ;
1508+ } ,
1509+ template : `
1510+ <div></div>
1511+ ` ,
1512+ } ) ;
1513+
1514+ await flushPromises ( ) ;
1515+
1516+ // Fill in a valid value and validate
1517+ form . setFieldValue ( 'name' , 'John' ) ;
1518+ await flushPromises ( ) ;
1519+
1520+ const pending1 = form . validate ( ) ;
1521+ await flushPromises ( ) ;
1522+ const result1 = await pending1 ;
1523+ expect ( result1 . valid ) . toBe ( true ) ;
1524+ expect ( form . meta . value . valid ) . toBe ( true ) ;
1525+
1526+ // Reset field with undefined value using form-level resetField
1527+ form . resetField ( 'name' , { value : undefined } ) ;
1528+ await flushPromises ( ) ;
1529+
1530+ // After reset, validated should be false so that subsequent validation works correctly
1531+ const pathState = form . getPathState ( 'name' ) ;
1532+ expect ( pathState ?. validated ) . toBe ( false ) ;
1533+
1534+ // Now fill in a valid value again
1535+ form . setFieldValue ( 'name' , 'Jane' ) ;
1536+ await flushPromises ( ) ;
1537+
1538+ // The form should be valid again
1539+ expect ( form . meta . value . valid ) . toBe ( true ) ;
1540+ expect ( form . errors . value . name ) . toBeUndefined ( ) ;
1541+ } ) ;
14921542} ) ;
0 commit comments