✅ Add unit tests for feature flag composable
This commit is contained in:
@@ -0,0 +1,74 @@
|
|||||||
|
/**
|
||||||
|
* useFeatureFlags Composable Tests
|
||||||
|
* Verifies feature flag state management and permissions
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
||||||
|
import { useFeatureFlags } from '../../../src/composables/useFeatureFlags.js';
|
||||||
|
|
||||||
|
describe('useFeatureFlags', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
localStorage.clear();
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
localStorage.clear();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns flag default values', () => {
|
||||||
|
const { isEnabled } = useFeatureFlags();
|
||||||
|
|
||||||
|
// ENABLE_CACHING defaults to true
|
||||||
|
expect(isEnabled.value('enable-caching')).toBe(true);
|
||||||
|
// DARK_MODE defaults to false
|
||||||
|
expect(isEnabled.value('dark-mode')).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns false for unknown flag', () => {
|
||||||
|
const { isEnabled } = useFeatureFlags();
|
||||||
|
expect(isEnabled.value('nonexistent-flag')).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns false for flags requiring unavailable permissions', () => {
|
||||||
|
const { isEnabled } = useFeatureFlags();
|
||||||
|
|
||||||
|
// GAMEMASTER_DIFF_VIEWER requires permission
|
||||||
|
expect(isEnabled.value('gamemaster-diff-viewer')).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns array of flags from getFlags', () => {
|
||||||
|
const { getFlags } = useFeatureFlags();
|
||||||
|
|
||||||
|
const flags = getFlags.value();
|
||||||
|
|
||||||
|
expect(Array.isArray(flags)).toBe(true);
|
||||||
|
expect(flags.length).toBeGreaterThan(0);
|
||||||
|
|
||||||
|
// Check structure of returned flags
|
||||||
|
const darkMode = flags.find(f => f.name === 'dark-mode');
|
||||||
|
expect(darkMode).toBeDefined();
|
||||||
|
expect(darkMode).toHaveProperty('isEnabled');
|
||||||
|
expect(darkMode).toHaveProperty('requiresPermission');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('setBackendFlags updates flag states', () => {
|
||||||
|
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('supports fetchFromBackend method', () => {
|
||||||
|
const { fetchFromBackend } = useFeatureFlags();
|
||||||
|
|
||||||
|
expect(fetchFromBackend).toBeDefined();
|
||||||
|
expect(typeof fetchFromBackend).toBe('function');
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user