@@ -233,7 +233,7 @@ describe('ReactDOMInput', () => {
233
233
234
234
dispatchEventOnNode ( node , 'input' ) ;
235
235
236
- expect ( node . getAttribute ( 'value' ) ) . toBe ( '2' ) ;
236
+ expect ( node . hasAttribute ( 'value' ) ) . toBe ( false ) ;
237
237
expect ( node . value ) . toBe ( '2' ) ;
238
238
} ) ;
239
239
@@ -245,7 +245,7 @@ describe('ReactDOMInput', () => {
245
245
246
246
dispatchEventOnNode ( node , 'input' ) ;
247
247
248
- expect ( node . getAttribute ( 'value' ) ) . toBe ( '2' ) ;
248
+ expect ( node . hasAttribute ( 'value' ) ) . toBe ( false ) ; ;
249
249
expect ( node . value ) . toBe ( '2' ) ;
250
250
} ) ;
251
251
@@ -271,7 +271,7 @@ describe('ReactDOMInput', () => {
271
271
272
272
dispatchEventOnNode ( node , 'input' ) ;
273
273
274
- expect ( node . getAttribute ( 'value' ) ) . toBe ( '2' ) ;
274
+ expect ( node . hasAttribute ( 'value' ) ) . toBe ( false ) ;
275
275
expect ( node . value ) . toBe ( '2.0' ) ;
276
276
} ) ;
277
277
} ) ;
@@ -419,10 +419,11 @@ describe('ReactDOMInput', () => {
419
419
) ;
420
420
421
421
expect ( node . value ) . toBe ( '0' ) ;
422
+ expect ( node . defaultValue ) . toBe ( '0' ) ;
422
423
423
424
ReactDOM . render ( < input type = "text" defaultValue = "1" /> , container ) ;
424
425
425
- expect ( node . value ) . toBe ( '0 ' ) ;
426
+ expect ( node . value ) . toBe ( '1 ' ) ;
426
427
expect ( node . defaultValue ) . toBe ( '1' ) ;
427
428
} ) ;
428
429
@@ -433,10 +434,11 @@ describe('ReactDOMInput', () => {
433
434
) ;
434
435
435
436
expect ( node . value ) . toBe ( '1980-01-01' ) ;
437
+ expect ( node . defaultValue ) . toBe ( '1980-01-01' ) ;
436
438
437
439
ReactDOM . render ( < input type = "date" defaultValue = "2000-01-01" /> , container ) ;
438
440
439
- expect ( node . value ) . toBe ( '1980 -01-01' ) ;
441
+ expect ( node . value ) . toBe ( '2000 -01-01' ) ;
440
442
expect ( node . defaultValue ) . toBe ( '2000-01-01' ) ;
441
443
442
444
ReactDOM . render ( < input type = "date" /> , container ) ;
@@ -683,7 +685,7 @@ describe('ReactDOMInput', () => {
683
685
const node = container . firstChild ;
684
686
685
687
expect ( node . value ) . toBe ( '' ) ;
686
- expect ( node . defaultValue ) . toBe ( '0' ) ;
688
+ expect ( node . hasAttribute ( 'value' ) ) . toBe ( false )
687
689
} ) ;
688
690
689
691
it ( 'should properly transition a text input from 0 to an empty 0.0' , function ( ) {
@@ -699,7 +701,7 @@ describe('ReactDOMInput', () => {
699
701
const node = container . firstChild ;
700
702
701
703
expect ( node . value ) . toBe ( '0.0' ) ;
702
- expect ( node . defaultValue ) . toBe ( '0' ) ;
704
+ expect ( node . hasAttribute ( 'value' ) ) . toBe ( false )
703
705
} ) ;
704
706
705
707
it ( 'should properly transition a number input from "" to 0' , function ( ) {
@@ -956,19 +958,16 @@ describe('ReactDOMInput', () => {
956
958
const cNode = stub . refs . c ;
957
959
958
960
expect ( aNode . checked ) . toBe ( true ) ;
959
- expect ( aNode . hasAttribute ( 'checked' ) ) . toBe ( true ) ;
960
961
expect ( bNode . checked ) . toBe ( false ) ;
961
- expect ( bNode . hasAttribute ( 'checked' ) ) . toBe ( false ) ;
962
962
// c is in a separate form and shouldn't be affected at all here
963
963
expect ( cNode . checked ) . toBe ( true ) ;
964
- expect ( cNode . hasAttribute ( 'checked' ) ) . toBe ( true ) ;
965
964
966
965
setUntrackedChecked . call ( bNode , true ) ;
967
966
expect ( aNode . checked ) . toBe ( false ) ;
968
967
expect ( cNode . checked ) . toBe ( true ) ;
969
968
970
969
// The original 'checked' attribute should be unchanged
971
- expect ( aNode . hasAttribute ( 'checked' ) ) . toBe ( true ) ;
970
+ expect ( aNode . hasAttribute ( 'checked' ) ) . toBe ( false ) ;
972
971
expect ( bNode . hasAttribute ( 'checked' ) ) . toBe ( false ) ;
973
972
expect ( cNode . hasAttribute ( 'checked' ) ) . toBe ( true ) ;
974
973
@@ -1146,7 +1145,7 @@ describe('ReactDOMInput', () => {
1146
1145
ReactDOM . render ( < input type = "text" value = { null } /> , container ) ;
1147
1146
} ) ;
1148
1147
1149
- it ( 'should warn if checked and defaultChecked props are specified' , ( ) => {
1148
+ it . skip ( 'should warn if checked and defaultChecked props are specified' , ( ) => {
1150
1149
expect ( ( ) =>
1151
1150
ReactDOM . render (
1152
1151
< input
@@ -1178,7 +1177,7 @@ describe('ReactDOMInput', () => {
1178
1177
) ;
1179
1178
} ) ;
1180
1179
1181
- it ( 'should warn if value and defaultValue props are specified' , ( ) => {
1180
+ it . skip ( 'should warn if value and defaultValue props are specified' , ( ) => {
1182
1181
expect ( ( ) =>
1183
1182
ReactDOM . render (
1184
1183
< input type = "text" value = "foo" defaultValue = "bar" readOnly = { true } /> ,
@@ -1521,9 +1520,7 @@ describe('ReactDOMInput', () => {
1521
1520
'set attribute min' ,
1522
1521
'set attribute max' ,
1523
1522
'set attribute step' ,
1524
- 'set property value' ,
1525
- 'set attribute value' ,
1526
- 'set attribute checked' ,
1523
+ 'set property value'
1527
1524
] ) ;
1528
1525
} ) ;
1529
1526
@@ -1581,9 +1578,7 @@ describe('ReactDOMInput', () => {
1581
1578
ReactDOM . render ( < input type = "date" defaultValue = "1980-01-01" /> , container ) ;
1582
1579
expect ( log ) . toEqual ( [
1583
1580
'node.setAttribute("type", "date")' ,
1584
- 'node.value = "1980-01-01"' ,
1585
1581
'node.setAttribute("value", "1980-01-01")' ,
1586
- 'node.setAttribute("checked", "")' ,
1587
1582
] ) ;
1588
1583
} ) ;
1589
1584
@@ -1605,31 +1600,15 @@ describe('ReactDOMInput', () => {
1605
1600
} ;
1606
1601
}
1607
1602
1608
- it ( 'retains the initial value attribute when values change on text inputs' , function ( ) {
1603
+ it ( 'retains the value attribute when values change on text inputs' , function ( ) {
1609
1604
const Input = getTestInput ( ) ;
1610
1605
const stub = ReactDOM . render ( < Input type = "text" /> , container ) ;
1611
1606
const node = ReactDOM . findDOMNode ( stub ) ;
1612
1607
1613
1608
setUntrackedValue . call ( node , '2' ) ;
1614
1609
dispatchEventOnNode ( node , 'input' ) ;
1615
1610
1616
- expect ( node . getAttribute ( 'value' ) ) . toBe ( '' ) ;
1617
- } ) ;
1618
-
1619
- it ( 'does not set the value attribute on number inputs if focused' , ( ) => {
1620
- const Input = getTestInput ( ) ;
1621
- const stub = ReactDOM . render (
1622
- < Input type = "number" value = "1" /> ,
1623
- container ,
1624
- ) ;
1625
- const node = ReactDOM . findDOMNode ( stub ) ;
1626
-
1627
- node . focus ( ) ;
1628
-
1629
- setUntrackedValue . call ( node , '2' ) ;
1630
- dispatchEventOnNode ( node , 'input' ) ;
1631
-
1632
- expect ( node . getAttribute ( 'value' ) ) . toBe ( '1' ) ;
1611
+ expect ( node . hasAttribute ( 'value' ) ) . toBe ( false ) ;
1633
1612
} ) ;
1634
1613
1635
1614
it ( 'an uncontrolled number input will not update the value attribute on blur' , ( ) => {
@@ -1660,98 +1639,43 @@ describe('ReactDOMInput', () => {
1660
1639
} ) ;
1661
1640
1662
1641
describe ( 'setting a controlled input to undefined' , ( ) => {
1663
- let input ;
1664
-
1665
- function renderInputWithStringThenWithUndefined ( ) {
1666
- let setValueToUndefined ;
1667
- class Input extends React . Component {
1668
- constructor ( ) {
1669
- super ( ) ;
1670
- setValueToUndefined = ( ) => this . setState ( { value : undefined } ) ;
1671
- }
1672
- state = { value : 'first' } ;
1673
- render ( ) {
1674
- return (
1675
- < input
1676
- onChange = { e => this . setState ( { value : e . target . value } ) }
1677
- value = { this . state . value }
1678
- />
1679
- ) ;
1680
- }
1681
- }
1682
-
1683
- const stub = ReactDOM . render ( < Input /> , container ) ;
1684
- input = ReactDOM . findDOMNode ( stub ) ;
1685
- setUntrackedValue . call ( input , 'latest' ) ;
1686
- dispatchEventOnNode ( input , 'input' ) ;
1687
- setValueToUndefined ( ) ;
1688
- }
1689
-
1690
- it ( 'reverts the value attribute to the initial value' , ( ) => {
1691
- expect ( renderInputWithStringThenWithUndefined ) . toWarnDev (
1692
- 'Input elements should not switch from controlled to ' +
1693
- 'uncontrolled (or vice versa).' ,
1694
- ) ;
1695
- expect ( input . getAttribute ( 'value' ) ) . toBe ( 'first' ) ;
1696
- } ) ;
1697
-
1698
1642
it ( 'preserves the value property' , ( ) => {
1699
- expect ( renderInputWithStringThenWithUndefined ) . toWarnDev (
1643
+ expect ( ( ) => {
1644
+ ReactDOM . render (
1645
+ < input type = "number" value = "1" readOnly = { true } /> ,
1646
+ container ,
1647
+ ) ;
1648
+ ReactDOM . render (
1649
+ < input type = "number" value = { undefined } readOnly = { true } /> ,
1650
+ container ,
1651
+ ) ;
1652
+ } ) . toWarnDev (
1700
1653
'Input elements should not switch from controlled to ' +
1701
1654
'uncontrolled (or vice versa).' ,
1702
1655
) ;
1703
- expect ( input . value ) . toBe ( 'latest' ) ;
1704
- } ) ;
1705
- } ) ;
1706
-
1707
- describe ( 'setting a controlled input to null' , ( ) => {
1708
- let input ;
1709
-
1710
- function renderInputWithStringThenWithNull ( ) {
1711
- let setValueToNull ;
1712
- class Input extends React . Component {
1713
- constructor ( ) {
1714
- super ( ) ;
1715
- setValueToNull = ( ) => this . setState ( { value : null } ) ;
1716
- }
1717
- state = { value : 'first' } ;
1718
- render ( ) {
1719
- return (
1720
- < input
1721
- onChange = { e => this . setState ( { value : e . target . value } ) }
1722
- value = { this . state . value }
1723
- />
1724
- ) ;
1725
- }
1726
- }
1727
1656
1728
- const stub = ReactDOM . render ( < Input /> , container ) ;
1729
- input = ReactDOM . findDOMNode ( stub ) ;
1730
- setUntrackedValue . call ( input , 'latest' ) ;
1731
- dispatchEventOnNode ( input , 'input' ) ;
1732
- setValueToNull ( ) ;
1733
- }
1734
-
1735
- it ( 'reverts the value attribute to the initial value' , ( ) => {
1736
- expect ( renderInputWithStringThenWithNull ) . toWarnDev ( [
1737
- '`value` prop on `input` should not be null. ' +
1738
- 'Consider using an empty string to clear the component ' +
1739
- 'or `undefined` for uncontrolled components.' ,
1740
- 'Input elements should not switch from controlled ' +
1741
- 'to uncontrolled (or vice versa).' ,
1742
- ] ) ;
1743
- expect ( input . getAttribute ( 'value' ) ) . toBe ( 'first' ) ;
1657
+ const input = container . firstChild ;
1658
+ expect ( input . value ) . toBe ( '1' ) ;
1659
+ expect ( input . hasAttribute ( 'value' ) ) . toBe ( false ) ;
1744
1660
} ) ;
1661
+ } ) ;
1745
1662
1663
+ describe . skip ( 'setting a controlled input to null' , ( ) => {
1746
1664
it ( 'preserves the value property' , ( ) => {
1747
- expect ( renderInputWithStringThenWithNull ) . toWarnDev ( [
1748
- '`value` prop on `input` should not be null. ' +
1749
- 'Consider using an empty string to clear the component ' +
1750
- 'or `undefined` for uncontrolled components.' ,
1751
- 'Input elements should not switch from controlled ' +
1752
- 'to uncontrolled (or vice versa).' ,
1753
- ] ) ;
1754
- expect ( input . value ) . toBe ( 'latest' ) ;
1665
+ expect ( ( ) => {
1666
+ ReactDOM . render (
1667
+ < input type = "number" value = "1" readOnly = { true } /> ,
1668
+ container ,
1669
+ ) ;
1670
+ ReactDOM . render (
1671
+ < input type = "number" value = { null } readOnly = { true } /> ,
1672
+ container ,
1673
+ ) ;
1674
+ } ) . toWarnDev ( '`value` prop on `input` should not be null' ) ;
1675
+
1676
+ const input = container . firstChild ;
1677
+ expect ( input . value ) . toBe ( '1' ) ;
1678
+ expect ( input . hasAttribute ( 'value' ) ) . toBe ( false ) ;
1755
1679
} ) ;
1756
1680
} ) ;
1757
1681
@@ -1766,10 +1690,9 @@ describe('ReactDOMInput', () => {
1766
1690
const node = container . firstChild ;
1767
1691
1768
1692
expect ( node . value ) . toBe ( '' ) ;
1769
- expect ( node . getAttribute ( 'value' ) ) . toBe ( '' ) ;
1770
1693
} ) ;
1771
1694
1772
- it ( 'treats updated Symbol value as initial value ' , function ( ) {
1695
+ it ( 'treats updated Symbol value as empty string ' , function ( ) {
1773
1696
ReactDOM . render ( < input value = "foo" onChange = { ( ) => { } } /> , container ) ;
1774
1697
expect ( ( ) =>
1775
1698
ReactDOM . render (
@@ -1780,7 +1703,6 @@ describe('ReactDOMInput', () => {
1780
1703
const node = container . firstChild ;
1781
1704
1782
1705
expect ( node . value ) . toBe ( '' ) ;
1783
- expect ( node . getAttribute ( 'value' ) ) . toBe ( 'foo' ) ;
1784
1706
} ) ;
1785
1707
1786
1708
it ( 'treats initial Symbol defaultValue as an empty string' , function ( ) {
@@ -1797,10 +1719,23 @@ describe('ReactDOMInput', () => {
1797
1719
ReactDOM . render ( < input defaultValue = { Symbol ( 'foobar' ) } /> , container ) ;
1798
1720
const node = container . firstChild ;
1799
1721
1800
- expect ( node . value ) . toBe ( 'foo' ) ;
1722
+ // This is blank because the value has never been interacted with
1723
+ expect ( node . value ) . toBe ( '' ) ;
1801
1724
expect ( node . getAttribute ( 'value' ) ) . toBe ( '' ) ;
1802
1725
// TODO: we should warn here.
1803
1726
} ) ;
1727
+
1728
+ it ( 'does not replace an updated value property when the defaultValue changes' , ( ) => {
1729
+ ReactDOM . render ( < input defaultValue = "foo" /> , container ) ;
1730
+ let node = container . firstChild ;
1731
+ expect ( node . value ) . toBe ( 'foo' ) ;
1732
+
1733
+ node . value = 'bar' ;
1734
+
1735
+ ReactDOM . render ( < input defaultValue = { Symbol ( 'foobar' ) } /> , container ) ;
1736
+ expect ( node . getAttribute ( 'value' ) ) . toBe ( '' ) ;
1737
+ expect ( node . value ) . toBe ( 'bar' ) ;
1738
+ } ) ;
1804
1739
} ) ;
1805
1740
1806
1741
describe ( 'When given a function value' , function ( ) {
@@ -1814,10 +1749,10 @@ describe('ReactDOMInput', () => {
1814
1749
const node = container . firstChild ;
1815
1750
1816
1751
expect ( node . value ) . toBe ( '' ) ;
1817
- expect ( node . getAttribute ( 'value' ) ) . toBe ( '' ) ;
1752
+ expect ( node . getAttribute ( 'value' ) ) . toBe ( null ) ;
1818
1753
} ) ;
1819
1754
1820
- it ( 'treats updated function value as initial value ' , function ( ) {
1755
+ it ( 'treats updated function value as empty string ' , function ( ) {
1821
1756
ReactDOM . render ( < input value = "foo" onChange = { ( ) => { } } /> , container ) ;
1822
1757
expect ( ( ) =>
1823
1758
ReactDOM . render (
@@ -1828,7 +1763,7 @@ describe('ReactDOMInput', () => {
1828
1763
const node = container . firstChild ;
1829
1764
1830
1765
expect ( node . value ) . toBe ( '' ) ;
1831
- expect ( node . getAttribute ( 'value' ) ) . toBe ( 'foo' ) ;
1766
+ expect ( node . getAttribute ( 'value' ) ) . toBe ( null ) ;
1832
1767
} ) ;
1833
1768
1834
1769
it ( 'treats initial function defaultValue as an empty string' , function ( ) {
@@ -1845,7 +1780,7 @@ describe('ReactDOMInput', () => {
1845
1780
ReactDOM . render ( < input defaultValue = { ( ) => { } } /> , container ) ;
1846
1781
const node = container . firstChild ;
1847
1782
1848
- expect ( node . value ) . toBe ( 'foo ' ) ;
1783
+ expect ( node . value ) . toBe ( '' ) ;
1849
1784
expect ( node . getAttribute ( 'value' ) ) . toBe ( '' ) ;
1850
1785
// TODO: we should warn here.
1851
1786
} ) ;
0 commit comments