|
1 | 1 | import AsyncStorage from '@react-native-async-storage/async-storage'; |
2 | | -import { loadLinkPreviewsEnabled, saveLinkPreviewsEnabled } from './storage'; |
| 2 | +import { useSettings } from '@/src/common/settings'; |
3 | 3 |
|
4 | | -const KEY = 'polycentric:generate-link-previews-enabled'; |
| 4 | +const SETTINGS_KEY = 'polycentric:settings'; |
5 | 5 |
|
6 | 6 | beforeEach(async () => { |
7 | 7 | await AsyncStorage.clear(); |
| 8 | + useSettings.setState({ linkPreviewsEnabled: true }); |
8 | 9 | jest.clearAllMocks(); |
9 | 10 | }); |
10 | 11 |
|
11 | | -describe('link-previews storage', () => { |
12 | | - it('returns undefined when nothing is stored', async () => { |
13 | | - expect(await loadLinkPreviewsEnabled()).toBeUndefined(); |
| 12 | +describe('settings store — linkPreviewsEnabled', () => { |
| 13 | + it('defaults to true', () => { |
| 14 | + expect(useSettings.getState().linkPreviewsEnabled).toBe(true); |
14 | 15 | }); |
15 | 16 |
|
16 | | - it('round-trips true and false', async () => { |
17 | | - await saveLinkPreviewsEnabled(true); |
18 | | - expect(await loadLinkPreviewsEnabled()).toBe(true); |
| 17 | + it('round-trips true and false', () => { |
| 18 | + useSettings.getState().setLinkPreviewsEnabled(false); |
| 19 | + expect(useSettings.getState().linkPreviewsEnabled).toBe(false); |
19 | 20 |
|
20 | | - await saveLinkPreviewsEnabled(false); |
21 | | - expect(await loadLinkPreviewsEnabled()).toBe(false); |
| 21 | + useSettings.getState().setLinkPreviewsEnabled(true); |
| 22 | + expect(useSettings.getState().linkPreviewsEnabled).toBe(true); |
22 | 23 | }); |
23 | 24 |
|
24 | | - it('persists as a string under the documented key', async () => { |
25 | | - await saveLinkPreviewsEnabled(false); |
26 | | - expect(await AsyncStorage.getItem(KEY)).toBe('false'); |
| 25 | + it('persists via the settings key', async () => { |
| 26 | + useSettings.getState().setLinkPreviewsEnabled(false); |
| 27 | + |
| 28 | + // The persist middleware calls AsyncStorage.setItem during setState. |
| 29 | + // Flush pending microtasks so the mock's async setItem resolves. |
| 30 | + await new Promise((resolve) => setImmediate(resolve)); |
| 31 | + |
| 32 | + expect(AsyncStorage.setItem).toHaveBeenCalledWith( |
| 33 | + SETTINGS_KEY, |
| 34 | + expect.stringContaining('"linkPreviewsEnabled":false'), |
| 35 | + ); |
27 | 36 | }); |
28 | 37 |
|
29 | | - it('ignores a malformed stored value', async () => { |
30 | | - await AsyncStorage.setItem(KEY, 'maybe'); |
31 | | - expect(await loadLinkPreviewsEnabled()).toBeUndefined(); |
| 38 | + it('recovers from a malformed stored value', async () => { |
| 39 | + await AsyncStorage.setItem(SETTINGS_KEY, '{broken'); |
| 40 | + const { persist } = useSettings; |
| 41 | + await persist.rehydrate(); |
| 42 | + // Should fall back to the default |
| 43 | + expect(useSettings.getState().linkPreviewsEnabled).toBe(true); |
32 | 44 | }); |
33 | 45 |
|
34 | | - it('returns undefined instead of throwing when storage errors', async () => { |
| 46 | + it('returns the default instead of throwing when storage errors', async () => { |
35 | 47 | (AsyncStorage.getItem as jest.Mock).mockRejectedValueOnce( |
36 | 48 | new Error('boom'), |
37 | 49 | ); |
38 | | - expect(await loadLinkPreviewsEnabled()).toBeUndefined(); |
| 50 | + const { persist } = useSettings; |
| 51 | + await persist.rehydrate(); |
| 52 | + expect(useSettings.getState().linkPreviewsEnabled).toBe(true); |
39 | 53 | }); |
40 | 54 | }); |
0 commit comments