Skip to main content
Glama
test-generator-tools.js9.58 kB
#!/usr/bin/env node /** * Test suite for ECL MCP Generator Tools (Phase 5) * Tests example reconstruction, component generation, and playground creation */ import Database from 'better-sqlite3'; import { getCompleteExample, generateComponent, createPlayground } from './src/generator/index.js'; import { fileURLToPath } from 'url'; import { dirname, join } from 'path'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); // Open database in readonly mode const db = new Database(join(__dirname, 'ecl-database.sqlite'), { readonly: true }); let testsPassed = 0; let testsFailed = 0; function test(name, fn) { try { fn(); console.log(`✅ ${name}`); testsPassed++; } catch (error) { console.error(`❌ ${name}`); console.error(` ${error.message}`); testsFailed++; } } function assert(condition, message) { if (!condition) { throw new Error(message || 'Assertion failed'); } } console.log('\n🧪 Running Generator Tool Tests\n'); // Test 1: Get complete example with valid component test('getCompleteExample - valid component (button)', () => { const result = getCompleteExample(db, 'button'); assert(result.success, 'Should succeed'); assert(result.component === 'button', 'Should return correct component'); assert(result.complete_code, 'Should have complete_code'); assert(result.complete_code.html, 'Should have HTML snippet'); assert(result.complete_code.complete_html, 'Should have complete HTML page'); assert(result.complete_code.complete_html.includes('<!doctype html>'), 'Should have complete HTML structure'); assert(result.complete_code.html.includes('ecl-button'), 'Should contain ECL button class'); assert(result.dependencies, 'Should have dependencies'); assert(result.dependencies.stylesheets.length > 0, 'Should have stylesheet dependencies'); }); // Test 2: Get complete example with variant filter test('getCompleteExample - with variant filter', () => { const result = getCompleteExample(db, 'button', { variant: 'primary' }); assert(result.success, 'Should succeed'); assert(result.variant === 'primary' || result.complete_code.html.includes('primary'), 'Should filter by variant'); }); // Test 3: Get complete example with invalid component test('getCompleteExample - invalid component', () => { const result = getCompleteExample(db, 'nonexistent-component-xyz'); assert(!result.success, 'Should fail'); assert(result.error, 'Should have error message'); }); // Test 4: Get complete example with example type filter test('getCompleteExample - with example_type filter', () => { const result = getCompleteExample(db, 'button', { exampleType: 'basic' }); assert(result.success || (result.error && result.error.includes('No examples found')), 'Should succeed or gracefully fail'); // This is a soft check - example type filtering is best-effort if (result.success) { assert(result.example_title || result.variant, 'Should have example metadata'); } }); // Test 5: Generate component - basic (no customization) test('generateComponent - basic button', () => { const result = generateComponent(db, 'button'); assert(result.success, 'Should succeed'); assert(result.component === 'button', 'Should return correct component'); assert(result.generated_code, 'Should have generated_code'); assert(result.generated_code.html, 'Should have HTML code'); assert(result.generated_code.html.includes('ecl-button'), 'Should contain ECL button class'); assert(result.usage_instructions, 'Should have usage instructions'); }); // Test 6: Generate component - with variant customization test('generateComponent - with variant', () => { const result = generateComponent(db, 'button', { customization: { variant: 'secondary' } }); assert(result.success, 'Should succeed'); assert( result.generated_code.html.includes('ecl-button--secondary') || result.customization_applied?.variant === 'secondary', 'Should apply variant customization' ); }); // Test 7: Generate component - with content customization test('generateComponent - with content', () => { const result = generateComponent(db, 'button', { customization: { content: 'Custom Button Text' } }); assert(result.success, 'Should succeed'); assert( result.generated_code.html.includes('Custom Button Text'), 'Should apply content customization' ); }); // Test 8: Generate component - with size customization test('generateComponent - with size', () => { const result = generateComponent(db, 'button', { customization: { size: 'small' } }); assert(result.success, 'Should succeed'); // Size might be applied as class or data attribute const html = result.generated_code.html; assert( html.includes('small') || html.includes('sm') || result.customization_applied?.size, 'Should apply size customization' ); }); // Test 9: Generate component - invalid component test('generateComponent - invalid component', () => { const result = generateComponent(db, 'nonexistent-component-xyz'); assert(!result.success, 'Should fail'); assert(result.error, 'Should have error message'); }); // Test 10: Create playground - single component test('createPlayground - single component', () => { const result = createPlayground(db, ['button']); assert(result.success, 'Should succeed'); assert(result.html_file, 'Should have HTML file content'); assert(result.html_file.includes('<!doctype html>') || result.html_file.includes('<!DOCTYPE html>'), 'Should have complete HTML structure'); assert(result.html_file.includes('ecl-button'), 'Should contain button component'); assert(result.components_included, 'Should list components included'); assert(result.components_included.includes('button'), 'Should include button in list'); assert(result.file_size, 'Should report file size'); assert(result.instructions, 'Should have instructions'); }); // Test 11: Create playground - multiple components test('createPlayground - multiple components', () => { const result = createPlayground(db, ['button', 'link']); assert(result.success, 'Should succeed'); assert(result.html_file.includes('ecl-button'), 'Should contain button component'); // Link component might be in HTML or as a tag/class - check loosely assert(result.html_file.includes('link') || result.components_included.includes('link'), 'Should include link component'); assert(result.components_included.length >= 1, 'Should include at least 1 component'); }); // Test 12: Create playground - with custom code test('createPlayground - with custom code', () => { const customCode = '<p>Custom test code</p>'; const result = createPlayground(db, ['button'], { customCode }); assert(result.success, 'Should succeed'); assert(result.html_file.includes(customCode), 'Should include custom code'); }); // Test 13: Create playground - invalid component test('createPlayground - with invalid component', () => { const result = createPlayground(db, ['nonexistent-component-xyz']); assert(!result.success, 'Should fail'); assert(result.error, 'Should have error message'); }); // Test 14: Create playground - empty components array test('createPlayground - empty components array', () => { const result = createPlayground(db, []); assert(!result.success, 'Should fail'); assert(result.error, 'Should have error message'); }); // Test 15: Generate component - with comments test('generateComponent - with comments enabled', () => { const result = generateComponent(db, 'button', { includeComments: true }); assert(result.success, 'Should succeed'); // Comments might be added to HTML or usage instructions always provided assert( result.generated_code.html.includes('<!--') || result.usage_instructions, 'Should include comments or usage instructions' ); }); // Test 16: Get complete example - check customization points test('getCompleteExample - has customization points', () => { const result = getCompleteExample(db, 'button'); assert(result.success, 'Should succeed'); assert(result.customization_points, 'Should have customization_points'); assert(Array.isArray(result.customization_points), 'customization_points should be array'); }); // Test 17: Generate component - multiple customizations test('generateComponent - multiple customizations', () => { const result = generateComponent(db, 'button', { customization: { variant: 'primary', content: 'Submit Form', size: 'large' } }); assert(result.success, 'Should succeed'); const html = result.generated_code.html; assert( html.includes('primary') || html.includes('ecl-button--primary'), 'Should apply variant' ); assert(html.includes('Submit Form'), 'Should apply content'); }); // Test 18: Create playground - check navigation test('createPlayground - has navigation', () => { const result = createPlayground(db, ['button', 'link']); assert(result.success, 'Should succeed'); assert(result.html_file.includes('<nav'), 'Should have navigation element'); assert(result.html_file.includes('button'), 'Navigation should link to button section'); assert(result.html_file.includes('link'), 'Navigation should link to link section'); }); // Close database connection db.close(); // Print summary console.log('\n' + '='.repeat(50)); console.log(`Tests passed: ${testsPassed}`); console.log(`Tests failed: ${testsFailed}`); console.log(`Total tests: ${testsPassed + testsFailed}`); console.log('='.repeat(50) + '\n'); process.exit(testsFailed > 0 ? 1 : 0);

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/brownrl/eco_mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server