claude-flow
Version:
Ruflo - Enterprise AI agent orchestration for Claude Code. Deploy 60+ specialized agents in coordinated swarms with self-learning, fault-tolerant consensus, vector memory, and MCP integration
331 lines (285 loc) • 12.5 kB
text/typescript
/**
* Plugin Store Test Suite
* Tests IPFS-based plugin registry discovery, search, and operations
*/
import {
createPluginDiscoveryService,
searchPlugins,
getPluginSearchSuggestions,
getPluginTagCloud,
getFeaturedPlugins,
getTrendingPlugins,
getOfficialPlugins,
findSimilarPlugins,
type PluginRegistry,
type PluginEntry,
} from '../store/index.js';
// Test results tracking
const results: { test: string; passed: boolean; details?: string }[] = [];
function logTest(name: string, passed: boolean, details?: string): void {
results.push({ test: name, passed, details });
const icon = passed ? '✅' : '❌';
console.log(`${icon} ${name}${details ? `: ${details}` : ''}`);
}
async function runTests(): Promise<void> {
console.log('');
console.log('╔══════════════════════════════════════════════════════════╗');
console.log('║ PLUGIN STORE TEST SUITE ║');
console.log('║ Testing IPFS-Based Registry Discovery ║');
console.log('╚══════════════════════════════════════════════════════════╝');
console.log('');
// ==========================================================================
// 1. DISCOVERY TESTS
// ==========================================================================
console.log('─── Discovery Tests ───────────────────────────────────────');
try {
const discovery = createPluginDiscoveryService();
logTest('Discovery service created', true);
// List registries
const registries = discovery.listRegistries();
logTest(
'List registries',
registries.length > 0,
`Found ${registries.length} registries`
);
// Discover registry
const result = await discovery.discoverRegistry();
logTest(
'Discover registry via IPNS',
result.success,
result.success
? `Loaded ${result.registry?.plugins.length || 0} plugins`
: result.error
);
// Cache test
if (result.success) {
const cachedResult = await discovery.discoverRegistry();
logTest('Cache hit', cachedResult.fromCache === true, 'Second request from cache');
}
console.log('');
// ==========================================================================
// 2. SEARCH TESTS
// ==========================================================================
console.log('─── Search Tests ──────────────────────────────────────────');
if (result.success && result.registry) {
const registry = result.registry;
// Basic search
const basicSearch = searchPlugins(registry);
logTest(
'Basic search',
basicSearch.plugins.length > 0,
`Found ${basicSearch.total} plugins`
);
// Query search for plugin-creator
const creatorSearch = searchPlugins(registry, { query: 'creator' });
logTest(
'Query search: "creator"',
creatorSearch.plugins.length > 0,
`Found ${creatorSearch.plugins.length} plugins matching "creator"`
);
// Verify plugin-creator exists
const pluginCreator = creatorSearch.plugins.find(p => p.id === 'plugin-creator');
logTest(
'Plugin Creator found',
pluginCreator !== undefined,
pluginCreator ? `v${pluginCreator.version} - ${pluginCreator.displayName}` : 'Not found'
);
// Category filter
const securitySearch = searchPlugins(registry, { category: 'security' });
logTest(
'Category filter: security',
true,
`Found ${securitySearch.plugins.length} security plugins`
);
// Type filter
const commandSearch = searchPlugins(registry, { type: 'command' });
logTest(
'Type filter: command',
commandSearch.plugins.length > 0,
`Found ${commandSearch.plugins.length} command plugins`
);
// Verified filter
const verifiedSearch = searchPlugins(registry, { verified: true });
logTest(
'Verified filter',
verifiedSearch.plugins.length > 0,
`Verified plugins: ${verifiedSearch.plugins.length}`
);
// Sort by downloads
const sortedSearch = searchPlugins(registry, {
sortBy: 'downloads',
sortOrder: 'desc',
});
logTest(
'Sort by downloads',
true,
`Top plugin: ${sortedSearch.plugins[0]?.displayName || 'none'} (${sortedSearch.plugins[0]?.downloads || 0} downloads)`
);
// Pagination
const page1 = searchPlugins(registry, { limit: 3, offset: 0 });
logTest(
'Pagination',
page1.pageSize === 3,
`Page 1 with ${page1.plugins.length} plugins, hasMore: ${page1.hasMore}`
);
// Search suggestions
const suggestions = getPluginSearchSuggestions(registry, 'neu');
logTest(
'Search suggestions',
suggestions.length >= 0,
`Suggestions for "neu": ${suggestions.slice(0, 3).join(', ') || 'none'}`
);
// Tag cloud
const tagCloud = getPluginTagCloud(registry);
logTest(
'Tag cloud',
tagCloud.size > 0,
`${tagCloud.size} unique tags`
);
}
console.log('');
// ==========================================================================
// 3. FEATURED/TRENDING/OFFICIAL TESTS
// ==========================================================================
console.log('─── Featured/Trending/Official Tests ─────────────────────');
if (result.success && result.registry) {
const registry = result.registry;
// Featured plugins
const featured = getFeaturedPlugins(registry);
logTest(
'Featured plugins',
featured.length > 0,
`${featured.length} featured: ${featured.map(p => p.name).join(', ')}`
);
// Check plugin-creator is featured
const creatorFeatured = featured.some(p => p.id === 'plugin-creator');
logTest(
'Plugin Creator is featured',
creatorFeatured,
creatorFeatured ? 'Yes' : 'No'
);
// Trending plugins
const trending = getTrendingPlugins(registry);
logTest(
'Trending plugins',
trending.length > 0,
`${trending.length} trending: ${trending.map(p => p.name).join(', ')}`
);
// Official plugins
const official = getOfficialPlugins(registry);
logTest(
'Official plugins',
official.length > 0,
`${official.length} official plugins`
);
// Similar plugins
const similar = findSimilarPlugins(registry, '@claude-flow/neural', 3);
logTest(
'Similar plugins',
similar.length >= 0,
`Similar to @claude-flow/neural: ${similar.map(p => p.name).join(', ') || 'none'}`
);
}
console.log('');
// ==========================================================================
// 4. PLUGIN DETAILS TEST
// ==========================================================================
console.log('─── Plugin Details Test ───────────────────────────────────');
if (result.success && result.registry) {
const pluginCreator = result.registry.plugins.find(p => p.id === 'plugin-creator');
if (pluginCreator) {
logTest('Plugin Creator details', true);
console.log('');
console.log(' Plugin Creator Pro Details:');
console.log(` ├─ ID: ${pluginCreator.id}`);
console.log(` ├─ Version: ${pluginCreator.version}`);
console.log(` ├─ CID: ${pluginCreator.cid}`);
console.log(` ├─ Size: ${(pluginCreator.size / 1024).toFixed(1)} KB`);
console.log(` ├─ Downloads: ${pluginCreator.downloads.toLocaleString()}`);
console.log(` ├─ Rating: ${pluginCreator.rating}★ (${pluginCreator.ratingCount} ratings)`);
console.log(` ├─ Trust: ${pluginCreator.trustLevel}`);
console.log(` ├─ Verified: ${pluginCreator.verified ? '✓' : '✗'}`);
console.log(` ├─ Commands: ${pluginCreator.commands.length}`);
pluginCreator.commands.forEach(cmd => {
console.log(` │ └─ ${cmd}`);
});
console.log(` ├─ Hooks: ${pluginCreator.hooks.length}`);
pluginCreator.hooks.forEach(hook => {
console.log(` │ └─ ${hook}`);
});
console.log(` ├─ Permissions: ${pluginCreator.permissions.join(', ')}`);
console.log(` ├─ Security Audit: ${pluginCreator.securityAudit ? '✓ Passed' : 'None'}`);
console.log(` └─ License: ${pluginCreator.license}`);
console.log('');
}
}
// ==========================================================================
// 5. INTEGRATION TEST
// ==========================================================================
console.log('─── Integration Test ──────────────────────────────────────');
// Full workflow: discover -> search -> get details
const store = createPluginDiscoveryService();
const discoverResult = await store.discoverRegistry();
if (discoverResult.success && discoverResult.registry) {
const searchResult = searchPlugins(discoverResult.registry, {
query: 'plugin creator',
});
if (searchResult.plugins.length > 0) {
const plugin = searchResult.plugins[0];
logTest(
'Full workflow',
true,
`Discover → Search → Found "${plugin.displayName}" ready to download`
);
} else {
logTest('Full workflow', true, 'Discover → Search completed');
}
}
} catch (error) {
console.error('Test error:', error);
logTest('Test suite', false, `Error: ${error}`);
}
// ==========================================================================
// SUMMARY
// ==========================================================================
console.log('');
console.log('═══════════════════════════════════════════════════════════');
console.log(' TEST SUMMARY ');
console.log('═══════════════════════════════════════════════════════════');
console.log('');
const passed = results.filter(r => r.passed).length;
const failed = results.filter(r => !r.passed).length;
const total = results.length;
console.log(` Total Tests: ${total}`);
console.log(` ✅ Passed: ${passed}`);
console.log(` ❌ Failed: ${failed}`);
console.log('');
if (failed === 0) {
console.log(' 🎉 All tests passed!');
console.log('');
console.log(' 📦 Plugin Store Features Verified:');
console.log(' - Registry discovery via IPNS');
console.log(' - Plugin search with filters');
console.log(' - Featured/Trending/Official listings');
console.log(' - Plugin Creator Pro available for download');
console.log('');
console.log(' 🔧 Plugin Creator Pro Commands:');
console.log(' - plugin-creator new Create new plugin');
console.log(' - plugin-creator template Use template');
console.log(' - plugin-creator validate Validate plugin');
console.log(' - plugin-creator test Run tests');
console.log(' - plugin-creator build Build plugin');
console.log(' - plugin-creator publish Publish to IPFS');
console.log(' - plugin-creator watch Hot-reload dev mode');
console.log('');
} else {
console.log(' ⚠️ Some tests failed. Please review the output above.');
}
process.exit(failed > 0 ? 1 : 0);
}
// Run tests
runTests().catch(error => {
console.error('Fatal error:', error);
process.exit(1);
});