diff --git a/src/utils/__tests__/preferences.sort.integration.test.ts b/src/utils/__tests__/preferences.sort.integration.test.ts new file mode 100644 index 0000000..7f121a2 --- /dev/null +++ b/src/utils/__tests__/preferences.sort.integration.test.ts @@ -0,0 +1,63 @@ +import { describe, it, expect, beforeEach } from 'vitest'; +import { getPreference, setPreference } from '../preferences.utils'; + +const SORT_KEY = 'creator-list:sort-order'; +type SortOrder = 'asc' | 'desc'; +const DEFAULT_SORT: SortOrder = 'asc'; + +/** + * Simulates an unmount + remount cycle by clearing and re-reading from localStorage, + * mirroring what happens when a component that calls getPreference re-renders fresh. + */ +function remount(key: string, defaultValue: SortOrder): SortOrder { + return getPreference(key, defaultValue); +} + +describe('preferences — sort order persistence across re-renders', () => { + beforeEach(() => { + window.localStorage.clear(); + }); + + it('reads back the saved sort preference after remount', () => { + setPreference(SORT_KEY, 'desc'); + + const restored = remount(SORT_KEY, DEFAULT_SORT); + + expect(restored).toBe('desc'); + }); + + it('applies the default sort when no preference is stored', () => { + const restored = remount(SORT_KEY, DEFAULT_SORT); + + expect(restored).toBe(DEFAULT_SORT); + }); + + it('overwriting a preference is reflected on the next remount', () => { + setPreference(SORT_KEY, 'desc'); + setPreference(SORT_KEY, 'asc'); + + const restored = remount(SORT_KEY, DEFAULT_SORT); + + expect(restored).toBe('asc'); + }); + + it('clearing storage resets to the default sort on remount', () => { + setPreference(SORT_KEY, 'desc'); + + window.localStorage.clear(); + + const restored = remount(SORT_KEY, DEFAULT_SORT); + + expect(restored).toBe(DEFAULT_SORT); + }); + + it('persists sort preference alongside unrelated keys without interference', () => { + setPreference('other-key', { theme: 'dark' }); + setPreference(SORT_KEY, 'desc'); + setPreference('another-key', 42); + + const restored = remount(SORT_KEY, DEFAULT_SORT); + + expect(restored).toBe('desc'); + }); +});