@@ -36,7 +36,7 @@ const sessionAtom = ref<SessionState>({
3636 error : null ,
3737} )
3838
39- const mockClient = {
39+ const mockClient : Record < string , any > = {
4040 useSession : vi . fn ( ( ) => sessionAtom ) ,
4141 getSession : vi . fn ( async ( ) => ( { data : null } ) ) ,
4242 $store : {
@@ -108,6 +108,7 @@ describe('useUserSession hydration bootstrap', () => {
108108 mockClient . getSession . mockClear ( )
109109 mockClient . $store . listen . mockClear ( )
110110 mockClient . signOut . mockClear ( )
111+ mockClient . updateUser = undefined
111112 mockClient . signIn . social . mockClear ( )
112113 mockClient . signIn . email . mockClear ( )
113114 mockClient . signUp . email . mockClear ( )
@@ -203,6 +204,50 @@ describe('useUserSession hydration bootstrap', () => {
203204 expect ( auth . user . value ) . toEqual ( { id : 'user-2' , email : 'user@example.com' } )
204205 } )
205206
207+ it ( 'updateUser persists on client and updates local state optimistically' , async ( ) => {
208+ mockClient . updateUser = vi . fn ( async ( ) => ( { data : { status : true } } ) )
209+ const useUserSession = await loadUseUserSession ( )
210+ const auth = useUserSession ( )
211+ auth . user . value = { id : 'user-1' , name : 'Old' , email : 'a@b.com' }
212+
213+ await auth . updateUser ( { name : 'New' } )
214+
215+ expect ( mockClient . updateUser ) . toHaveBeenCalledWith ( { name : 'New' } )
216+ expect ( auth . user . value ! . name ) . toBe ( 'New' )
217+ } )
218+
219+ it ( 'updateUser reverts local state when the server call throws' , async ( ) => {
220+ mockClient . updateUser = vi . fn ( async ( ) => {
221+ throw new Error ( 'fail' )
222+ } )
223+ const useUserSession = await loadUseUserSession ( )
224+ const auth = useUserSession ( )
225+ auth . user . value = { id : 'user-1' , name : 'Old' , email : 'a@b.com' }
226+
227+ await expect ( auth . updateUser ( { name : 'New' } ) ) . rejects . toThrow ( 'fail' )
228+ expect ( auth . user . value ! . name ) . toBe ( 'Old' )
229+ } )
230+
231+ it ( 'updateUser reverts local state when server returns an error payload' , async ( ) => {
232+ mockClient . updateUser = vi . fn ( async ( ) => ( { error : { message : 'invalid user update' } } ) )
233+ const useUserSession = await loadUseUserSession ( )
234+ const auth = useUserSession ( )
235+ auth . user . value = { id : 'user-1' , name : 'Old' , email : 'a@b.com' }
236+
237+ await expect ( auth . updateUser ( { name : 'New' } ) ) . rejects . toThrow ( 'invalid user update' )
238+ expect ( auth . user . value ! . name ) . toBe ( 'Old' )
239+ } )
240+
241+ it ( 'updateUser only updates local state on server (no client)' , async ( ) => {
242+ setRuntimeFlags ( { client : false , server : true } )
243+ const useUserSession = await loadUseUserSession ( )
244+ const auth = useUserSession ( )
245+ auth . user . value = { id : 'user-1' , name : 'Old' , email : 'a@b.com' }
246+
247+ await auth . updateUser ( { name : 'New' } )
248+ expect ( auth . user . value ! . name ) . toBe ( 'New' )
249+ } )
250+
206251 it ( 'syncs session on $sessionSignal when option is enabled and SSR payload is hydrated' , async ( ) => {
207252 payload . serverRendered = true
208253 runtimeConfig . public . auth . session . skipHydratedSsrGetSession = true
0 commit comments