Skip to content

Commit 7f6b0fa

Browse files
committed
test: align storage mocks with web storage semantics
1 parent a47b62c commit 7f6b0fa

3 files changed

Lines changed: 13 additions & 7 deletions

File tree

frontend/src/__tests__/App.contract.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,6 @@ describe('App contract', () => {
161161

162162
expect(screen.getByText('Add access token')).toBeInTheDocument();
163163
expect(screen.queryByText('Feed generation failed')).not.toBeInTheDocument();
164-
expect(globalThis.localStorage.getItem('html2rss_access_token')).toBeUndefined();
164+
expect(globalThis.localStorage.getItem('html2rss_access_token')).toBeNull();
165165
});
166166
});

frontend/src/__tests__/setup.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ const createStorageMock = () => {
2929
get length() {
3030
return store.size;
3131
},
32-
getItem: vi.fn((key: string) => (store.has(key) ? store.get(key)! : undefined)),
32+
// eslint-disable-next-line unicorn/no-null -- Web Storage returns null for missing keys.
33+
getItem: vi.fn((key: string) => (store.has(key) ? store.get(key)! : null)),
3334
setItem: vi.fn((key: string, value: string) => {
3435
store.set(key, value);
3536
}),
@@ -39,7 +40,8 @@ const createStorageMock = () => {
3940
clear: vi.fn(() => {
4041
store.clear();
4142
}),
42-
key: vi.fn((index: number) => [...store.keys()][index] ?? undefined),
43+
// eslint-disable-next-line unicorn/no-null -- Web Storage key() returns null for out-of-range indexes.
44+
key: vi.fn((index: number) => [...store.keys()][index] ?? null),
4345
},
4446
};
4547
};
@@ -49,10 +51,14 @@ const session = createStorageMock();
4951

5052
Object.defineProperty(globalThis, 'localStorage', {
5153
value: local.api,
54+
configurable: true,
55+
writable: true,
5256
});
5357

5458
Object.defineProperty(globalThis, 'sessionStorage', {
5559
value: session.api,
60+
configurable: true,
61+
writable: true,
5662
});
5763

5864
beforeEach(() => {

frontend/src/__tests__/useAccessToken.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ describe('useAccessToken', () => {
2727
expect(result.current.isLoading).toBe(false);
2828
expect(result.current.token).toBe('legacy-token');
2929
expect(globalThis.localStorage.getItem('html2rss_access_token')).toBe('legacy-token');
30-
expect(globalThis.sessionStorage.getItem('html2rss_access_token')).toBeUndefined();
30+
expect(globalThis.sessionStorage.getItem('html2rss_access_token')).toBeNull();
3131
});
3232

3333
it('saves new tokens to the persistent storage path', async () => {
@@ -40,7 +40,7 @@ describe('useAccessToken', () => {
4040
expect(result.current.token).toBe('new-token');
4141
expect(result.current.hasToken).toBe(true);
4242
expect(globalThis.localStorage.getItem('html2rss_access_token')).toBe('new-token');
43-
expect(globalThis.sessionStorage.getItem('html2rss_access_token')).toBeUndefined();
43+
expect(globalThis.sessionStorage.getItem('html2rss_access_token')).toBeNull();
4444
});
4545

4646
it('clears both persistent and legacy token copies', async () => {
@@ -55,7 +55,7 @@ describe('useAccessToken', () => {
5555

5656
expect(result.current.token).toBeUndefined();
5757
expect(result.current.hasToken).toBe(false);
58-
expect(globalThis.localStorage.getItem('html2rss_access_token')).toBeUndefined();
59-
expect(globalThis.sessionStorage.getItem('html2rss_access_token')).toBeUndefined();
58+
expect(globalThis.localStorage.getItem('html2rss_access_token')).toBeNull();
59+
expect(globalThis.sessionStorage.getItem('html2rss_access_token')).toBeNull();
6060
});
6161
});

0 commit comments

Comments
 (0)