@@ -2,15 +2,16 @@ import '@testing-library/jest-dom'
22import { render , screen , fireEvent } from '@testing-library/react'
33import * as React from 'react'
44
5- import { useVirtual } from '../index'
5+ import { useVirtual as useVirtualImpl } from '../index'
66
77function List ( {
88 size = 200 ,
99 overscan,
1010 height = 200 ,
1111 width = 200 ,
12- getBoundingClientRect,
13- parentRef = React . createRef ( ) ,
12+ onRef,
13+ parentRef,
14+ useVirtual,
1415} ) {
1516 const rowVirtualizer = useVirtual ( {
1617 size,
@@ -39,27 +40,14 @@ function List({
3940 { rowVirtualizer . virtualItems . map ( virtualRow => (
4041 < div
4142 key = { virtualRow . index }
42- ref = {
43- getBoundingClientRect
44- ? el => {
45- if ( el ) {
46- el . getBoundingClientRect = getBoundingClientRect (
47- virtualRow . index
48- )
49- }
50- virtualRow . measureRef ( el )
51- }
52- : undefined
53- }
43+ ref = { onRef ? onRef ( virtualRow ) : undefined }
5444 style = { {
5545 position : 'absolute' ,
5646 top : 0 ,
5747 left : 0 ,
5848 width : '100%' ,
5949 transform : `translateY(${ virtualRow . start } px)` ,
60- ...( getBoundingClientRect
61- ? { }
62- : { height : `${ virtualRow . size } px` } ) ,
50+ height : `${ virtualRow . size } px` ,
6351 } }
6452 >
6553 Row { virtualRow . index }
@@ -72,50 +60,67 @@ function List({
7260}
7361
7462describe ( 'useVirtual list' , ( ) => {
75- it ( 'should render' , async ( ) => {
76- render ( < List /> )
63+ let useVirtual , parentRef , props
64+
65+ beforeEach ( ( ) => {
66+ parentRef = React . createRef ( )
67+ useVirtual = jest . fn ( props => useVirtualImpl ( props ) )
68+
69+ props = { parentRef, useVirtual }
70+ } )
71+
72+ it ( 'should render' , ( ) => {
73+ render ( < List { ...props } /> )
7774
7875 expect ( screen . queryByText ( 'Row 0' ) ) . toBeInTheDocument ( )
76+ expect ( screen . queryByText ( 'Row 4' ) ) . toBeInTheDocument ( )
7977 expect ( screen . queryByText ( 'Row 5' ) ) . not . toBeInTheDocument ( )
78+
79+ expect ( useVirtual ) . toHaveBeenCalledTimes ( 3 )
8080 } )
81- it ( 'should render with overscan' , async ( ) => {
82- render ( < List overscan = { 0 } /> )
81+ it ( 'should render with overscan' , ( ) => {
82+ render ( < List { ... props } overscan = { 0 } /> )
8383
8484 expect ( screen . queryByText ( 'Row 0' ) ) . toBeInTheDocument ( )
85+ expect ( screen . queryByText ( 'Row 3' ) ) . toBeInTheDocument ( )
8586 expect ( screen . queryByText ( 'Row 4' ) ) . not . toBeInTheDocument ( )
87+
88+ expect ( useVirtual ) . toHaveBeenCalledTimes ( 3 )
8689 } )
87- it ( 'should render given dynamic size' , async ( ) => {
88- const getBoundingClientRect = index =>
89- jest . fn ( ( ) => ( {
90- height : index % 2 === 0 ? 25 : 50 ,
91- } ) )
90+ it ( 'should render given dynamic size' , ( ) => {
91+ const onRef = virtualRow => el => {
92+ if ( el ) {
93+ jest . spyOn ( el , 'offsetHeight' , 'get' ) . mockImplementation ( ( ) => 25 )
94+ }
95+ virtualRow . measureRef ( el )
96+ }
9297
93- render ( < List getBoundingClientRect = { getBoundingClientRect } /> )
98+ render ( < List { ... props } onRef = { onRef } /> )
9499
95100 expect ( screen . queryByText ( 'Row 0' ) ) . toBeInTheDocument ( )
101+ expect ( screen . queryByText ( 'Row 5' ) ) . toBeInTheDocument ( )
96102 expect ( screen . queryByText ( 'Row 6' ) ) . not . toBeInTheDocument ( )
97- } )
98103
99- it ( 'should render given dynamic size after scroll' , async ( ) => {
100- const getBoundingClientRect = index =>
101- jest . fn ( ( ) => ( {
102- height : index % 2 === 0 ? 25 : 50 ,
103- } ) )
104- const parentRef = React . createRef ( )
104+ expect ( useVirtual ) . toHaveBeenCalledTimes ( 4 )
105+ } )
106+ it ( 'should render given dynamic size after scroll' , ( ) => {
107+ const onRef = virtualRow => el => {
108+ if ( el ) {
109+ jest . spyOn ( el , 'offsetHeight' , 'get' ) . mockImplementation ( ( ) => 25 )
110+ }
111+ virtualRow . measureRef ( el )
112+ }
105113
106- render (
107- < List
108- getBoundingClientRect = { getBoundingClientRect }
109- parentRef = { parentRef }
110- />
111- )
114+ render ( < List { ...props } onRef = { onRef } /> )
112115
113116 expect ( screen . queryByText ( 'Row 0' ) ) . toBeInTheDocument ( )
117+ expect ( screen . queryByText ( 'Row 5' ) ) . toBeInTheDocument ( )
114118 expect ( screen . queryByText ( 'Row 6' ) ) . not . toBeInTheDocument ( )
115119
116120 fireEvent . scroll ( parentRef . current , { target : { scrollTop : 375 } } )
117121
118- expect ( screen . queryByText ( 'Row 8' ) ) . toBeInTheDocument ( )
119- expect ( screen . queryByText ( 'Row 14' ) ) . not . toBeInTheDocument ( )
122+ expect ( screen . queryByText ( 'Row 9' ) ) . toBeInTheDocument ( )
123+ expect ( screen . queryByText ( 'Row 15' ) ) . toBeInTheDocument ( )
124+ expect ( screen . queryByText ( 'Row 16' ) ) . not . toBeInTheDocument ( )
120125 } )
121126} )
0 commit comments