mirror of https://github.com/open-feature/cli.git
99 lines
3.5 KiB
TypeScript
99 lines
3.5 KiB
TypeScript
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<string, number> = { usernameMaxLength: 100, discountPercentage: 0.25 };
|
|
return { value: values[flagKey] ?? defaultValue, reason: 'STATIC' };
|
|
}
|
|
async resolveObjectEvaluation<T>(flagKey: string, defaultValue: JsonValue) {
|
|
const values: Record<string, JsonValue> = {
|
|
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(); |