@@ -2,7 +2,7 @@ import React, { useEffect, useState } from 'react'
2
2
import { render , fireEvent , act , screen } from '@testing-library/react'
3
3
import { mutate , createCache , SWRConfig } from 'swr'
4
4
import useSWRInfinite , { getInfiniteKey } from 'swr/infinite'
5
- import { sleep , createResponse } from './utils'
5
+ import { sleep , createKey , createResponse } from './utils'
6
6
7
7
describe ( 'useSWRInfinite' , ( ) => {
8
8
it ( 'should render the first page component' , async ( ) => {
@@ -154,9 +154,11 @@ describe('useSWRInfinite', () => {
154
154
155
155
it ( 'should skip fetching existing pages when loading more' , async ( ) => {
156
156
let requests = 0
157
+ const key = createKey ( )
158
+
157
159
function Page ( ) {
158
160
const { data, size, setSize } = useSWRInfinite < string , string > (
159
- index => [ `pagetest-4` , index ] ,
161
+ index => [ key , index ] ,
160
162
( _ , index ) => {
161
163
requests ++
162
164
return createResponse ( `page ${ index } , ` )
@@ -185,13 +187,13 @@ describe('useSWRInfinite', () => {
185
187
fireEvent . click ( screen . getByText ( 'data:page 0,' ) )
186
188
187
189
await screen . findByText ( 'data:page 0, page 1,' ) // mounted
188
- expect ( requests ) . toEqual ( 2 )
190
+ expect ( requests ) . toEqual ( 3 ) // revalidate page 1, load page 2
189
191
190
192
// load next page
191
193
fireEvent . click ( screen . getByText ( 'data:page 0, page 1,' ) )
192
194
193
195
await screen . findByText ( 'data:page 0, page 1, page 2,' ) // mounted
194
- expect ( requests ) . toEqual ( 3 )
196
+ expect ( requests ) . toEqual ( 5 ) // revalidate page 1, load page 3
195
197
} )
196
198
197
199
it ( 'should cache page count' , async ( ) => {
@@ -572,6 +574,7 @@ describe('useSWRInfinite', () => {
572
574
fireEvent . click ( screen . getByText ( 'data:' ) )
573
575
await screen . findByText ( 'data:' )
574
576
} )
577
+
575
578
it ( 'should mutate a cache with getInfiniteKey' , async ( ) => {
576
579
let count = 0
577
580
function Page ( ) {
@@ -650,4 +653,42 @@ describe('useSWRInfinite', () => {
650
653
651
654
expect ( loggedValues ) . toEqual ( [ 1 ] )
652
655
} )
656
+
657
+ // https://github.com/vercel/swr/issues/908
658
+ it ( 'should revalidate first page after mutating' , async ( ) => {
659
+ let renderedData
660
+ const key = createKey ( )
661
+ let v = 'old'
662
+
663
+ function Page ( ) {
664
+ const { data, size, mutate : boundMutate } = useSWRInfinite <
665
+ string ,
666
+ string
667
+ > ( i => [ key , i ] , ( ) => v )
668
+ renderedData = data
669
+
670
+ return (
671
+ < div >
672
+ < button
673
+ onClick = { ( ) => {
674
+ v = 'new'
675
+ boundMutate ( [ v ] )
676
+ } }
677
+ >
678
+ mutate
679
+ </ button >
680
+ < p > size=${ size } </ p >
681
+ </ div >
682
+ )
683
+ }
684
+
685
+ render ( < Page /> )
686
+
687
+ await screen . findByText ( 'mutate' )
688
+ await act ( ( ) => sleep ( 1 ) )
689
+ expect ( renderedData ) . toEqual ( [ 'old' ] )
690
+ fireEvent . click ( screen . getByText ( 'mutate' ) )
691
+ await act ( ( ) => sleep ( 1 ) )
692
+ expect ( renderedData ) . toEqual ( [ 'new' ] )
693
+ } )
653
694
} )
0 commit comments