Files
gridpilot.gg/apps/api/src/config/integration.test.ts
2026-01-16 21:44:26 +01:00

102 lines
4.6 KiB
TypeScript

/**
* Integration test to verify the feature flag system works end-to-end
*/
import { describe, expect, it } from 'vitest';
import { getFeatureState, isFeatureEnabled, loadFeatureConfig } from './feature-loader';
describe('Feature Flag Integration Test', () => {
it('should load config and provide correct feature states', async () => {
// Set test environment
process.env.NODE_ENV = 'test';
const result = await loadFeatureConfig();
// Verify config loaded from file
expect(result.loadedFrom).toBe('config-file');
expect(result.configPath).toBe('apps/api/src/config/features.config.ts');
// Verify core platform features (new structure)
expect(result.features['platform.dashboard']).toBe('enabled');
expect(result.features['platform.leagues']).toBe('enabled');
expect(result.features['platform.teams']).toBe('enabled');
// Verify auth features
expect(result.features['auth.signup']).toBe('enabled');
expect(result.features['auth.login']).toBe('enabled');
// Verify sponsor features (expanded)
expect(result.features['sponsors.portal']).toBe('enabled');
expect(result.features['sponsors.dashboard']).toBe('enabled');
expect(result.features['sponsors.campaigns']).toBe('enabled');
// Verify admin features
expect(result.features['admin.dashboard']).toBe('enabled');
expect(result.features['admin.userManagement']).toBe('enabled');
// Verify beta features (controlled in test)
expect(result.features['beta.newUI']).toBe('disabled');
expect(result.features['beta.experimental']).toBe('disabled');
// Verify utility functions work
expect(isFeatureEnabled(result.features, 'platform.dashboard')).toBe(true);
expect(isFeatureEnabled(result.features, 'beta.newUI')).toBe(false);
expect(getFeatureState(result.features, 'platform.dashboard')).toBe('enabled');
expect(getFeatureState(result.features, 'nonexistent')).toBe('disabled');
});
it('should work with different environments', async () => {
// Test development environment - alpha mode (all enabled)
process.env.NODE_ENV = 'development';
const devResult = await loadFeatureConfig();
expect(devResult.features['beta.newUI']).toBe('enabled');
expect(devResult.features['platform.dashboard']).toBe('enabled');
expect(devResult.features['sponsors.management']).toBe('enabled');
// Test production environment - beta mode (controlled rollout)
process.env.NODE_ENV = 'production';
const prodResult = await loadFeatureConfig();
expect(prodResult.features['beta.newUI']).toBe('disabled');
expect(prodResult.features['platform.dashboard']).toBe('enabled');
expect(prodResult.features['sponsors.management']).toBe('disabled'); // Not ready yet
expect(prodResult.features['admin.analytics']).toBe('disabled'); // Not ready yet
});
it('should handle the new two-tier architecture correctly', async () => {
// Development should have all platform features enabled (alpha mode)
process.env.NODE_ENV = 'development';
const devResult = await loadFeatureConfig();
// All core platform features should be enabled
expect(devResult.features['platform.dashboard']).toBe('enabled');
expect(devResult.features['platform.leagues']).toBe('enabled');
expect(devResult.features['platform.teams']).toBe('enabled');
expect(devResult.features['platform.drivers']).toBe('enabled');
expect(devResult.features['platform.races']).toBe('enabled');
expect(devResult.features['platform.leaderboards']).toBe('enabled');
// All auth features should be enabled
expect(devResult.features['auth.signup']).toBe('enabled');
expect(devResult.features['auth.login']).toBe('enabled');
expect(devResult.features['auth.forgotPassword']).toBe('enabled');
expect(devResult.features['auth.resetPassword']).toBe('enabled');
// Onboarding should be enabled
expect(devResult.features['onboarding.wizard']).toBe('enabled');
});
it('should return flattened features with expected structure', async () => {
process.env.NODE_ENV = 'test';
const result = await loadFeatureConfig();
// Verify the result has the expected shape for API response
expect(result).toHaveProperty('features');
expect(result).toHaveProperty('loadedFrom');
expect(result).toHaveProperty('configPath');
// Verify features is a flat object with dot-notation keys
expect(typeof result.features).toBe('object');
expect(result.features['platform.dashboard']).toBeDefined();
expect(result.features['sponsors.portal']).toBeDefined();
});
});