From 828ae4d4f14016b7b314742583c4f80fa6fbbd7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=95=E7=9B=88=E8=BE=89=E5=BE=8B=E5=B8=88?= Date: Wed, 20 May 2026 03:48:10 +0800 Subject: [PATCH] fix: ignore core state commits after unmount (#2021) Co-authored-by: LawyerLyu Co-authored-by: Steven Enamakel --- .../__tests__/CoreStateProvider.test.tsx | 32 ++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/app/src/providers/__tests__/CoreStateProvider.test.tsx b/app/src/providers/__tests__/CoreStateProvider.test.tsx index c0980cf6d..fb81be620 100644 --- a/app/src/providers/__tests__/CoreStateProvider.test.tsx +++ b/app/src/providers/__tests__/CoreStateProvider.test.tsx @@ -46,6 +46,16 @@ function makeSnapshot(overrides: { }; } +function deferred() { + let resolve!: (value: T) => void; + let reject!: (reason?: unknown) => void; + const promise = new Promise((res, rej) => { + resolve = res; + reject = rej; + }); + return { promise, resolve, reject }; +} + function makeJwt(payload: Record): string { const encode = (value: Record) => window.btoa(JSON.stringify(value)).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, ''); @@ -229,12 +239,9 @@ describe('CoreStateProvider — identity-change cache clearing', () => { await waitFor(() => expect(screen.getByTestId('ready').textContent).toBe('ready')); }); - it('does not commit a pending bootstrap refresh after unmount', async () => { - let resolveSnapshot!: (snapshot: Snapshot) => void; - const pendingSnapshot = new Promise(resolve => { - resolveSnapshot = resolve; - }); - fetchSnapshot.mockReturnValue(pendingSnapshot); + it('does not commit a poll snapshot after the provider unmounts (#1934)', async () => { + const pendingSnapshot = deferred(); + fetchSnapshot.mockReturnValue(pendingSnapshot.promise); listTeams.mockResolvedValue([]); const { unmount } = render( @@ -243,16 +250,19 @@ describe('CoreStateProvider — identity-change cache clearing', () => { ); + expect(screen.getByTestId('ready').textContent).toBe('boot'); + unmount(); await act(async () => { - resolveSnapshot(makeSnapshot({ userId: null, sessionToken: null })); - await pendingSnapshot; - await Promise.resolve(); + pendingSnapshot.resolve(makeSnapshot({ userId: 'late-user', sessionToken: 'late-token' })); + await pendingSnapshot.promise; }); - expect(getCoreStateSnapshot().isReady).toBe(false); - expect(getCoreStateSnapshot().snapshot.auth.userId).toBeNull(); + const snapshot = getCoreStateSnapshot(); + expect(snapshot.isReady).toBe(false); + expect(snapshot.snapshot.auth.userId).toBeNull(); + expect(snapshot.snapshot.sessionToken).toBeNull(); }); it('warns when the initial core state poll fails', async () => {