@@ -79,35 +79,41 @@ describe('useOptimizelyUserContext', () => {
7979 consoleSpy . mockRestore ( ) ;
8080 } ) ;
8181
82- it ( 'should return null when no user context is set' , ( ) => {
82+ it ( 'should return isLoading: true with null userContext when no user context is set' , ( ) => {
8383 const wrapper = createWrapper ( store ) ;
8484 const { result } = renderHook ( ( ) => useOptimizelyUserContext ( ) , { wrapper } ) ;
8585
86- expect ( result . current ) . toBeNull ( ) ;
86+ expect ( result . current . isLoading ) . toBe ( true ) ;
87+ expect ( result . current . error ) . toBeNull ( ) ;
88+ expect ( result . current . userContext ) . toBeNull ( ) ;
8789 } ) ;
8890
89- it ( 'should return the current user context from the store ' , ( ) => {
91+ it ( 'should return the current user context with isLoading: false ' , ( ) => {
9092 const mockUserContext = createMockUserContext ( ) ;
9193 store . setUserContext ( mockUserContext ) ;
9294
9395 const wrapper = createWrapper ( store ) ;
9496 const { result } = renderHook ( ( ) => useOptimizelyUserContext ( ) , { wrapper } ) ;
9597
96- expect ( result . current ) . toBe ( mockUserContext ) ;
98+ expect ( result . current . isLoading ) . toBe ( false ) ;
99+ expect ( result . current . error ) . toBeNull ( ) ;
100+ expect ( result . current . userContext ) . toBe ( mockUserContext ) ;
97101 } ) ;
98102
99103 it ( 'should update when user context changes' , async ( ) => {
100104 const wrapper = createWrapper ( store ) ;
101105 const { result } = renderHook ( ( ) => useOptimizelyUserContext ( ) , { wrapper } ) ;
102106
103- expect ( result . current ) . toBeNull ( ) ;
107+ expect ( result . current . isLoading ) . toBe ( true ) ;
108+ expect ( result . current . userContext ) . toBeNull ( ) ;
104109
105110 const mockUserContext = createMockUserContext ( 'user-1' ) ;
106111 await act ( async ( ) => {
107112 store . setUserContext ( mockUserContext ) ;
108113 } ) ;
109114
110- expect ( result . current ) . toBe ( mockUserContext ) ;
115+ expect ( result . current . isLoading ) . toBe ( false ) ;
116+ expect ( result . current . userContext ) . toBe ( mockUserContext ) ;
111117 } ) ;
112118
113119 it ( 'should update when user context changes to a different user' , async ( ) => {
@@ -117,30 +123,47 @@ describe('useOptimizelyUserContext', () => {
117123 const wrapper = createWrapper ( store ) ;
118124 const { result } = renderHook ( ( ) => useOptimizelyUserContext ( ) , { wrapper } ) ;
119125
120- expect ( result . current ) . toBe ( userContext1 ) ;
126+ expect ( result . current . userContext ) . toBe ( userContext1 ) ;
121127
122128 const userContext2 = createMockUserContext ( 'user-2' ) ;
123129 await act ( async ( ) => {
124130 store . setUserContext ( userContext2 ) ;
125131 } ) ;
126132
127- expect ( result . current ) . toBe ( userContext2 ) ;
133+ expect ( result . current . userContext ) . toBe ( userContext2 ) ;
128134 } ) ;
129135
130- it ( 'should update to null when store is reset' , async ( ) => {
136+ it ( 'should return isLoading: true when store is reset' , async ( ) => {
131137 const mockUserContext = createMockUserContext ( ) ;
132138 store . setUserContext ( mockUserContext ) ;
133139
134140 const wrapper = createWrapper ( store ) ;
135141 const { result } = renderHook ( ( ) => useOptimizelyUserContext ( ) , { wrapper } ) ;
136142
137- expect ( result . current ) . toBe ( mockUserContext ) ;
143+ expect ( result . current . userContext ) . toBe ( mockUserContext ) ;
138144
139145 await act ( async ( ) => {
140146 store . reset ( ) ;
141147 } ) ;
142148
143- expect ( result . current ) . toBeNull ( ) ;
149+ expect ( result . current . isLoading ) . toBe ( true ) ;
150+ expect ( result . current . userContext ) . toBeNull ( ) ;
151+ } ) ;
152+
153+ it ( 'should return error with isLoading: false when store has error' , async ( ) => {
154+ const wrapper = createWrapper ( store ) ;
155+ const { result } = renderHook ( ( ) => useOptimizelyUserContext ( ) , { wrapper } ) ;
156+
157+ expect ( result . current . isLoading ) . toBe ( true ) ;
158+
159+ const testError = new Error ( 'SDK initialization failed' ) ;
160+ await act ( async ( ) => {
161+ store . setError ( testError ) ;
162+ } ) ;
163+
164+ expect ( result . current . isLoading ) . toBe ( false ) ;
165+ expect ( result . current . error ) . toBe ( testError ) ;
166+ expect ( result . current . userContext ) . toBeNull ( ) ;
144167 } ) ;
145168
146169 it ( 'should unsubscribe from store on unmount' , ( ) => {
@@ -164,10 +187,10 @@ describe('useOptimizelyUserContext', () => {
164187
165188 let capturedRenderCount = 0 ;
166189 function TestComponent ( ) {
167- const ctx = useOptimizelyUserContext ( ) ;
190+ const { userContext } = useOptimizelyUserContext ( ) ;
168191 const renderCount = useRenderCount ( ) ;
169192 capturedRenderCount = renderCount ;
170- return < div data-testid = "user-id" > { ctx ?. getUserId ( ) } </ div > ;
193+ return < div data-testid = "user-id" > { userContext ?. getUserId ( ) } </ div > ;
171194 }
172195
173196 const contextValue : OptimizelyContextValue = {
@@ -184,8 +207,8 @@ describe('useOptimizelyUserContext', () => {
184207 const initialRenderCount = capturedRenderCount ;
185208
186209 // Changing isClientReady triggers a store notification,
187- // but since userContext reference didn 't change, React's useState
188- // bails out and skips the re-render
210+ // but since the derived result hasn 't changed, useMemo returns
211+ // the same reference and React bails out
189212 act ( ( ) => {
190213 store . setClientReady ( true ) ;
191214 } ) ;
0 commit comments