From cf106cd5f3b9af8f60b1477173220e7f9cc64d73 Mon Sep 17 00:00:00 2001 From: FragginWagon Date: Wed, 28 Jan 2026 22:54:28 +0000 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Refactor=20unit=20tests=20for=20`us?= =?UTF-8?q?eFeatureFlags`=20to=20improve=20readability,=20consistency,=20a?= =?UTF-8?q?nd=20formatting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../unit/composables/useFeatureFlags.test.js | 99 ++++++++++--------- 1 file changed, 51 insertions(+), 48 deletions(-) diff --git a/code/websites/pokedex.online/tests/unit/composables/useFeatureFlags.test.js b/code/websites/pokedex.online/tests/unit/composables/useFeatureFlags.test.js index e696df7..52fa853 100644 --- a/code/websites/pokedex.online/tests/unit/composables/useFeatureFlags.test.js +++ b/code/websites/pokedex.online/tests/unit/composables/useFeatureFlags.test.js @@ -18,7 +18,7 @@ describe('useFeatureFlags', () => { useAuth.mockReturnValue({ user: { isAdmin: false, permissions: [] }, token: null, - hasPermission: vi.fn((perm) => false) + hasPermission: vi.fn(perm => false) }); }); @@ -29,7 +29,7 @@ describe('useFeatureFlags', () => { describe('isEnabled', () => { it('returns flag default value when no override exists', () => { const { isEnabled } = useFeatureFlags(); - + // ENABLE_CACHING defaults to true expect(isEnabled.value('enable-caching')).toBe(true); // DARK_MODE defaults to false @@ -38,12 +38,12 @@ describe('useFeatureFlags', () => { it('respects local override when set', () => { const { isEnabled, toggle } = useFeatureFlags(); - + expect(isEnabled.value('dark-mode')).toBe(false); - + toggle('dark-mode'); expect(isEnabled.value('dark-mode')).toBe(true); - + toggle('dark-mode'); expect(isEnabled.value('dark-mode')).toBe(false); }); @@ -56,7 +56,7 @@ describe('useFeatureFlags', () => { }); const { isEnabled } = useFeatureFlags(); - + // GAMEMASTER_DIFF_VIEWER requires 'gamemaster-advanced' permission expect(isEnabled.value('gamemaster-diff-viewer')).toBe(false); }); @@ -65,18 +65,18 @@ describe('useFeatureFlags', () => { useAuth.mockReturnValue({ user: { isAdmin: false, permissions: ['gamemaster-advanced'] }, token: null, - hasPermission: vi.fn((perm) => perm === 'gamemaster-advanced') + hasPermission: vi.fn(perm => perm === 'gamemaster-advanced') }); const { isEnabled } = useFeatureFlags(); - + // With permission and enabled default, should be true expect(isEnabled.value('gamemaster-diff-viewer')).toBe(true); }); it('returns false for unknown flag name', () => { const { isEnabled } = useFeatureFlags(); - + expect(isEnabled.value('nonexistent-flag')).toBe(false); }); @@ -88,10 +88,10 @@ describe('useFeatureFlags', () => { }); const { isEnabled, toggle } = useFeatureFlags(); - + // Initially disabled due to missing permission expect(isEnabled.value('gamemaster-diff-viewer')).toBe(false); - + // Local override enables it toggle('gamemaster-diff-viewer'); expect(isEnabled.value('gamemaster-diff-viewer')).toBe(true); @@ -101,38 +101,41 @@ describe('useFeatureFlags', () => { describe('toggle', () => { it('toggles flag override in development mode', () => { const { isEnabled, toggle } = useFeatureFlags(); - + expect(isEnabled.value('dark-mode')).toBe(false); - + const result = toggle('dark-mode'); expect(result).toBe(true); expect(isEnabled.value('dark-mode')).toBe(true); - + toggle('dark-mode'); expect(isEnabled.value('dark-mode')).toBe(false); }); it('persists override to localStorage', () => { const { toggle } = useFeatureFlags(); - + toggle('dark-mode'); - + const stored = localStorage.getItem('feature_flag_overrides'); expect(stored).toBeDefined(); - + const overrides = JSON.parse(stored); expect(overrides['dark-mode']).toBe(true); }); it('loads overrides from localStorage on init', () => { // Set override in storage - localStorage.setItem('feature_flag_overrides', JSON.stringify({ - 'dark-mode': true, - 'experimental-search': true - })); + localStorage.setItem( + 'feature_flag_overrides', + JSON.stringify({ + 'dark-mode': true, + 'experimental-search': true + }) + ); const { isEnabled } = useFeatureFlags(); - + expect(isEnabled.value('dark-mode')).toBe(true); expect(isEnabled.value('experimental-search')).toBe(true); }); @@ -141,21 +144,21 @@ describe('useFeatureFlags', () => { describe('reset', () => { it('removes override for specific flag', () => { const { isEnabled, toggle, reset } = useFeatureFlags(); - + toggle('dark-mode'); expect(isEnabled.value('dark-mode')).toBe(true); - + reset('dark-mode'); expect(isEnabled.value('dark-mode')).toBe(false); }); it('returns to default after reset', () => { const { isEnabled, toggle, reset } = useFeatureFlags(); - + // ENABLE_CACHING defaults to true toggle('enable-caching'); // Toggle to false expect(isEnabled.value('enable-caching')).toBe(false); - + reset('enable-caching'); // Reset to default expect(isEnabled.value('enable-caching')).toBe(true); }); @@ -164,17 +167,17 @@ describe('useFeatureFlags', () => { describe('resetAll', () => { it('clears all overrides', () => { const { isEnabled, toggle, resetAll } = useFeatureFlags(); - + toggle('dark-mode'); toggle('experimental-search'); toggle('enable-caching'); - + expect(isEnabled.value('dark-mode')).toBe(true); expect(isEnabled.value('experimental-search')).toBe(true); expect(isEnabled.value('enable-caching')).toBe(false); - + resetAll(); - + expect(isEnabled.value('dark-mode')).toBe(false); expect(isEnabled.value('experimental-search')).toBe(false); expect(isEnabled.value('enable-caching')).toBe(true); // Back to default @@ -182,12 +185,12 @@ describe('useFeatureFlags', () => { it('clears localStorage after reset', () => { const { toggle, resetAll } = useFeatureFlags(); - + toggle('dark-mode'); localStorage.getItem('feature_flag_overrides'); // Has value - + resetAll(); - + const stored = localStorage.getItem('feature_flag_overrides'); expect(stored).toBe('{}'); }); @@ -202,12 +205,12 @@ describe('useFeatureFlags', () => { }); const { getFlags } = useFeatureFlags(); - + const flags = getFlags(); - + expect(Array.isArray(flags)).toBe(true); expect(flags.length).toBeGreaterThan(0); - + const darkMode = flags.find(f => f.name === 'dark-mode'); expect(darkMode).toBeDefined(); expect(darkMode).toHaveProperty('isEnabled'); @@ -218,12 +221,12 @@ describe('useFeatureFlags', () => { it('marks flags with overrides', () => { const { getFlags, toggle } = useFeatureFlags(); - + toggle('dark-mode'); - + const flags = getFlags(); const darkMode = flags.find(f => f.name === 'dark-mode'); - + expect(darkMode.hasOverride).toBe(true); expect(darkMode.override).toBe(true); }); @@ -236,13 +239,13 @@ describe('useFeatureFlags', () => { }); const { getFlags } = useFeatureFlags(); - + const flags = getFlags(); - + const permissionRequired = flags.find(f => f.requiresPermission); expect(permissionRequired).toBeDefined(); expect(permissionRequired.hasPermission).toBe(false); - + const noPermissionRequired = flags.find(f => !f.requiresPermission); expect(noPermissionRequired).toBeDefined(); expect(noPermissionRequired.hasPermission).toBe(true); @@ -252,27 +255,27 @@ describe('useFeatureFlags', () => { describe('setBackendFlags', () => { it('sets flags from backend response', () => { const { isEnabled, setBackendFlags } = useFeatureFlags(); - + expect(isEnabled.value('dark-mode')).toBe(false); - + setBackendFlags({ 'dark-mode': true, 'experimental-search': true }); - + expect(isEnabled.value('dark-mode')).toBe(true); expect(isEnabled.value('experimental-search')).toBe(true); }); it('local overrides take precedence over backend flags', () => { const { isEnabled, toggle, setBackendFlags } = useFeatureFlags(); - + toggle('dark-mode'); // Override to true - + setBackendFlags({ 'dark-mode': false // Backend says false }); - + // Local override should win expect(isEnabled.value('dark-mode')).toBe(true); });