From fddcc8dfaa9428be5ca5cc6f7ee98a5f68fd089d Mon Sep 17 00:00:00 2001 From: iajibose Date: Thu, 6 Aug 2026 10:52:58 +0100 Subject: [PATCH] test(wallet-context): add regression coverage for malformed persisted session JSON readStoredSession already wraps JSON.parse in try/catch, validates shape via isWalletSession, and clears the bad localStorage key on failure, so no production code changes are needed. This adds the missing regression tests: syntactically invalid JSON (JSON.parse throws) and JSON that parses to a non-object value, both asserting hydration completes cleanly and the stale key is removed. Refs #1082 --- frontend/src/context/wallet-context.test.tsx | 33 ++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/frontend/src/context/wallet-context.test.tsx b/frontend/src/context/wallet-context.test.tsx index 7a1dad1d..88a9a473 100644 --- a/frontend/src/context/wallet-context.test.tsx +++ b/frontend/src/context/wallet-context.test.tsx @@ -77,6 +77,39 @@ describe('WalletProvider', () => { expect(result.current.session).toBeNull(); }); + it('should recover from syntactically invalid stored JSON without crashing', async () => { + localStorage.setItem(STORAGE_KEY, '{not valid json,,,'); + + const { result } = renderHook(() => useWallet(), { + wrapper: createWrapper(), + }); + + await waitFor(() => { + expect(result.current.isHydrated).toBe(true); + }); + + expect(result.current.status).toBe('idle'); + expect(result.current.session).toBeNull(); + expect(result.current.errorMessage).toBeNull(); + expect(localStorage.getItem(STORAGE_KEY)).toBeNull(); + }); + + it('should discard a stored session that parses to a non-object value', async () => { + localStorage.setItem(STORAGE_KEY, JSON.stringify('just-a-string')); + + const { result } = renderHook(() => useWallet(), { + wrapper: createWrapper(), + }); + + await waitFor(() => { + expect(result.current.isHydrated).toBe(true); + }); + + expect(result.current.status).toBe('idle'); + expect(result.current.session).toBeNull(); + expect(localStorage.getItem(STORAGE_KEY)).toBeNull(); + }); + it('should discard a session with mocked !== false', async () => { const mockedSession = { ...mockSession, mocked: true }; localStorage.setItem(STORAGE_KEY, JSON.stringify(mockedSession));