@@ -165,40 +165,75 @@ describe('State', () => {
165165 expect ( signInResourceSignal ( ) . resource ) . toBe ( existingSignIn ) ;
166166 expect ( signInResourceSignal ( ) . resource ?. id ) . toBe ( 'signin_123' ) ;
167167 } ) ;
168- } ) ;
169- } ) ;
170168
171- describe ( 'Simulated client refresh scenarios' , ( ) => {
172- it ( 'should allow null update after finalize sets canBeDiscarded to true' , async ( ) => {
173- // This test verifies that after finalize() is called,
174- // the null update IS allowed (because canBeDiscarded is true)
169+ it ( 'should allow null resource update when previous resource exists and canBeDiscarded is true' , async ( ) => {
170+ // Arrange: Set up a SignIn with id and mock setActive
171+ const mockSetActive = vi . fn ( ) . mockResolvedValue ( { } ) ;
172+ SignIn . clerk = { setActive : mockSetActive , client : { sessions : [ { id : 'session_123' } ] } } as any ;
175173
176- // Arrange
177- const mockSetActive = vi . fn ( ) . mockResolvedValue ( { } ) ;
178- SignUp . clerk = { setActive : mockSetActive } as any ;
174+ const existingSignIn = new SignIn ( {
175+ id : 'signin_123' ,
176+ status : 'complete' ,
177+ created_session_id : 'session_123' ,
178+ } as any ) ;
179+ expect ( signInResourceSignal ( ) . resource ) . toBe ( existingSignIn ) ;
180+ expect ( existingSignIn . __internal_future . canBeDiscarded ) . toBe ( false ) ;
179181
180- const signUp = new SignUp ( {
181- id : 'signup_123' ,
182- status : 'complete' ,
183- created_session_id : 'session_123' ,
184- } as any ) ;
182+ // Act: Call finalize() which sets canBeDiscarded to true
183+ await existingSignIn . __internal_future . finalize ( ) ;
185184
186- expect ( signUpResourceSignal ( ) . resource ?. id ) . toBe ( 'signup_123' ) ;
187- expect ( signUp . __internal_future . canBeDiscarded ) . toBe ( false ) ;
185+ expect ( existingSignIn . __internal_future . canBeDiscarded ) . toBe ( true ) ;
186+ expect ( mockSetActive ) . toHaveBeenCalledWith ( { session : 'session_123' , navigate : undefined } ) ;
188187
189- // Act: Call finalize - this sets canBeDiscarded to true
190- await signUp . __internal_future . finalize ( ) ;
188+ // Now emit a null resource update
189+ const nullSignIn = new SignIn ( null ) ;
191190
192- // Verify canBeDiscarded is now true
193- expect ( signUp . __internal_future . canBeDiscarded ) . toBe ( true ) ;
191+ // Assert: The null update SHOULD be allowed because canBeDiscarded is true
192+ expect ( signInResourceSignal ( ) . resource ) . toBe ( nullSignIn ) ;
193+ expect ( signInResourceSignal ( ) . resource ?. id ) . toBeUndefined ( ) ;
194+ } ) ;
194195
195- // Now simulate a null update
196- const nullSignUp = new SignUp ( null ) ;
196+ it ( 'should allow null resource update after reset() is called' , async ( ) => {
197+ // Arrange: Set up mock client
198+ let newSignInFromReset : SignIn | null = null ;
199+ const mockClient = {
200+ signIn : new SignIn ( null ) ,
201+ resetSignIn : vi . fn ( ) . mockImplementation ( function ( this : typeof mockClient ) {
202+ newSignInFromReset = new SignIn ( null ) ;
203+ this . signIn = newSignInFromReset ;
204+ eventBus . emit ( 'resource:error' , { resource : newSignInFromReset , error : null } ) ;
205+ eventBus . emit ( 'resource:update' , { resource : newSignInFromReset } ) ;
206+ } ) ,
207+ } ;
208+ SignIn . clerk = { client : mockClient } as any ;
209+
210+ // Create a SignIn with id
211+ const existingSignIn = new SignIn ( { id : 'signin_123' , status : 'needs_identifier' } as any ) ;
212+ expect ( signInResourceSignal ( ) . resource ?. id ) . toBe ( 'signin_123' ) ;
213+ expect ( existingSignIn . __internal_future . canBeDiscarded ) . toBe ( false ) ;
214+
215+ // Act: Call reset()
216+ await existingSignIn . __internal_future . reset ( ) ;
197217
198- // Assert: The null update SHOULD be allowed now
199- // Because canBeDiscarded is true, shouldIgnoreNullUpdate returns false
200- expect ( signUpResourceSignal ( ) . resource ) . toBe ( nullSignUp ) ;
201- expect ( signUpResourceSignal ( ) . resource ?. id ) . toBeUndefined ( ) ;
218+ // Assert
219+ expect ( mockClient . resetSignIn ) . toHaveBeenCalled ( ) ;
220+ expect ( existingSignIn . __internal_future . canBeDiscarded ) . toBe ( true ) ;
221+ expect ( signInResourceSignal ( ) . resource ) . toBe ( newSignInFromReset ) ;
222+ expect ( signInResourceSignal ( ) . resource ?. id ) . toBeUndefined ( ) ;
223+ } ) ;
224+
225+ it ( 'should allow resource update when new resource has an id (not a null update)' , ( ) => {
226+ // Arrange: Set up a SignIn with id
227+ const existingSignIn = new SignIn ( { id : 'signin_123' , status : 'needs_identifier' } as any ) ;
228+ expect ( signInResourceSignal ( ) . resource ?. id ) . toBe ( 'signin_123' ) ;
229+
230+ // Act: Emit a resource update with a different SignIn that also has an id
231+ const newSignIn = new SignIn ( { id : 'signin_456' , status : 'complete' } as any ) ;
232+
233+ // Assert: Signal should be updated with the new SignIn
234+ expect ( signInResourceSignal ( ) . resource ) . toBe ( newSignIn ) ;
235+ expect ( signInResourceSignal ( ) . resource ?. id ) . toBe ( 'signin_456' ) ;
236+ } ) ;
202237 } ) ;
203238 } ) ;
204239
0 commit comments