@@ -99,37 +99,40 @@ describe('useDecideAsync', () => {
9999 expect ( result . current . error ) . toBeNull ( ) ;
100100 } ) ;
101101
102- it ( 'should return decision when async call resolves' , async ( ) => {
102+ it ( 'should not trigger a redundant re-render when mounting with store already ready' , ( ) => {
103103 mockClient = createMockClient ( true ) ;
104104 const mockUserContext = createMockUserContext ( ) ;
105+ ( mockUserContext . decideAsync as ReturnType < typeof vi . fn > ) . mockReturnValue ( new Promise ( ( ) => { } ) ) ;
105106 store . setUserContext ( mockUserContext ) ;
106107
108+ let renderCount = 0 ;
107109 const wrapper = createWrapper ( store , mockClient ) ;
108- const { result } = renderHook ( ( ) => useDecideAsync ( 'flag_1' ) , { wrapper } ) ;
109-
110- await waitFor ( ( ) => {
111- expect ( result . current . isLoading ) . toBe ( false ) ;
112- } ) ;
113-
114- expect ( result . current . decision ) . toBe ( MOCK_DECISION ) ;
115- expect ( result . current . error ) . toBeNull ( ) ;
110+ renderHook (
111+ ( ) => {
112+ renderCount ++ ;
113+ return useDecideAsync ( 'flag_1' ) ;
114+ } ,
115+ { wrapper }
116+ ) ;
117+
118+ // Should render once (initial), not twice (initial + redundant setState)
119+ expect ( renderCount ) . toBe ( 1 ) ;
116120 } ) ;
117121
118- it ( 'should pass decideOptions to decideAsync() ' , async ( ) => {
122+ it ( 'should return decision when async call resolves ' , async ( ) => {
119123 mockClient = createMockClient ( true ) ;
120124 const mockUserContext = createMockUserContext ( ) ;
121125 store . setUserContext ( mockUserContext ) ;
122126
123- const decideOptions = [ 'DISABLE_DECISION_EVENT' ] as unknown as OptimizelyDecideOption [ ] ;
124-
125127 const wrapper = createWrapper ( store , mockClient ) ;
126- const { result } = renderHook ( ( ) => useDecideAsync ( 'flag_1' , { decideOptions } ) , { wrapper } ) ;
128+ const { result } = renderHook ( ( ) => useDecideAsync ( 'flag_1' ) , { wrapper } ) ;
127129
128130 await waitFor ( ( ) => {
129131 expect ( result . current . isLoading ) . toBe ( false ) ;
130132 } ) ;
131133
132- expect ( mockUserContext . decideAsync ) . toHaveBeenCalledWith ( 'flag_1' , decideOptions ) ;
134+ expect ( result . current . decision ) . toBe ( MOCK_DECISION ) ;
135+ expect ( result . current . error ) . toBeNull ( ) ;
133136 } ) ;
134137
135138 it ( 'should return error when decideAsync() rejects' , async ( ) => {
@@ -280,34 +283,6 @@ describe('useDecideAsync', () => {
280283 expect ( mockUserContext . decideAsync ) . toHaveBeenCalledWith ( 'flag_1' , newOptions ) ;
281284 } ) ;
282285
283- it ( 'should re-fire async call when user context changes (store state)' , async ( ) => {
284- mockClient = createMockClient ( true ) ;
285- const mockUserContext1 = createMockUserContext ( ) ;
286- store . setUserContext ( mockUserContext1 ) ;
287-
288- const wrapper = createWrapper ( store , mockClient ) ;
289- const { result } = renderHook ( ( ) => useDecideAsync ( 'flag_1' ) , { wrapper } ) ;
290-
291- await waitFor ( ( ) => {
292- expect ( result . current . isLoading ) . toBe ( false ) ;
293- } ) ;
294-
295- expect ( result . current . decision ) . toBe ( MOCK_DECISION ) ;
296- expect ( mockUserContext1 . decideAsync ) . toHaveBeenCalledTimes ( 1 ) ;
297-
298- // Now change to a different user context
299- const updatedDecision : OptimizelyDecision = { ...MOCK_DECISION , variationKey : 'variation_2' } ;
300- const mockUserContext2 = createMockUserContext ( ) ;
301- ( mockUserContext2 . decideAsync as ReturnType < typeof vi . fn > ) . mockResolvedValue ( updatedDecision ) ;
302-
303- await act ( async ( ) => {
304- store . setUserContext ( mockUserContext2 ) ;
305- } ) ;
306-
307- expect ( result . current . decision ) . toBe ( updatedDecision ) ;
308- expect ( mockUserContext2 . decideAsync ) . toHaveBeenCalledTimes ( 1 ) ;
309- } ) ;
310-
311286 it ( 'should re-fire async call on config update' , async ( ) => {
312287 const mockUserContext = createMockUserContext ( ) ;
313288 const { wrapper, fireConfigUpdate } = createProviderWrapper ( mockUserContext ) ;
@@ -435,15 +410,4 @@ describe('useDecideAsync', () => {
435410 expect ( unsubscribeFdSpy ) . toHaveBeenCalledTimes ( 1 ) ;
436411 } ) ;
437412 } ) ;
438-
439- it ( 'should not call decideAsync() while loading' , ( ) => {
440- const mockUserContext = createMockUserContext ( ) ;
441- // Config not available, user context set
442- store . setUserContext ( mockUserContext ) ;
443-
444- const wrapper = createWrapper ( store , mockClient ) ;
445- renderHook ( ( ) => useDecideAsync ( 'flag_1' ) , { wrapper } ) ;
446-
447- expect ( mockUserContext . decideAsync ) . not . toHaveBeenCalled ( ) ;
448- } ) ;
449413} ) ;
0 commit comments