Skip to main content
Glama
comprehensive-unit.test.ts12.1 kB
/** * Comprehensive Unit Tests for Ultimate Elementor MCP * Simplified tests that work with actual implementation */ import { getServerConfig, ServerConfig } from '../src/config/server-config.js'; import { getWordPressConfig, validateWordPressConfig } from '../src/config/wordpress-config.js'; import { logger, LogLevel } from '../src/utils/logger.js'; import { ErrorHandler, MCPError, ErrorCategory } from '../src/utils/error-handler.js'; describe('Ultimate Elementor MCP - Core Components', () => { describe('Server Configuration', () => { it('should create default configuration', () => { const config = getServerConfig(); expect(config).toBeDefined(); expect(['essential', 'standard', 'advanced', 'full']).toContain(config.mode); expect(typeof config.basicWordPressOperations).toBe('boolean'); expect(typeof config.basicElementorOperations).toBe('boolean'); }); it('should handle different configuration modes', () => { // Test essential mode process.env.ELEMENTOR_MCP_MODE = 'essential'; const essentialConfig = getServerConfig(); expect(essentialConfig.mode).toBe('essential'); // Test full mode process.env.ELEMENTOR_MCP_MODE = 'full'; const fullConfig = getServerConfig(); expect(fullConfig.mode).toBe('full'); }); it('should provide configuration methods', () => { const config = getServerConfig(); expect(typeof config.getEnabledFeatures).toBe('function'); expect(typeof config.getDisabledFeatures).toBe('function'); expect(typeof config.getTotalEnabledFeatures).toBe('function'); expect(typeof config.toJSON).toBe('function'); const features = config.getEnabledFeatures(); expect(Array.isArray(features)).toBe(true); const total = config.getTotalEnabledFeatures(); expect(typeof total).toBe('number'); expect(total).toBeGreaterThan(0); }); }); describe('WordPress Configuration', () => { it('should handle missing WordPress configuration', () => { delete process.env.WORDPRESS_BASE_URL; delete process.env.WORDPRESS_USERNAME; delete process.env.WORDPRESS_APPLICATION_PASSWORD; const config = getWordPressConfig(); expect(config).toBeNull(); }); it('should create WordPress configuration when environment variables are present', () => { process.env.WORDPRESS_BASE_URL = 'https://test-site.com'; process.env.WORDPRESS_USERNAME = 'testuser'; process.env.WORDPRESS_APPLICATION_PASSWORD = 'testpass'; const config = getWordPressConfig(); expect(config).toBeDefined(); expect(config?.baseUrl).toBe('https://test-site.com'); expect(config?.username).toBe('testuser'); expect(config?.applicationPassword).toBe('testpass'); }); it('should validate WordPress configuration', () => { const validConfig = { baseUrl: 'https://test-site.com', username: 'testuser', applicationPassword: 'testpass' }; expect(() => validateWordPressConfig(validConfig)).not.toThrow(); const invalidConfig = { baseUrl: '', username: '', applicationPassword: '' }; expect(() => validateWordPressConfig(invalidConfig)).toThrow(); }); }); describe('Logger', () => { it('should have correct log levels', () => { expect(LogLevel.DEBUG).toBe(0); expect(LogLevel.INFO).toBe(1); expect(LogLevel.WARN).toBe(2); expect(LogLevel.ERROR).toBe(3); }); it('should set log level correctly', () => { logger.setLevel(LogLevel.DEBUG); // Note: getLevel method may not be exposed, so we test that setLevel doesn't throw expect(() => logger.setLevel(LogLevel.DEBUG)).not.toThrow(); logger.setLevel(LogLevel.ERROR); expect(() => logger.setLevel(LogLevel.ERROR)).not.toThrow(); }); it('should set debug mode correctly', () => { logger.setDebugMode(true); // Note: isDebugMode method may not be exposed, so we test that setDebugMode doesn't throw expect(() => logger.setDebugMode(true)).not.toThrow(); logger.setDebugMode(false); expect(() => logger.setDebugMode(false)).not.toThrow(); }); it('should log messages without throwing errors', () => { expect(() => { logger.debug('Debug message'); logger.info('Info message'); logger.warn('Warning message'); logger.error('Error message'); }).not.toThrow(); }); it('should log performance messages', () => { expect(() => { logger.performance('Test operation', 150); }).not.toThrow(); }); it('should log requests', () => { expect(() => { logger.request('GET', '/wp-json/wp/v2/posts'); }).not.toThrow(); }); }); describe('Error Handler', () => { it('should create MCPError correctly', () => { const error = new MCPError( 'Test error', ErrorCategory.NETWORK, 'TEST_ERROR', { details: 'test' }, 500 ); expect(error.message).toBe('Test error'); expect(error.category).toBe(ErrorCategory.NETWORK); expect(error.code).toBe('TEST_ERROR'); expect(error.details).toEqual({ details: 'test' }); expect(error.statusCode).toBe(500); expect(error.name).toBe('MCPError'); }); it('should serialize MCPError to JSON', () => { const error = new MCPError( 'Test error', ErrorCategory.NETWORK, 'TEST_ERROR', { details: 'test' }, 500 ); const json = error.toJSON(); expect(json.message).toBe('Test error'); expect(json.category).toBe(ErrorCategory.NETWORK); expect(json.code).toBe('TEST_ERROR'); expect(json.details).toEqual({ details: 'test' }); expect(json.statusCode).toBe(500); }); it('should handle different error types', () => { // Test MCPError handling const mcpError = new MCPError('MCP Error', ErrorCategory.NETWORK, 'MCP_ERROR'); const handledMCPError = ErrorHandler.handle(mcpError); expect(handledMCPError).toBe(mcpError); // Test generic Error handling const genericError = new Error('Generic error'); const handledGenericError = ErrorHandler.handle(genericError); expect(handledGenericError).toBeInstanceOf(MCPError); expect(handledGenericError.message).toBe('Generic error'); // Test string error handling const stringError = 'String error'; const handledStringError = ErrorHandler.handle(stringError); expect(handledStringError).toBeInstanceOf(MCPError); expect(typeof handledStringError.message).toBe('string'); }); it('should identify recoverable errors', () => { const networkError = new MCPError('Network error', ErrorCategory.NETWORK, 'NET_ERROR'); const authError = new MCPError('Auth error', ErrorCategory.AUTHENTICATION, 'AUTH_ERROR'); const validationError = new MCPError('Validation error', ErrorCategory.VALIDATION, 'VAL_ERROR'); expect(typeof ErrorHandler.isRecoverableError(networkError)).toBe('boolean'); expect(typeof ErrorHandler.isRecoverableError(authError)).toBe('boolean'); expect(typeof ErrorHandler.isRecoverableError(validationError)).toBe('boolean'); }); it('should provide error suggestions', () => { const networkError = new MCPError('Network error', ErrorCategory.NETWORK, 'NET_ERROR'); const authError = new MCPError('Auth error', ErrorCategory.AUTHENTICATION, 'AUTH_ERROR'); const validationError = new MCPError('Validation error', ErrorCategory.VALIDATION, 'VAL_ERROR'); const networkSuggestion = ErrorHandler.getSuggestion(networkError); const authSuggestion = ErrorHandler.getSuggestion(authError); const validationSuggestion = ErrorHandler.getSuggestion(validationError); expect(typeof networkSuggestion).toBe('string'); expect(typeof authSuggestion).toBe('string'); expect(typeof validationSuggestion).toBe('string'); expect(networkSuggestion.length).toBeGreaterThan(0); expect(authSuggestion.length).toBeGreaterThan(0); expect(validationSuggestion.length).toBeGreaterThan(0); }); }); describe('Error Statistics', () => { beforeEach(() => { // Clear error statistics before each test if (ErrorHandler.ErrorStatistics && typeof ErrorHandler.ErrorStatistics.clear === 'function') { ErrorHandler.ErrorStatistics.clear(); } }); it('should track errors if ErrorStatistics is available', () => { const error = new MCPError('Test error', ErrorCategory.NETWORK, 'TEST_ERROR'); // Only test if ErrorStatistics is available if (ErrorHandler.ErrorStatistics && typeof ErrorHandler.ErrorStatistics.recordError === 'function') { expect(() => { ErrorHandler.ErrorStatistics.recordError(error); }).not.toThrow(); const stats = ErrorHandler.ErrorStatistics.getStatistics(); expect(typeof stats.totalErrors).toBe('number'); expect(stats.totalErrors).toBeGreaterThanOrEqual(0); } }); }); describe('Type Safety', () => { it('should have correct TypeScript types', () => { const config: ServerConfig = getServerConfig(); // Test that all required properties exist and have correct types expect(typeof config.mode).toBe('string'); expect(typeof config.basicWordPressOperations).toBe('boolean'); expect(typeof config.basicElementorOperations).toBe('boolean'); expect(typeof config.sectionContainerCreation).toBe('boolean'); expect(typeof config.widgetAddition).toBe('boolean'); expect(typeof config.elementManagement).toBe('boolean'); expect(typeof config.pageStructure).toBe('boolean'); expect(typeof config.performanceOptimization).toBe('boolean'); expect(typeof config.advancedElementOperations).toBe('boolean'); expect(typeof config.templateManagement).toBe('boolean'); expect(typeof config.globalSettings).toBe('boolean'); }); it('should have correct error category enum values', () => { expect(ErrorCategory.AUTHENTICATION).toBe('AUTHENTICATION'); expect(ErrorCategory.VALIDATION).toBe('VALIDATION'); expect(ErrorCategory.NETWORK).toBe('NETWORK'); expect(ErrorCategory.WORDPRESS_API).toBe('WORDPRESS_API'); expect(ErrorCategory.ELEMENTOR_DATA).toBe('ELEMENTOR_DATA'); expect(ErrorCategory.FILE_OPERATION).toBe('FILE_OPERATION'); expect(ErrorCategory.CONFIGURATION).toBe('CONFIGURATION'); expect(ErrorCategory.INTERNAL).toBe('INTERNAL'); }); }); describe('Integration Points', () => { it('should handle environment variable changes', () => { const originalMode = process.env.ELEMENTOR_MCP_MODE; // Test mode change process.env.ELEMENTOR_MCP_MODE = 'full'; const fullConfig = getServerConfig(); expect(fullConfig.mode).toBe('full'); // Restore original mode if (originalMode) { process.env.ELEMENTOR_MCP_MODE = originalMode; } else { delete process.env.ELEMENTOR_MCP_MODE; } }); it('should handle missing environment variables gracefully', () => { const originalVars = { WORDPRESS_BASE_URL: process.env.WORDPRESS_BASE_URL, WORDPRESS_USERNAME: process.env.WORDPRESS_USERNAME, WORDPRESS_APPLICATION_PASSWORD: process.env.WORDPRESS_APPLICATION_PASSWORD }; // Clear environment variables delete process.env.WORDPRESS_BASE_URL; delete process.env.WORDPRESS_USERNAME; delete process.env.WORDPRESS_APPLICATION_PASSWORD; // Should not throw errors expect(() => { const config = getWordPressConfig(); expect(config).toBeNull(); }).not.toThrow(); // Restore original variables Object.assign(process.env, originalVars); }); }); });

Latest Blog Posts

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/mbrown1837/Ultimate-Elementor-MCP'

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