@@ -52,6 +52,20 @@ describe("memoize", () => {
52
52
expect ( await memoized ( ) ) . toBe ( "Retry" ) ;
53
53
expect ( provider ) . toBeCalledTimes ( 2 ) ;
54
54
} ) ;
55
+
56
+ it ( "should retry provider if forceRefresh parameter is used" , async ( ) => {
57
+ provider
58
+ . mockReset ( )
59
+ . mockResolvedValueOnce ( "1st" )
60
+ . mockResolvedValueOnce ( "2nd" )
61
+ . mockRejectedValueOnce ( "Should not call 3rd time" ) ;
62
+ const memoized = memoize ( provider ) ;
63
+ expect ( await memoized ( ) ) . toBe ( "1st" ) ;
64
+ expect ( await memoized ( ) ) . toBe ( "1st" ) ;
65
+ expect ( await memoized ( { forceRefresh : true } ) ) . toBe ( "2nd" ) ;
66
+ expect ( await memoized ( ) ) . toBe ( "2nd" ) ;
67
+ expect ( provider ) . toBeCalledTimes ( 2 ) ;
68
+ } ) ;
55
69
} ) ;
56
70
57
71
describe ( "refreshing memoization" , ( ) => {
@@ -115,7 +129,27 @@ describe("memoize", () => {
115
129
} ) ;
116
130
} ) ;
117
131
118
- describe ( "should return the same promise for invocations 2-infinity if `requiresRefresh` returns `false`" , ( ) => {
132
+ describe ( "when called with forceRefresh set to `true`" , ( ) => {
133
+ it ( "should reinvoke the underlying provider even if isExpired returns false" , async ( ) => {
134
+ const memoized = memoize ( provider , isExpired , requiresRefresh ) ;
135
+ isExpired . mockReturnValue ( false ) ;
136
+ for ( const _ in [ ...Array ( repeatTimes ) . keys ( ) ] ) {
137
+ expect ( await memoized ( { forceRefresh : true } ) ) . toEqual ( mockReturn ) ;
138
+ }
139
+ expect ( provider ) . toHaveBeenCalledTimes ( repeatTimes ) ;
140
+ } ) ;
141
+
142
+ it ( "should reinvoke the underlying provider even if requiresRefresh returns false" , async ( ) => {
143
+ const memoized = memoize ( provider , isExpired , requiresRefresh ) ;
144
+ requiresRefresh . mockReturnValue ( false ) ;
145
+ for ( const _ in [ ...Array ( repeatTimes ) . keys ( ) ] ) {
146
+ expect ( await memoized ( { forceRefresh : true } ) ) . toEqual ( mockReturn ) ;
147
+ }
148
+ expect ( provider ) . toHaveBeenCalledTimes ( repeatTimes ) ;
149
+ } ) ;
150
+ } ) ;
151
+
152
+ describe ( "when `requiresRefresh` returns `false`" , ( ) => {
119
153
const requiresRefreshFalseTest = async ( ) => {
120
154
const memoized = memoize ( provider , isExpired , requiresRefresh ) ;
121
155
const result = memoized ( ) ;
@@ -130,14 +164,22 @@ describe("memoize", () => {
130
164
expect ( isExpired ) . not . toHaveBeenCalled ( ) ;
131
165
} ;
132
166
133
- it ( "when isExpired returns true" , ( ) => {
167
+ it ( "should return the same promise for invocations 2-infinity if isExpired returns true" , ( ) => {
134
168
return requiresRefreshFalseTest ( ) ;
135
169
} ) ;
136
170
137
- it ( "when isExpired returns false" , ( ) => {
171
+ it ( "should return the same promise for invocations 2-infinity if isExpired returns false" , ( ) => {
138
172
isExpired . mockReturnValue ( false ) ;
139
173
return requiresRefreshFalseTest ( ) ;
140
174
} ) ;
175
+
176
+ it ( "should re-evaluate `requiresRefresh` after force refresh" , async ( ) => {
177
+ const memoized = memoize ( provider , isExpired , requiresRefresh ) ;
178
+ for ( const _ in [ ...Array ( repeatTimes ) . keys ( ) ] ) {
179
+ expect ( await memoized ( { forceRefresh : true } ) ) . toStrictEqual ( mockReturn ) ;
180
+ }
181
+ expect ( requiresRefresh ) . toBeCalledTimes ( repeatTimes ) ;
182
+ } ) ;
141
183
} ) ;
142
184
143
185
describe ( "should not make extra request for concurrent calls" , ( ) => {
0 commit comments