Refactor unit tests for useFeatureFlags to improve readability, consistency, and formatting

This commit is contained in:
2026-01-28 22:54:28 +00:00
parent 338ee1f750
commit cf106cd5f3

View File

@@ -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);
});