Skip to content

Commit 78da62d

Browse files
committed
test(clerk-js): add full SignIn parity and remove duplicate tests
1 parent d6e010b commit 78da62d

1 file changed

Lines changed: 61 additions & 26 deletions

File tree

packages/clerk-js/src/core/__tests__/state.test.ts

Lines changed: 61 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)