react-dropzone 11.2.0 → 11.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/index.spec.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /* eslint react/prop-types: 0, jsx-a11y/label-has-for: 0 */
2
2
  import React, { createRef } from 'react'
3
- import { cleanup, fireEvent, render } from '@testing-library/react'
3
+ import { act, cleanup, fireEvent, render, waitFor } from '@testing-library/react'
4
4
  import { renderHook } from '@testing-library/react-hooks'
5
5
  import { fromEvent } from 'file-selector'
6
6
  import * as utils from './utils'
@@ -148,7 +148,7 @@ describe('useDropzone() hook', () => {
148
148
  expect(dropzone).toHaveAttribute('aria-label', ariaLabel)
149
149
  })
150
150
 
151
- it('runs the custom callback handlers provided to the root props getter', () => {
151
+ it('runs the custom callback handlers provided to the root props getter', async () => {
152
152
  const event = createDtWithFiles(files)
153
153
 
154
154
  const rootProps = {
@@ -172,7 +172,7 @@ describe('useDropzone() hook', () => {
172
172
  </Dropzone>
173
173
  )
174
174
 
175
- const { container } = render(ui)
175
+ const { container, rerender } = render(ui)
176
176
 
177
177
  const dropzone = container.querySelector('div')
178
178
 
@@ -188,6 +188,7 @@ describe('useDropzone() hook', () => {
188
188
  expect(rootProps.onBlur).toHaveBeenCalled()
189
189
 
190
190
  fireEvent.dragEnter(dropzone, event)
191
+ await flushPromises(rerender, ui)
191
192
  expect(rootProps.onDragEnter).toHaveBeenCalled()
192
193
 
193
194
  fireEvent.dragOver(dropzone, event)
@@ -197,10 +198,11 @@ describe('useDropzone() hook', () => {
197
198
  expect(rootProps.onDragLeave).toHaveBeenCalled()
198
199
 
199
200
  fireEvent.drop(dropzone, event)
201
+ await flushPromises(rerender, ui)
200
202
  expect(rootProps.onDrop).toHaveBeenCalled()
201
203
  })
202
204
 
203
- it('runs the custom callback handlers provided to the input props getter', () => {
205
+ it('runs the custom callback handlers provided to the input props getter', async () => {
204
206
  const inputProps = {
205
207
  onClick: jest.fn(),
206
208
  onChange: jest.fn()
@@ -216,14 +218,16 @@ describe('useDropzone() hook', () => {
216
218
  </Dropzone>
217
219
  )
218
220
 
219
- const { container } = render(ui)
221
+ const { container, rerender } = render(ui)
220
222
 
221
223
  const input = container.querySelector('input')
222
224
 
223
225
  fireEvent.click(input)
226
+ await flushPromises(rerender, ui)
224
227
  expect(inputProps.onClick).toHaveBeenCalled()
225
228
 
226
229
  fireEvent.change(input)
230
+ await flushPromises(rerender, ui)
227
231
  expect(inputProps.onChange).toHaveBeenCalled()
228
232
  })
229
233
 
@@ -308,7 +312,7 @@ describe('useDropzone() hook', () => {
308
312
  const dropzoneRef = createRef()
309
313
  const onClickSpy = jest.spyOn(HTMLInputElement.prototype, 'click')
310
314
 
311
- const { rerender } = render(
315
+ const ui = (
312
316
  <Dropzone ref={dropzoneRef}>
313
317
  {({ getRootProps, getInputProps, isFocused }) => (
314
318
  <div {...getRootProps()}>
@@ -319,11 +323,12 @@ describe('useDropzone() hook', () => {
319
323
  </Dropzone>
320
324
  )
321
325
 
326
+ const { rerender } = render(ui)
327
+
322
328
  expect(dropzoneRef.current).not.toBeNull()
323
329
  expect(typeof dropzoneRef.current.open).toEqual('function')
324
330
 
325
- dropzoneRef.current.open()
326
-
331
+ act(() => dropzoneRef.current.open())
327
332
  expect(onClickSpy).toHaveBeenCalled()
328
333
 
329
334
  rerender(null)
@@ -336,7 +341,7 @@ describe('useDropzone() hook', () => {
336
341
  const setRef = ref => (dropzoneRef = ref)
337
342
  const onClickSpy = jest.spyOn(HTMLInputElement.prototype, 'click')
338
343
 
339
- const { rerender } = render(
344
+ const ui = (
340
345
  <Dropzone ref={setRef}>
341
346
  {({ getRootProps, getInputProps, isFocused }) => (
342
347
  <div {...getRootProps()}>
@@ -347,15 +352,15 @@ describe('useDropzone() hook', () => {
347
352
  </Dropzone>
348
353
  )
349
354
 
355
+ const { rerender } = render(ui)
356
+
350
357
  expect(dropzoneRef).not.toBeNull()
351
358
  expect(typeof dropzoneRef.open).toEqual('function')
352
359
 
353
- dropzoneRef.open()
354
-
360
+ act(() => dropzoneRef.open())
355
361
  expect(onClickSpy).toHaveBeenCalled()
356
362
 
357
363
  rerender(null)
358
-
359
364
  expect(dropzoneRef).toBeNull()
360
365
  })
361
366
 
@@ -499,12 +504,12 @@ describe('useDropzone() hook', () => {
499
504
  </Dropzone>
500
505
  )
501
506
 
502
- const { container } = render(ui)
507
+ const { container, rerender } = render(ui)
503
508
  const dropzone = container.querySelector('#dropzone')
504
509
 
505
510
  const fn = async () => {
506
511
  fireDrop(dropzone, data)
507
- await flushPromises(ui, container)
512
+ await flushPromises(rerender, ui)
508
513
  done()
509
514
  }
510
515
 
@@ -665,7 +670,7 @@ describe('useDropzone() hook', () => {
665
670
  const dropEvt = new Event('drop', { bubbles: true })
666
671
  const dropEvtPreventDefaultSpy = jest.spyOn(dropEvt, 'preventDefault')
667
672
  fireEvent(document.body, dropEvt)
668
- expect(dropEvtPreventDefaultSpy).toHaveBeenCalledTimes(1) // TODO: Figure out who calls the preventDefault()
673
+ expect(dropEvtPreventDefaultSpy).toHaveBeenCalledTimes(0)
669
674
  })
670
675
  })
671
676
 
@@ -708,12 +713,12 @@ describe('useDropzone() hook', () => {
708
713
  </Dropzone>
709
714
  )
710
715
 
711
- const { container } = render(ui)
716
+ const { container, rerender } = render(ui)
712
717
 
713
718
  const innerDropzone = container.querySelector('#inner-dropzone')
714
719
 
715
720
  fireDragEnter(innerDropzone, data)
716
- await flushPromises(ui, container)
721
+ await flushPromises(rerender, ui)
717
722
  expect(innerProps.onDragEnter).toHaveBeenCalled()
718
723
  expect(parentProps.onDragEnter).toHaveBeenCalled()
719
724
 
@@ -726,7 +731,7 @@ describe('useDropzone() hook', () => {
726
731
  expect(parentProps.onDragLeave).toHaveBeenCalled()
727
732
 
728
733
  fireDrop(innerDropzone, data)
729
- await flushPromises(ui, container)
734
+ await flushPromises(rerender, ui)
730
735
  expect(innerProps.onDrop).toHaveBeenCalled()
731
736
  expect(parentProps.onDrop).toHaveBeenCalled()
732
737
  })
@@ -774,12 +779,12 @@ describe('useDropzone() hook', () => {
774
779
  </Dropzone>
775
780
  )
776
781
 
777
- const { container } = render(ui)
782
+ const { container, rerender } = render(ui)
778
783
 
779
784
  const innerDropzone = container.querySelector('#inner-dropzone')
780
785
 
781
786
  fireDragEnter(innerDropzone, data)
782
- await flushPromises(ui, container)
787
+ await flushPromises(rerender, ui)
783
788
  expect(innerProps.onDragEnter).toHaveBeenCalled()
784
789
  expect(parentProps.onDragEnter).not.toHaveBeenCalled()
785
790
 
@@ -792,7 +797,7 @@ describe('useDropzone() hook', () => {
792
797
  expect(parentProps.onDragLeave).not.toHaveBeenCalled()
793
798
 
794
799
  fireDrop(innerDropzone, data)
795
- await flushPromises(ui, container)
800
+ await flushPromises(rerender, ui)
796
801
  expect(innerProps.onDrop).toHaveBeenCalled()
797
802
  expect(parentProps.onDrop).not.toHaveBeenCalled()
798
803
  })
@@ -833,17 +838,17 @@ describe('useDropzone() hook', () => {
833
838
  </Dropzone>
834
839
  )
835
840
 
836
- const { container } = render(ui)
841
+ const { container, rerender } = render(ui)
837
842
 
838
843
  const outerDropzone = container.querySelector('#outer-dropzone')
839
844
  const innerDropzone = container.querySelector('#inner-dropzone')
840
845
 
841
846
  // Sets drag targets on the outer dropzone
842
847
  fireDragEnter(outerDropzone, data)
843
- await flushPromises(ui, container)
848
+ await flushPromises(rerender, ui)
844
849
 
845
850
  fireDragEnter(innerDropzone, data)
846
- await flushPromises(ui, container)
851
+ await flushPromises(rerender, ui)
847
852
  expect(innerProps.onDragEnter).toHaveBeenCalled()
848
853
  expect(parentProps.onDragEnter).toHaveBeenCalledTimes(1)
849
854
 
@@ -856,7 +861,7 @@ describe('useDropzone() hook', () => {
856
861
  expect(parentProps.onDragLeave).not.toHaveBeenCalled()
857
862
 
858
863
  fireDrop(innerDropzone, data)
859
- await flushPromises(ui, container)
864
+ await flushPromises(rerender, ui)
860
865
  expect(innerProps.onDrop).toHaveBeenCalled()
861
866
  expect(parentProps.onDrop).not.toHaveBeenCalled()
862
867
  })
@@ -885,16 +890,16 @@ describe('useDropzone() hook', () => {
885
890
  </Dropzone>
886
891
  )
887
892
 
888
- const { container } = render(ui)
893
+ const { container, rerender } = render(ui)
889
894
 
890
895
  const parentDropzone = container.querySelector('#parent-dropzone')
891
896
 
892
897
  fireDragEnter(parentDropzone, data)
893
- await flushPromises(ui, container)
898
+ await flushPromises(rerender, ui)
894
899
 
895
900
  const innerDropzone = container.querySelector('#inner-dropzone')
896
901
  fireDragEnter(innerDropzone, data)
897
- await flushPromises(ui, container)
902
+ await flushPromises(rerender, ui)
898
903
 
899
904
  fireDragLeave(innerDropzone, data)
900
905
  expect(innerDragLeave).toHaveBeenCalled()
@@ -923,11 +928,11 @@ describe('useDropzone() hook', () => {
923
928
  )}
924
929
  </Dropzone>
925
930
  )
926
- const { container } = render(ui)
931
+ const { container, rerender } = render(ui)
927
932
  const dropzone = container.querySelector('div')
928
933
 
929
934
  fireDragEnter(dropzone, data)
930
- await flushPromises(ui, container)
935
+ await flushPromises(rerender, ui)
931
936
  expect(props.onDragEnter).toHaveBeenCalled()
932
937
 
933
938
  fireDragOver(dropzone, data)
@@ -937,7 +942,7 @@ describe('useDropzone() hook', () => {
937
942
  expect(props.onDragLeave).toHaveBeenCalled()
938
943
 
939
944
  fireDrop(dropzone, data)
940
- await flushPromises(ui, container)
945
+ await flushPromises(rerender, ui)
941
946
  expect(props.onDrop).toHaveBeenCalled()
942
947
 
943
948
  expect(props.getFilesFromEvent).toHaveBeenCalledTimes(2)
@@ -1277,7 +1282,7 @@ describe('useDropzone() hook', () => {
1277
1282
  const isIeOrEdgeSpy = jest.spyOn(utils, 'isIeOrEdge').mockReturnValueOnce(true)
1278
1283
  const onClickSpy = jest.spyOn(HTMLInputElement.prototype, 'click')
1279
1284
 
1280
- const { container } = render(
1285
+ const ui = (
1281
1286
  <Dropzone>
1282
1287
  {({ getRootProps, getInputProps }) => (
1283
1288
  <div {...getRootProps()}>
@@ -1287,10 +1292,12 @@ describe('useDropzone() hook', () => {
1287
1292
  </Dropzone>
1288
1293
  )
1289
1294
 
1295
+ const { container } = render(ui)
1296
+
1290
1297
  const dropzone = container.querySelector('div')
1291
1298
 
1292
1299
  fireEvent.click(dropzone)
1293
- jest.runAllTimers()
1300
+ drainTimers()
1294
1301
 
1295
1302
  expect(onClickSpy).toHaveBeenCalled()
1296
1303
  jest.useRealTimers()
@@ -1467,11 +1474,11 @@ describe('useDropzone() hook', () => {
1467
1474
  )}
1468
1475
  </Dropzone>
1469
1476
  )
1470
- const { container } = render(ui)
1477
+ const { container, rerender } = render(ui)
1471
1478
  const dropzone = container.querySelector('div')
1472
1479
 
1473
1480
  fireDragEnter(dropzone, data)
1474
- await flushPromises(ui, container)
1481
+ await flushPromises(rerender, ui)
1475
1482
  expect(props.onDragEnter).toHaveBeenCalled()
1476
1483
 
1477
1484
  fireDragOver(dropzone, data)
@@ -1481,7 +1488,7 @@ describe('useDropzone() hook', () => {
1481
1488
  expect(props.onDragLeave).toHaveBeenCalled()
1482
1489
 
1483
1490
  fireDrop(dropzone, data)
1484
- await flushPromises(ui, container)
1491
+ await flushPromises(rerender, ui)
1485
1492
  expect(props.onDrop).toHaveBeenCalled()
1486
1493
  })
1487
1494
 
@@ -1506,11 +1513,11 @@ describe('useDropzone() hook', () => {
1506
1513
  )}
1507
1514
  </Dropzone>
1508
1515
  )
1509
- const { container } = render(ui)
1516
+ const { container, rerender } = render(ui)
1510
1517
  const dropzone = container.querySelector('div')
1511
1518
 
1512
1519
  fireDragEnter(dropzone, emptyData)
1513
- await flushPromises(ui, container)
1520
+ await flushPromises(rerender, ui)
1514
1521
  expect(props.onDragEnter).toHaveBeenCalled()
1515
1522
 
1516
1523
  fireDragOver(dropzone, emptyData)
@@ -1521,7 +1528,7 @@ describe('useDropzone() hook', () => {
1521
1528
 
1522
1529
  const data = createDtWithFiles(files)
1523
1530
  fireDrop(dropzone, data)
1524
- await flushPromises(ui, container)
1531
+ await flushPromises(rerender, ui)
1525
1532
  expect(props.onDrop).toHaveBeenCalled()
1526
1533
  expect(props.onDropAccepted).toHaveBeenCalledWith(files, expect.any(Object))
1527
1534
  expect(props.onDropRejected).not.toHaveBeenCalled()
@@ -1553,11 +1560,11 @@ describe('useDropzone() hook', () => {
1553
1560
  )}
1554
1561
  </Dropzone>
1555
1562
  )
1556
- const { container } = render(ui)
1563
+ const { container, rerender } = render(ui)
1557
1564
  const dropzone = container.querySelector('div')
1558
1565
 
1559
1566
  fireDragEnter(dropzone, data)
1560
- await flushPromises(ui, container)
1567
+ await flushPromises(rerender, ui)
1561
1568
  expect(props.onDragEnter).not.toHaveBeenCalled()
1562
1569
 
1563
1570
  fireDragOver(dropzone, data)
@@ -1567,7 +1574,7 @@ describe('useDropzone() hook', () => {
1567
1574
  expect(props.onDragLeave).not.toHaveBeenCalled()
1568
1575
 
1569
1576
  fireDrop(dropzone, data)
1570
- await flushPromises(ui, container)
1577
+ await flushPromises(rerender, ui)
1571
1578
  expect(props.onDrop).not.toHaveBeenCalled()
1572
1579
  expect(props.onDropAccepted).not.toHaveBeenCalled()
1573
1580
  expect(props.onDropRejected).not.toHaveBeenCalled()
@@ -1594,11 +1601,11 @@ describe('useDropzone() hook', () => {
1594
1601
  )}
1595
1602
  </Dropzone>
1596
1603
  )
1597
- const { container } = render(ui)
1604
+ const { container, rerender } = render(ui)
1598
1605
  const dropzone = container.querySelector('div')
1599
1606
 
1600
1607
  fireDragEnter(dropzone, data)
1601
- await flushPromises(ui, container)
1608
+ await flushPromises(rerender, ui)
1602
1609
  expect(props.onDragEnter).not.toHaveBeenCalled()
1603
1610
 
1604
1611
  fireDragOver(dropzone, data)
@@ -1608,7 +1615,7 @@ describe('useDropzone() hook', () => {
1608
1615
  expect(props.onDragLeave).not.toHaveBeenCalled()
1609
1616
 
1610
1617
  fireDrop(dropzone, data)
1611
- await flushPromises(ui, container)
1618
+ await flushPromises(rerender, ui)
1612
1619
  expect(props.onDrop).not.toHaveBeenCalled()
1613
1620
  expect(props.onDropAccepted).not.toHaveBeenCalled()
1614
1621
  expect(props.onDropRejected).not.toHaveBeenCalled()
@@ -1637,7 +1644,7 @@ describe('useDropzone() hook', () => {
1637
1644
  const dropzone = container.querySelector('div')
1638
1645
 
1639
1646
  fireDragEnter(dropzone, data)
1640
- await flushPromises(noDragUi, container)
1647
+ await flushPromises(rerender, noDragUi)
1641
1648
  expect(props.onDragEnter).not.toHaveBeenCalled()
1642
1649
 
1643
1650
  fireDragOver(dropzone, data)
@@ -1647,7 +1654,7 @@ describe('useDropzone() hook', () => {
1647
1654
  expect(props.onDragLeave).not.toHaveBeenCalled()
1648
1655
 
1649
1656
  fireDrop(dropzone, data)
1650
- await flushPromises(noDragUi, container)
1657
+ await flushPromises(rerender, noDragUi)
1651
1658
  expect(props.onDrop).not.toHaveBeenCalled()
1652
1659
 
1653
1660
  const ui = (
@@ -1662,7 +1669,7 @@ describe('useDropzone() hook', () => {
1662
1669
  rerender(ui)
1663
1670
 
1664
1671
  fireDragEnter(dropzone, data)
1665
- await flushPromises(ui, container)
1672
+ await flushPromises(rerender, ui)
1666
1673
  expect(props.onDragEnter).toHaveBeenCalled()
1667
1674
 
1668
1675
  fireDragOver(dropzone, data)
@@ -1672,7 +1679,7 @@ describe('useDropzone() hook', () => {
1672
1679
  expect(props.onDragLeave).toHaveBeenCalled()
1673
1680
 
1674
1681
  fireDrop(dropzone, data)
1675
- await flushPromises(ui, container)
1682
+ await flushPromises(rerender, ui)
1676
1683
  expect(props.onDrop).toHaveBeenCalled()
1677
1684
  })
1678
1685
 
@@ -1689,12 +1696,12 @@ describe('useDropzone() hook', () => {
1689
1696
  )}
1690
1697
  </Dropzone>
1691
1698
  )
1692
- const { container } = render(ui)
1699
+ const { container, rerender } = render(ui)
1693
1700
  const dropzone = container.querySelector('div')
1694
1701
 
1695
1702
  const data = createDtWithFiles(files)
1696
1703
  fireDragEnter(dropzone, data)
1697
- await flushPromises(ui, container)
1704
+ await flushPromises(rerender, ui)
1698
1705
 
1699
1706
  expect(dropzone).toHaveTextContent('dragActive')
1700
1707
  expect(dropzone).toHaveTextContent('dragAccept')
@@ -1714,12 +1721,12 @@ describe('useDropzone() hook', () => {
1714
1721
  )}
1715
1722
  </Dropzone>
1716
1723
  )
1717
- const { container } = render(ui)
1724
+ const { container, rerender } = render(ui)
1718
1725
  const dropzone = container.querySelector('div')
1719
1726
 
1720
1727
  const data = createDtWithFiles([...files, ...images])
1721
1728
  fireDragEnter(dropzone, data)
1722
- await flushPromises(ui, container)
1729
+ await flushPromises(rerender, ui)
1723
1730
 
1724
1731
  expect(dropzone).toHaveTextContent('dragActive')
1725
1732
  expect(dropzone).not.toHaveTextContent('dragAccept')
@@ -1738,12 +1745,12 @@ describe('useDropzone() hook', () => {
1738
1745
  )}
1739
1746
  </Dropzone>
1740
1747
  )
1741
- const { container } = render(ui)
1748
+ const { container, rerender } = render(ui)
1742
1749
  const dropzone = container.querySelector('div')
1743
1750
 
1744
1751
  const data = createDtWithFiles(files)
1745
1752
  fireDragEnter(dropzone, data)
1746
- await flushPromises(ui, container)
1753
+ await flushPromises(rerender, ui)
1747
1754
 
1748
1755
  expect(dropzone).not.toHaveTextContent('dragAccept')
1749
1756
  expect(dropzone).toHaveTextContent('dragReject')
@@ -1762,12 +1769,12 @@ describe('useDropzone() hook', () => {
1762
1769
  )}
1763
1770
  </Dropzone>
1764
1771
  )
1765
- const { container } = render(ui)
1772
+ const { container, rerender } = render(ui)
1766
1773
  const dropzone = container.querySelector('div')
1767
1774
 
1768
1775
  const data = createDtWithFiles(images)
1769
1776
  fireDragEnter(dropzone, data)
1770
- await flushPromises(ui, container)
1777
+ await flushPromises(rerender, ui)
1771
1778
 
1772
1779
  expect(dropzone).toHaveTextContent('dragActive')
1773
1780
  expect(dropzone).not.toHaveTextContent('dragAccept')
@@ -1788,12 +1795,12 @@ describe('useDropzone() hook', () => {
1788
1795
  )}
1789
1796
  </Dropzone>
1790
1797
  )
1791
- const { container } = render(ui)
1798
+ const { container, rerender } = render(ui)
1792
1799
  const dropzone = container.querySelector('div')
1793
1800
 
1794
1801
  const data = createDtWithFiles(files)
1795
1802
  fireDragEnter(dropzone, data)
1796
- await flushPromises(ui, container)
1803
+ await flushPromises(rerender, ui)
1797
1804
 
1798
1805
  const event = new Event('dragleave', { bubbles: true })
1799
1806
  Object.defineProperty(event, 'target', {
@@ -1823,7 +1830,7 @@ describe('useDropzone() hook', () => {
1823
1830
 
1824
1831
  const data = createDtWithFiles(images)
1825
1832
  fireDragEnter(dropzone, data)
1826
- await flushPromises(ui, container)
1833
+ await flushPromises(rerender, ui)
1827
1834
 
1828
1835
  expect(dropzone).toHaveTextContent('dragActive')
1829
1836
  expect(dropzone).toHaveTextContent('dragAccept')
@@ -1863,29 +1870,29 @@ describe('useDropzone() hook', () => {
1863
1870
  )}
1864
1871
  </Dropzone>
1865
1872
  )
1866
- const { container } = render(ui)
1873
+ const { container, rerender } = render(ui)
1867
1874
  const dropzone = container.querySelector('div')
1868
1875
 
1869
1876
  const data = createDtWithFiles(images)
1870
1877
 
1871
1878
  fireDragEnter(container.querySelector('#child'), data)
1872
1879
  fireDragEnter(dropzone, data)
1873
- await flushPromises(ui, container)
1880
+ await flushPromises(rerender, ui)
1874
1881
  fireDragEnter(dropzone, data)
1875
- await flushPromises(ui, container)
1882
+ await flushPromises(rerender, ui)
1876
1883
 
1877
1884
  expect(dropzone).toHaveTextContent('dragActive')
1878
1885
  expect(dropzone).toHaveTextContent('dragAccept')
1879
1886
  expect(dropzone).not.toHaveTextContent('dragReject')
1880
1887
 
1881
1888
  fireDragLeave(dropzone, data)
1882
- await flushPromises(ui, container)
1889
+ await flushPromises(rerender, ui)
1883
1890
  expect(dropzone).toHaveTextContent('dragActive')
1884
1891
  expect(dropzone).toHaveTextContent('dragAccept')
1885
1892
  expect(dropzone).not.toHaveTextContent('dragReject')
1886
1893
 
1887
1894
  fireDragLeave(dropzone, data)
1888
- await flushPromises(ui, container)
1895
+ await flushPromises(rerender, ui)
1889
1896
  expect(dropzone).not.toHaveTextContent('dragActive')
1890
1897
  expect(dropzone).not.toHaveTextContent('dragAccept')
1891
1898
  expect(dropzone).not.toHaveTextContent('dragReject')
@@ -1909,13 +1916,13 @@ describe('useDropzone() hook', () => {
1909
1916
  )}
1910
1917
  </Dropzone>
1911
1918
  )
1912
- const { container } = render(ui)
1919
+ const { container, rerender } = render(ui)
1913
1920
  const input = container.querySelector('input')
1914
1921
 
1915
1922
  Object.defineProperty(input, 'files', { value: files })
1916
1923
 
1917
1924
  dispatchEvt(input, 'change')
1918
- await flushPromises(ui, container)
1925
+ await flushPromises(rerender, ui)
1919
1926
 
1920
1927
  expect(onDropSpy).toHaveBeenCalledWith(files, [], expect.anything())
1921
1928
  })
@@ -1967,17 +1974,17 @@ describe('useDropzone() hook', () => {
1967
1974
  )}
1968
1975
  </Dropzone>
1969
1976
  )
1970
- const { container } = render(ui)
1977
+ const { container, rerender } = render(ui)
1971
1978
  const dropzone = container.querySelector('div')
1972
1979
 
1973
1980
  fireDrop(dropzone, createDtWithFiles(images))
1974
- await flushPromises(ui, container)
1981
+ await flushPromises(rerender, ui)
1975
1982
  const acceptedFileList = getAcceptedFiles(dropzone)
1976
1983
  expect(acceptedFileList).toHaveLength(images.length)
1977
1984
  expect(matchToFiles(acceptedFileList, images)).toBe(true)
1978
1985
 
1979
1986
  fireDrop(dropzone, createDtWithFiles(files))
1980
- await flushPromises(ui, container)
1987
+ await flushPromises(rerender, ui)
1981
1988
  const rejectedFileList = getRejectedFiles(dropzone)
1982
1989
  expect(rejectedFileList).toHaveLength(files.length)
1983
1990
  expect(matchToFiles(rejectedFileList, files)).toBe(true)
@@ -1986,7 +1993,6 @@ describe('useDropzone() hook', () => {
1986
1993
  expect(matchToErrorCode(rejectedFileErrorList, 'file-invalid-type')).toBe(true)
1987
1994
  })
1988
1995
 
1989
-
1990
1996
  it('resets {isDragActive, isDragAccept, isDragReject}', async () => {
1991
1997
  const ui = (
1992
1998
  <Dropzone>
@@ -2000,20 +2006,20 @@ describe('useDropzone() hook', () => {
2000
2006
  )}
2001
2007
  </Dropzone>
2002
2008
  )
2003
- const { container } = render(ui)
2009
+ const { container, rerender } = render(ui)
2004
2010
  const dropzone = container.querySelector('div')
2005
2011
 
2006
2012
  const data = createDtWithFiles(files)
2007
2013
 
2008
2014
  fireDragEnter(dropzone, data)
2009
- await flushPromises(ui, container)
2015
+ await flushPromises(rerender, ui)
2010
2016
 
2011
2017
  expect(dropzone).toHaveTextContent('dragActive')
2012
2018
  expect(dropzone).toHaveTextContent('dragAccept')
2013
2019
  expect(dropzone).not.toHaveTextContent('dragReject')
2014
2020
 
2015
2021
  fireDrop(dropzone, data)
2016
- await flushPromises(ui, container)
2022
+ await flushPromises(rerender, ui)
2017
2023
  expect(dropzone).not.toHaveTextContent('dragActive')
2018
2024
  expect(dropzone).not.toHaveTextContent('dragAccept')
2019
2025
  expect(dropzone).not.toHaveTextContent('dragReject')
@@ -2030,11 +2036,11 @@ describe('useDropzone() hook', () => {
2030
2036
  )}
2031
2037
  </Dropzone>
2032
2038
  )
2033
- const { container } = render(ui)
2039
+ const { container, rerender } = render(ui)
2034
2040
  const dropzone = container.querySelector('div')
2035
2041
 
2036
2042
  fireDrop(dropzone, createDtWithFiles(files))
2037
- await flushPromises(ui, container)
2043
+ await flushPromises(rerender, ui)
2038
2044
  expect(onDropSpy).toHaveBeenCalledWith([], [
2039
2045
  {
2040
2046
  file: files[0],
@@ -2059,11 +2065,11 @@ describe('useDropzone() hook', () => {
2059
2065
  )}
2060
2066
  </Dropzone>
2061
2067
  )
2062
- const { container } = render(ui)
2068
+ const { container, rerender } = render(ui)
2063
2069
  const dropzone = container.querySelector('div')
2064
2070
 
2065
2071
  fireDrop(dropzone, createDtWithFiles(images))
2066
- await flushPromises(ui, container)
2072
+ await flushPromises(rerender, ui)
2067
2073
  expect(onDropSpy).toHaveBeenCalledWith([], [
2068
2074
  {
2069
2075
  file: images[0],
@@ -2091,18 +2097,24 @@ describe('useDropzone() hook', () => {
2091
2097
  const onDropRejectedSpy = jest.fn()
2092
2098
  const ui = (
2093
2099
  <Dropzone accept="image/*" onDrop={onDropSpy} onDropRejected={onDropRejectedSpy} multiple={true} maxFiles={1}>
2094
- {({ getRootProps, getInputProps }) => (
2100
+ {({ getRootProps, getInputProps, isDragReject, isDragAccept }) => (
2095
2101
  <div {...getRootProps()}>
2096
2102
  <input {...getInputProps()} />
2103
+ {isDragReject && 'dragReject'}
2104
+ {isDragAccept && 'dragAccept'}
2097
2105
  </div>
2098
2106
  )}
2099
2107
  </Dropzone>
2100
2108
  )
2101
- const { container } = render(ui)
2109
+ const { container, rerender } = render(ui)
2102
2110
  const dropzone = container.querySelector('div')
2103
2111
  fireDrop(dropzone, createDtWithFiles(images))
2104
- await flushPromises(ui, container)
2112
+ await flushPromises(rerender, ui)
2105
2113
  expect(onDropRejectedSpy).toHaveBeenCalled()
2114
+ fireDragEnter(dropzone, createDtWithFiles(images))
2115
+ await flushPromises(rerender, ui)
2116
+ expect(dropzone).toHaveTextContent('dragReject')
2117
+ expect(dropzone).not.toHaveTextContent('dragAccept')
2106
2118
  expect(onDropSpy).toHaveBeenCalledWith([], [
2107
2119
  {
2108
2120
  file: images[0],
@@ -2125,6 +2137,36 @@ describe('useDropzone() hook', () => {
2125
2137
  ], expect.anything())
2126
2138
  })
2127
2139
 
2140
+ it('rejects all files if {multiple} is true and maxFiles has been updated so that it is less than files', async () => {
2141
+ const onDropSpy = jest.fn()
2142
+ const onDropRejectedSpy = jest.fn()
2143
+ const ui = (maxFiles) => (
2144
+ <Dropzone accept="image/*" onDrop={onDropSpy} multiple={true} maxFiles={maxFiles} onDropRejected={onDropRejectedSpy}>
2145
+ {({ getRootProps, getInputProps }) => (
2146
+ <div {...getRootProps()}>
2147
+ <input {...getInputProps()} />
2148
+ </div>
2149
+ )}
2150
+ </Dropzone>
2151
+ )
2152
+ const { container, rerender } = render(ui(3))
2153
+ const dropzone = container.querySelector('div')
2154
+
2155
+ fireDrop(dropzone, createDtWithFiles(images))
2156
+ await flushPromises(rerender, ui(3))
2157
+ expect(onDropRejectedSpy).not.toHaveBeenCalled()
2158
+ expect(onDropSpy).toHaveBeenCalledWith(images, [], expect.anything())
2159
+
2160
+ rerender(ui(1));
2161
+
2162
+ fireDrop(dropzone, createDtWithFiles(images))
2163
+ await flushPromises(rerender, ui(1))
2164
+ expect(onDropRejectedSpy).toHaveBeenCalledWith(
2165
+ expect.arrayContaining(images.map((image) => expect.objectContaining({ errors: expect.any(Array), file: image }))),
2166
+ expect.anything()
2167
+ )
2168
+ })
2169
+
2128
2170
  it('accepts multiple files if {multiple} is true and {accept} criteria is met', async () => {
2129
2171
  const onDropSpy = jest.fn()
2130
2172
  const onDropRejectedSpy = jest.fn()
@@ -2137,15 +2179,15 @@ describe('useDropzone() hook', () => {
2137
2179
  )}
2138
2180
  </Dropzone>
2139
2181
  )
2140
- const { container } = render(ui)
2182
+ const { container, rerender } = render(ui)
2141
2183
  const dropzone = container.querySelector('div')
2142
2184
 
2143
2185
  fireDrop(dropzone, createDtWithFiles(images))
2144
- await flushPromises(ui, container)
2186
+ await flushPromises(rerender, ui)
2145
2187
  expect(onDropRejectedSpy).not.toHaveBeenCalled()
2146
2188
  expect(onDropSpy).toHaveBeenCalledWith(images, [], expect.anything())
2147
2189
  })
2148
-
2190
+
2149
2191
  it('accepts a single files if {multiple} is false and {accept} criteria is met', async () => {
2150
2192
  const onDropSpy = jest.fn()
2151
2193
  const ui = (
@@ -2157,12 +2199,12 @@ describe('useDropzone() hook', () => {
2157
2199
  )}
2158
2200
  </Dropzone>
2159
2201
  )
2160
- const { container } = render(ui)
2202
+ const { container, rerender } = render(ui)
2161
2203
  const dropzone = container.querySelector('div')
2162
2204
 
2163
2205
  const [image] = images
2164
2206
  fireDrop(dropzone, createDtWithFiles([image]))
2165
- await flushPromises(ui, container)
2207
+ await flushPromises(rerender, ui)
2166
2208
  expect(onDropSpy).toHaveBeenCalledWith([image], [], expect.anything())
2167
2209
  })
2168
2210
 
@@ -2177,11 +2219,11 @@ describe('useDropzone() hook', () => {
2177
2219
  )}
2178
2220
  </Dropzone>
2179
2221
  )
2180
- const { container } = render(ui)
2222
+ const { container, rerender } = render(ui)
2181
2223
  const dropzone = container.querySelector('div')
2182
2224
 
2183
2225
  fireDrop(dropzone, createDtWithFiles(files))
2184
- await flushPromises(ui, container)
2226
+ await flushPromises(rerender, ui)
2185
2227
  expect(onDropSpy).toHaveBeenCalledWith(files, [], expect.anything())
2186
2228
  })
2187
2229
 
@@ -2203,7 +2245,7 @@ describe('useDropzone() hook', () => {
2203
2245
  )}
2204
2246
  </Dropzone>
2205
2247
  )
2206
- const { container } = render(ui)
2248
+ const { container, rerender } = render(ui)
2207
2249
  const dropzone = container.querySelector('div')
2208
2250
  const btn = container.querySelector('button')
2209
2251
 
@@ -2213,7 +2255,7 @@ describe('useDropzone() hook', () => {
2213
2255
  expect(dropzone).toContainElement(ref)
2214
2256
 
2215
2257
  fireDrop(dropzone, createDtWithFiles(files))
2216
- await flushPromises(ui, container)
2258
+ await flushPromises(rerender, ui)
2217
2259
 
2218
2260
  expect(dropzone).not.toContainElement(ref)
2219
2261
  })
@@ -2229,11 +2271,11 @@ describe('useDropzone() hook', () => {
2229
2271
  )}
2230
2272
  </Dropzone>
2231
2273
  )
2232
- const { container } = render(ui)
2274
+ const { container, rerender } = render(ui)
2233
2275
  const dropzone = container.querySelector('div')
2234
2276
 
2235
2277
  fireDrop(dropzone, createDtWithFiles(files))
2236
- await flushPromises(ui, container)
2278
+ await flushPromises(rerender, ui)
2237
2279
  expect(onDropSpy).toHaveBeenCalledWith([], [
2238
2280
  {
2239
2281
  file: files[0],
@@ -2248,12 +2290,12 @@ describe('useDropzone() hook', () => {
2248
2290
  onDropSpy.mockClear()
2249
2291
 
2250
2292
  fireDrop(dropzone, createDtWithFiles(images))
2251
- await flushPromises(ui, container)
2293
+ await flushPromises(rerender, ui)
2252
2294
  expect(onDropSpy).toHaveBeenCalledWith(images, [], expect.anything())
2253
2295
  onDropSpy.mockClear()
2254
2296
 
2255
2297
  fireDrop(dropzone, createDtWithFiles([...files, ...images]))
2256
- await flushPromises(ui, container)
2298
+ await flushPromises(rerender, ui)
2257
2299
  expect(onDropSpy).toHaveBeenCalledWith(images, [
2258
2300
  {
2259
2301
  file: files[0],
@@ -2278,21 +2320,21 @@ describe('useDropzone() hook', () => {
2278
2320
  )}
2279
2321
  </Dropzone>
2280
2322
  )
2281
- const { container } = render(ui)
2323
+ const { container, rerender } = render(ui)
2282
2324
  const dropzone = container.querySelector('div')
2283
2325
 
2284
2326
  fireDrop(dropzone, createDtWithFiles(files))
2285
- await flushPromises(ui, container)
2327
+ await flushPromises(rerender, ui)
2286
2328
  expect(onDropAcceptedSpy).not.toHaveBeenCalled()
2287
2329
  onDropAcceptedSpy.mockClear()
2288
2330
 
2289
2331
  fireDrop(dropzone, createDtWithFiles(images))
2290
- await flushPromises(ui, container)
2332
+ await flushPromises(rerender, ui)
2291
2333
  expect(onDropAcceptedSpy).toHaveBeenCalledWith(images, expect.anything())
2292
2334
  onDropAcceptedSpy.mockClear()
2293
2335
 
2294
2336
  fireDrop(dropzone, createDtWithFiles([...files, ...images]))
2295
- await flushPromises(ui, container)
2337
+ await flushPromises(rerender, ui)
2296
2338
  expect(onDropAcceptedSpy).toHaveBeenCalledWith(images, expect.anything())
2297
2339
  })
2298
2340
 
@@ -2307,11 +2349,11 @@ describe('useDropzone() hook', () => {
2307
2349
  )}
2308
2350
  </Dropzone>
2309
2351
  )
2310
- const { container } = render(ui)
2352
+ const { container, rerender } = render(ui)
2311
2353
  const dropzone = container.querySelector('div')
2312
2354
 
2313
2355
  fireDrop(dropzone, createDtWithFiles(files))
2314
- await flushPromises(ui, container)
2356
+ await flushPromises(rerender, ui)
2315
2357
  expect(onDropRejectedSpy).toHaveBeenCalledWith([
2316
2358
  {
2317
2359
  file: files[0],
@@ -2326,12 +2368,12 @@ describe('useDropzone() hook', () => {
2326
2368
  onDropRejectedSpy.mockClear()
2327
2369
 
2328
2370
  fireDrop(dropzone, createDtWithFiles(images))
2329
- await flushPromises(ui, container)
2371
+ await flushPromises(rerender, ui)
2330
2372
  expect(onDropRejectedSpy).not.toHaveBeenCalled()
2331
2373
  onDropRejectedSpy.mockClear()
2332
2374
 
2333
2375
  fireDrop(dropzone, createDtWithFiles([...files, ...images]))
2334
- await flushPromises(ui, container)
2376
+ await flushPromises(rerender, ui)
2335
2377
  expect(onDropRejectedSpy).toHaveBeenCalledWith([
2336
2378
  {
2337
2379
  file: files[0],
@@ -2356,12 +2398,12 @@ describe('useDropzone() hook', () => {
2356
2398
  )}
2357
2399
  </Dropzone>
2358
2400
  )
2359
- const { container } = render(ui)
2401
+ const { container, rerender } = render(ui)
2360
2402
  const dropzone = container.querySelector('div')
2361
2403
 
2362
2404
  const images = [createFile('bogus.gif', 1234, 'application/x-moz-file')]
2363
2405
  fireDrop(dropzone, createDtWithFiles(images))
2364
- await flushPromises(ui, container)
2406
+ await flushPromises(rerender, ui)
2365
2407
 
2366
2408
  expect(onDropSpy).toHaveBeenCalledWith(images, [], expect.anything())
2367
2409
  })
@@ -2377,11 +2419,11 @@ describe('useDropzone() hook', () => {
2377
2419
  )}
2378
2420
  </Dropzone>
2379
2421
  )
2380
- const { container } = render(ui)
2422
+ const { container, rerender } = render(ui)
2381
2423
  const dropzone = container.querySelector('div')
2382
2424
 
2383
2425
  fireDrop(dropzone, createDtWithFiles(images))
2384
- await flushPromises(ui, container)
2426
+ await flushPromises(rerender, ui)
2385
2427
 
2386
2428
  expect(onDropSpy).toHaveBeenCalledWith([], [
2387
2429
  {
@@ -2416,11 +2458,11 @@ describe('useDropzone() hook', () => {
2416
2458
  )}
2417
2459
  </Dropzone>
2418
2460
  )
2419
- const { container } = render(ui)
2461
+ const { container, rerender } = render(ui)
2420
2462
  const dropzone = container.querySelector('div')
2421
2463
 
2422
2464
  fireDrop(dropzone, createDtWithFiles(files))
2423
- await flushPromises(ui, container)
2465
+ await flushPromises(rerender, ui)
2424
2466
 
2425
2467
  expect(onDropSpy).toHaveBeenCalledWith([], [
2426
2468
  {
@@ -2459,7 +2501,7 @@ describe('useDropzone() hook', () => {
2459
2501
  )
2460
2502
 
2461
2503
  dispatchEvt(document.body, 'focus')
2462
- jest.runAllTimers()
2504
+ drainTimers()
2463
2505
 
2464
2506
  expect(onFileDialogCancelSpy).not.toHaveBeenCalled()
2465
2507
  })
@@ -2487,13 +2529,13 @@ describe('useDropzone() hook', () => {
2487
2529
  const btn = container.querySelector('button')
2488
2530
 
2489
2531
  btn.click()
2490
- jest.runAllTimers()
2532
+ drainTimers()
2491
2533
  const ref = activeRef.current
2492
2534
  expect(ref).not.toBeNull()
2493
2535
  expect(dropzone).toContainElement(ref)
2494
2536
 
2495
2537
  dispatchEvt(document.body, 'focus')
2496
- jest.runAllTimers()
2538
+ drainTimers()
2497
2539
 
2498
2540
  expect(onFileDialogCancelSpy).toHaveBeenCalled()
2499
2541
  expect(dropzone).not.toContainElement(ref)
@@ -2516,17 +2558,17 @@ describe('useDropzone() hook', () => {
2516
2558
 
2517
2559
  const btn = container.querySelector('button')
2518
2560
  btn.click()
2519
- jest.runAllTimers()
2561
+ drainTimers()
2520
2562
 
2521
2563
  rerender(
2522
2564
  <Dropzone onFileDialogCancel={onFileDialogCancelSpy}>
2523
2565
  {({ getRootProps }) => <div {...getRootProps()} />}
2524
2566
  </Dropzone>
2525
2567
  )
2526
- jest.runAllTimers()
2568
+ drainTimers()
2527
2569
 
2528
2570
  dispatchEvt(document.body, 'focus')
2529
- jest.runAllTimers()
2571
+ drainTimers()
2530
2572
 
2531
2573
  expect(onFileDialogCancelSpy).not.toHaveBeenCalled()
2532
2574
  })
@@ -2552,10 +2594,10 @@ describe('useDropzone() hook', () => {
2552
2594
 
2553
2595
  const btn = container.querySelector('button')
2554
2596
  btn.click()
2555
- jest.runAllTimers()
2597
+ drainTimers()
2556
2598
 
2557
2599
  dispatchEvt(document.body, 'focus')
2558
- jest.runAllTimers()
2600
+ drainTimers()
2559
2601
 
2560
2602
  expect(onFileDialogCancelSpy).not.toHaveBeenCalled()
2561
2603
  })
@@ -2576,11 +2618,11 @@ describe('useDropzone() hook', () => {
2576
2618
 
2577
2619
  const btn = container.querySelector('button')
2578
2620
  btn.click()
2579
- jest.runAllTimers()
2621
+ drainTimers()
2580
2622
 
2581
2623
  const fn = () => {
2582
2624
  dispatchEvt(document.body, 'focus')
2583
- jest.runAllTimers()
2625
+ drainTimers()
2584
2626
  }
2585
2627
  expect(fn).not.toThrow()
2586
2628
  })
@@ -2679,13 +2721,12 @@ describe('useDropzone() hook', () => {
2679
2721
  })
2680
2722
  })
2681
2723
 
2682
- function flushPromises(ui, container) {
2683
- return new Promise(resolve =>
2684
- global.setImmediate(() => {
2685
- render(ui, { container })
2686
- resolve(container)
2687
- })
2688
- )
2724
+ async function flushPromises(rerender, ui) {
2725
+ await act(() => waitFor(() => rerender(ui)))
2726
+ }
2727
+
2728
+ function drainTimers() {
2729
+ act(() => jest.runAllTimers())
2689
2730
  }
2690
2731
 
2691
2732
  function createDtWithFiles(files = []) {