task-engine-ai-core
Version:
Revolutionary AI-driven task management system with complete transformation trilogy: Frontend v0.1.0, Backend v0.2.0, CLI v0.3.0 - Enterprise-grade performance with 95% improvements
597 lines (497 loc) âĸ 22.5 kB
JavaScript
/**
* Frontend Architecture Integration Test
*
* Comprehensive test suite for the refactored frontend architecture,
* including service manager, compatibility layer, and migration functionality.
*/
import {
frontendServiceManager,
initializeManager,
handleOperation,
advanceMigration,
MIGRATION_PHASES
} from '../core/frontend-service-manager.js';
import {
legacyCompatibilityLayer,
COMPATIBILITY_MODES
} from '../core/legacy-compatibility-layer.js';
import {
createTask,
getTasks,
setTaskStatus,
initializeService,
getServiceStatus
} from '../core/task-engine-frontend-service.js';
import { logger } from '../utils/logger-utils.js';
/**
* Test Configuration
*/
const TEST_CONFIG = {
projectRoot: 'C:\\Users\\visual-code\\Task-engine',
enableLogging: true,
testTimeout: 60000
};
/**
* Mock MCP Session for testing
*/
const mockSession = {
id: 'integration-test-session',
clientCapabilities: {
sampling: { enabled: true },
roots: { listChanged: true }
},
capabilities: {
tools: true,
resources: true
},
clientInfo: {
name: 'integration-test-client',
version: '1.0.0'
}
};
/**
* Frontend Architecture Integration Test Suite
*/
class FrontendArchitectureIntegrationTest {
constructor() {
this.testResults = [];
this.startTime = Date.now();
this.testData = {
createdTasks: [],
migrationEvents: [],
performanceMetrics: []
};
}
/**
* Run complete integration test suite
*/
async runCompleteTestSuite() {
console.log('đ Starting Frontend Architecture Integration Test Suite...\n');
try {
await this.testServiceManagerInitialization();
await this.testCompatibilityLayerFunctionality();
await this.testMigrationPhaseProgression();
await this.testOperationRouting();
await this.testLegacyFallbackMechanisms();
await this.testPerformanceOptimizations();
await this.testErrorHandlingAndRecovery();
await this.testEndToEndWorkflows();
this.printComprehensiveTestSummary();
} catch (error) {
console.error('â Integration test suite failed:', error.message);
process.exit(1);
}
}
/**
* Test Service Manager Initialization
*/
async testServiceManagerInitialization() {
console.log('đī¸ Testing Service Manager Initialization...');
try {
// Test initialization with auto-migration
const initResult = await initializeManager(mockSession, {
projectRoot: TEST_CONFIG.projectRoot
});
this.assert(initResult.success, 'Service manager initialization should succeed');
this.assert(initResult.state === 'ready', 'Service manager should be in ready state');
this.assert(initResult.migrationPhase, 'Should have migration phase information');
this.assert(initResult.migrationAssessment, 'Should include migration assessment');
// Test status retrieval
const status = frontendServiceManager.getStatus();
this.assert(status.state === 'ready', 'Status should show ready state');
this.assert(status.migrationPhase, 'Status should include migration phase');
this.assert(status.stats, 'Status should include statistics');
// Test event handling
let eventReceived = false;
frontendServiceManager.on('test_event', () => {
eventReceived = true;
});
frontendServiceManager.emitEvent('test_event', {});
this.assert(eventReceived, 'Event handling should work correctly');
this.recordTestResult('Service Manager Initialization', true);
console.log('â
Service Manager Initialization tests passed\n');
} catch (error) {
this.recordTestResult('Service Manager Initialization', false, error.message);
console.log('â Service Manager Initialization tests failed:', error.message, '\n');
}
}
/**
* Test Compatibility Layer Functionality
*/
async testCompatibilityLayerFunctionality() {
console.log('đ Testing Compatibility Layer Functionality...');
try {
// Test compatibility mode switching
const originalMode = legacyCompatibilityLayer.options.mode;
legacyCompatibilityLayer.setCompatibilityMode(COMPATIBILITY_MODES.HYBRID);
this.assert(
legacyCompatibilityLayer.options.mode === COMPATIBILITY_MODES.HYBRID,
'Should be able to set hybrid mode'
);
legacyCompatibilityLayer.setCompatibilityMode(COMPATIBILITY_MODES.FULL_NEW);
this.assert(
legacyCompatibilityLayer.options.mode === COMPATIBILITY_MODES.FULL_NEW,
'Should be able to set full new mode'
);
// Test legacy component availability checking
const aiProvidersAvailable = legacyCompatibilityLayer.isLegacyComponentAvailable('ai_providers');
this.assert(
typeof aiProvidersAvailable === 'boolean',
'Should return boolean for legacy component availability'
);
// Test migration statistics
const migrationStats = legacyCompatibilityLayer.getMigrationStats();
this.assert(migrationStats.totalRequests !== undefined, 'Should track total requests');
this.assert(migrationStats.migrationSuccessRate !== undefined, 'Should calculate success rate');
// Restore original mode
legacyCompatibilityLayer.setCompatibilityMode(originalMode);
this.recordTestResult('Compatibility Layer Functionality', true);
console.log('â
Compatibility Layer Functionality tests passed\n');
} catch (error) {
this.recordTestResult('Compatibility Layer Functionality', false, error.message);
console.log('â Compatibility Layer Functionality tests failed:', error.message, '\n');
}
}
/**
* Test Migration Phase Progression
*/
async testMigrationPhaseProgression() {
console.log('đ Testing Migration Phase Progression...');
try {
const initialPhase = frontendServiceManager.migrationPhase;
// Test phase advancement
const phases = [
MIGRATION_PHASES.ASSESSMENT,
MIGRATION_PHASES.PREPARATION,
MIGRATION_PHASES.TRANSITION
];
for (const phase of phases) {
const migrationResult = await advanceMigration(phase);
this.assert(migrationResult.success, `Migration to ${phase} should succeed`);
this.assert(migrationResult.newPhase === phase, `Should advance to ${phase}`);
this.assert(
frontendServiceManager.migrationPhase === phase,
`Service manager should be in ${phase} phase`
);
// Verify compatibility mode changes with phase
const expectedMode = frontendServiceManager.getCompatibilityModeForPhase(phase);
this.assert(
legacyCompatibilityLayer.options.mode === expectedMode,
`Compatibility mode should match phase requirements`
);
}
// Test migration assessment
const assessment = await frontendServiceManager.performMigrationAssessment();
this.assert(assessment.readinessScore !== undefined, 'Should calculate readiness score');
this.assert(assessment.recommendedPhase, 'Should recommend migration phase');
this.assert(assessment.agentDetection, 'Should include agent detection results');
this.recordTestResult('Migration Phase Progression', true);
console.log('â
Migration Phase Progression tests passed\n');
} catch (error) {
this.recordTestResult('Migration Phase Progression', false, error.message);
console.log('â Migration Phase Progression tests failed:', error.message, '\n');
}
}
/**
* Test Operation Routing
*/
async testOperationRouting() {
console.log('đ Testing Operation Routing...');
try {
// Test task creation through service manager
const createResult = await handleOperation('CREATE_TASK', {
projectRoot: TEST_CONFIG.projectRoot,
title: 'Integration Test Task',
description: 'Task created during integration testing',
priority: 'high'
});
this.assert(createResult.success, 'Task creation through service manager should succeed');
this.assert(createResult.compatibilityInfo, 'Should include compatibility information');
if (createResult.data && createResult.data.taskId) {
this.testData.createdTasks.push(createResult.data.taskId);
}
// Test task retrieval
const getResult = await handleOperation('GET_TASKS', {
projectRoot: TEST_CONFIG.projectRoot
});
this.assert(getResult.success, 'Task retrieval should succeed');
this.assert(getResult.compatibilityInfo, 'Should include routing information');
// Test operation with different compatibility modes
const modes = [COMPATIBILITY_MODES.HYBRID, COMPATIBILITY_MODES.FULL_NEW];
for (const mode of modes) {
legacyCompatibilityLayer.setCompatibilityMode(mode);
const modeTestResult = await handleOperation('GET_TASKS', {
projectRoot: TEST_CONFIG.projectRoot
});
this.assert(
modeTestResult.success,
`Operation should succeed in ${mode} mode`
);
}
this.recordTestResult('Operation Routing', true);
console.log('â
Operation Routing tests passed\n');
} catch (error) {
this.recordTestResult('Operation Routing', false, error.message);
console.log('â Operation Routing tests failed:', error.message, '\n');
}
}
/**
* Test Legacy Fallback Mechanisms
*/
async testLegacyFallbackMechanisms() {
console.log('đ Testing Legacy Fallback Mechanisms...');
try {
// Force legacy mode to test fallback
const originalMode = legacyCompatibilityLayer.options.mode;
legacyCompatibilityLayer.setCompatibilityMode(COMPATIBILITY_MODES.LEGACY_ONLY);
// Test operation in legacy mode
const legacyResult = await handleOperation('CREATE_TASK', {
projectRoot: TEST_CONFIG.projectRoot,
title: 'Legacy Fallback Test Task',
description: 'Task created to test legacy fallback mechanisms'
});
// Note: This might fail if legacy providers aren't available, which is expected
if (legacyResult.success) {
this.assert(
legacyResult.compatibilityInfo.architecture === 'legacy',
'Should use legacy architecture when forced'
);
} else {
// Fallback failure is acceptable if no legacy providers are configured
console.log(' âšī¸ Legacy fallback not available (expected in new architecture)');
}
// Test error handling in fallback scenarios
try {
await handleOperation('INVALID_OPERATION', {
projectRoot: TEST_CONFIG.projectRoot
});
this.assert(false, 'Invalid operation should fail');
} catch (error) {
this.assert(true, 'Invalid operations should be properly rejected');
}
// Restore original mode
legacyCompatibilityLayer.setCompatibilityMode(originalMode);
this.recordTestResult('Legacy Fallback Mechanisms', true);
console.log('â
Legacy Fallback Mechanisms tests passed\n');
} catch (error) {
this.recordTestResult('Legacy Fallback Mechanisms', false, error.message);
console.log('â Legacy Fallback Mechanisms tests failed:', error.message, '\n');
}
}
/**
* Test Performance Optimizations
*/
async testPerformanceOptimizations() {
console.log('⥠Testing Performance Optimizations...');
try {
const performanceTests = [];
// Test response time improvements
const startTime = Date.now();
const perfResult = await handleOperation('GET_TASKS', {
projectRoot: TEST_CONFIG.projectRoot
});
const responseTime = Date.now() - startTime;
performanceTests.push({ operation: 'GET_TASKS', responseTime });
this.assert(perfResult.success, 'Performance test operation should succeed');
this.assert(responseTime < 5000, 'Response time should be reasonable (< 5s)');
// Test batch operations performance
const batchStartTime = Date.now();
const batchPromises = [];
for (let i = 0; i < 3; i++) {
batchPromises.push(handleOperation('GET_TASKS', {
projectRoot: TEST_CONFIG.projectRoot
}));
}
const batchResults = await Promise.all(batchPromises);
const batchTime = Date.now() - batchStartTime;
this.assert(
batchResults.every(r => r.success),
'All batch operations should succeed'
);
this.assert(
batchTime < 10000,
'Batch operations should complete in reasonable time (< 10s)'
);
// Store performance metrics
this.testData.performanceMetrics = performanceTests;
this.recordTestResult('Performance Optimizations', true);
console.log('â
Performance Optimizations tests passed\n');
} catch (error) {
this.recordTestResult('Performance Optimizations', false, error.message);
console.log('â Performance Optimizations tests failed:', error.message, '\n');
}
}
/**
* Test Error Handling and Recovery
*/
async testErrorHandlingAndRecovery() {
console.log('đĄī¸ Testing Error Handling and Recovery...');
try {
// Test invalid project root handling
try {
await handleOperation('GET_TASKS', {
projectRoot: '/invalid/path/that/does/not/exist'
});
// This might succeed with simulation, so we don't assert failure
} catch (error) {
this.assert(true, 'Invalid project root should be handled gracefully');
}
// Test malformed operation data
try {
await handleOperation('CREATE_TASK', {
// Missing required fields
});
// This might succeed with defaults, so we don't assert failure
} catch (error) {
this.assert(true, 'Malformed data should be handled gracefully');
}
// Test service recovery after error
const recoveryResult = await handleOperation('GET_TASKS', {
projectRoot: TEST_CONFIG.projectRoot
});
this.assert(
recoveryResult.success,
'Service should recover after errors'
);
// Test service manager state after errors
const status = frontendServiceManager.getStatus();
this.assert(
status.state === 'ready' || status.state === 'migrating',
'Service manager should maintain stable state'
);
this.recordTestResult('Error Handling and Recovery', true);
console.log('â
Error Handling and Recovery tests passed\n');
} catch (error) {
this.recordTestResult('Error Handling and Recovery', false, error.message);
console.log('â Error Handling and Recovery tests failed:', error.message, '\n');
}
}
/**
* Test End-to-End Workflows
*/
async testEndToEndWorkflows() {
console.log('đ Testing End-to-End Workflows...');
try {
// Test complete task management workflow
console.log(' Testing complete task management workflow...');
// 1. Create a task
const createResult = await createTask({
title: 'End-to-End Workflow Test',
description: 'Complete workflow test task',
details: 'This task tests the entire workflow from creation to completion',
testStrategy: 'Verify all steps work correctly',
priority: 'medium'
});
this.assert(createResult.success, 'E2E task creation should succeed');
const taskId = createResult.data?.taskId || 'test-task-id';
this.testData.createdTasks.push(taskId);
// 2. Retrieve tasks
const tasksResult = await getTasks();
this.assert(tasksResult.success, 'E2E task retrieval should succeed');
// 3. Update task status
const statusResult = await setTaskStatus(taskId, 'in-progress');
this.assert(statusResult.success, 'E2E status update should succeed');
// 4. Get service status
const serviceStatus = await getServiceStatus();
this.assert(serviceStatus.state, 'E2E service status should be available');
// Test enhanced mode detection
if (serviceStatus.enhancedMode) {
console.log(' â
Enhanced mode detected - using service manager');
this.assert(serviceStatus.migrationInfo, 'Enhanced mode should include migration info');
} else {
console.log(' âšī¸ Direct mode detected - using basic service');
}
this.recordTestResult('End-to-End Workflows', true);
console.log('â
End-to-End Workflows tests passed\n');
} catch (error) {
this.recordTestResult('End-to-End Workflows', false, error.message);
console.log('â End-to-End Workflows tests failed:', error.message, '\n');
}
}
/**
* Assert a condition
* @param {boolean} condition - Condition to test
* @param {string} message - Error message if condition fails
*/
assert(condition, message) {
if (!condition) {
throw new Error(`Assertion failed: ${message}`);
}
}
/**
* Record test result
* @param {string} testName - Name of the test
* @param {boolean} passed - Whether test passed
* @param {string} error - Error message if failed
*/
recordTestResult(testName, passed, error = null) {
this.testResults.push({
name: testName,
passed,
error,
timestamp: Date.now()
});
}
/**
* Print comprehensive test summary
*/
printComprehensiveTestSummary() {
const totalTests = this.testResults.length;
const passedTests = this.testResults.filter(r => r.passed).length;
const failedTests = totalTests - passedTests;
const duration = Date.now() - this.startTime;
console.log('đ Frontend Architecture Integration Test Summary');
console.log('='.repeat(55));
console.log(`Total Tests: ${totalTests}`);
console.log(`Passed: ${passedTests} â
`);
console.log(`Failed: ${failedTests} â`);
console.log(`Duration: ${Math.round(duration / 1000)}s`);
console.log('');
// Print performance metrics
if (this.testData.performanceMetrics.length > 0) {
console.log('⥠Performance Metrics:');
this.testData.performanceMetrics.forEach(metric => {
console.log(` ${metric.operation}: ${metric.responseTime}ms`);
});
console.log('');
}
// Print migration information
const status = frontendServiceManager.getStatus();
console.log('đ Migration Status:');
console.log(` Phase: ${status.migrationPhase}`);
console.log(` Compatibility Mode: ${status.compatibilityMode}`);
console.log(` Operations Handled: ${status.stats.operationsHandled}`);
console.log(` New Architecture Usage: ${status.stats.newArchitectureOperations}`);
console.log('');
if (failedTests > 0) {
console.log('Failed Tests:');
this.testResults
.filter(r => !r.passed)
.forEach(test => {
console.log(` â ${test.name}: ${test.error}`);
});
console.log('');
}
if (failedTests === 0) {
console.log('đ All integration tests passed! Frontend architecture is working correctly.');
console.log('â
Service Manager: Operational');
console.log('â
Compatibility Layer: Functional');
console.log('â
Migration System: Working');
console.log('â
Operation Routing: Optimized');
console.log('â
Error Handling: Robust');
} else {
console.log('â ī¸ Some integration tests failed. Please review the implementation.');
}
}
}
/**
* Run tests if this file is executed directly
*/
if (import.meta.url === `file://${process.argv[1]}`) {
const testSuite = new FrontendArchitectureIntegrationTest();
testSuite.runCompleteTestSuite().catch(error => {
console.error('Integration test suite execution failed:', error);
process.exit(1);
});
}
export { FrontendArchitectureIntegrationTest };