import { OpenFeature, JsonValue } from "@openfeature/server-sdk"; import { existsSync, readdirSync } from 'node:fs'; import { join, dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); // Simple test provider class TestProvider { get name() { return 'test-provider'; } get metadata() { return { name: 'test-provider' }; } async resolveBooleanEvaluation(flagKey: string, defaultValue: boolean) { return { value: flagKey === 'enableFeatureA' ? true : defaultValue, reason: 'STATIC' }; } async resolveStringEvaluation(flagKey: string, defaultValue: string) { return { value: flagKey === 'greetingMessage' ? 'Hello from test!' : defaultValue, reason: 'STATIC' }; } async resolveNumberEvaluation(flagKey: string, defaultValue: number) { const values: Record = { usernameMaxLength: 100, discountPercentage: 0.25 }; return { value: values[flagKey] ?? defaultValue, reason: 'STATIC' }; } async resolveObjectEvaluation(flagKey: string, defaultValue: JsonValue) { const values: Record = { themeCustomization: { primaryColor: '#ff0000', secondaryColor: '#00ff00' } as T }; return { value: values[flagKey] ?? defaultValue, reason: 'STATIC' }; } } async function main() { try { console.log('๐Ÿš€ Node.js OpenFeature Integration Test'); // 1. Check generated files const generatedDir = join(__dirname, 'generated'); if (!existsSync(generatedDir)) { throw new Error('Generated directory not found'); } const files = readdirSync(generatedDir); const clientFile = files.find(file => file.includes('openfeature')); if (!clientFile) { throw new Error('openfeature.ts not found'); } console.log(`โœ… Found: ${clientFile}`); const clientPath = join(generatedDir, clientFile); // 3. Setup OpenFeature provider and test await OpenFeature.setProvider(new TestProvider()); const { getGeneratedClient } = await import(clientPath); const client = getGeneratedClient(); console.log('๐Ÿงช Testing flags...'); // Test each flag const tests = [ { name: 'enableFeatureA', expected: 'boolean' }, { name: 'greetingMessage', expected: 'string' }, { name: 'usernameMaxLength', expected: 'number' }, { name: 'discountPercentage', expected: 'number' }, { name: 'themeCustomization', expected: 'object' } ]; for (const test of tests) { if (client[test.name]) { const result = await client[test.name](); const type = typeof result; if (type === test.expected) { console.log(`โœ… ${test.name}: ${result} | type: (${type})`); } else { throw new Error(`${test.name} returned ${type}, expected ${test.expected}`); } } else { console.log(`โš ๏ธ ${test.name} method not found`); process.exit(1); } } console.log('๐ŸŽ‰ All tests passed!'); process.exit(0); } catch (error) { console.error('โŒ Test failed:', error.message); process.exit(1); } } main();