Skip to main content
Glama

mcp-adr-analysis-server

by tosin2013
smart-git-push-tool-v2.test.ts14.5 kB
import { jest } from '@jest/globals'; // Mock child_process to prevent actual git commands during tests const mockExecSync = jest.fn(); const mockExec = jest.fn(); jest.unstable_mockModule('child_process', () => ({ execSync: mockExecSync, exec: mockExec, })); // Mock fs functions to prevent actual file system operations const mockExistsSync = jest.fn(); const mockReadFileSync = jest.fn(); const mockStatSync = jest.fn(); const mockWriteFileSync = jest.fn(); const mockMkdirSync = jest.fn(); jest.unstable_mockModule('fs', () => ({ existsSync: mockExistsSync, readFileSync: mockReadFileSync, statSync: mockStatSync, writeFileSync: mockWriteFileSync, mkdirSync: mockMkdirSync, // Add promises export for code that uses: import { promises as fs } from 'fs' promises: { readFile: jest.fn().mockResolvedValue(''), writeFile: jest.fn().mockResolvedValue(undefined), mkdir: jest.fn().mockResolvedValue(undefined), access: jest.fn().mockResolvedValue(undefined), readdir: jest.fn().mockResolvedValue([]), stat: jest.fn().mockResolvedValue({ size: 1024, isDirectory: () => false, isFile: () => true }), }, })); // Mock fs/promises to prevent actual async file system operations // Required because deployment-readiness-tool and its dependencies use fs/promises const mockPromisesReadFile = jest.fn(); const mockPromisesWriteFile = jest.fn(); const mockPromisesMkdir = jest.fn(); const mockPromisesAccess = jest.fn(); const mockPromisesReaddir = jest.fn(); const mockPromisesStat = jest.fn(); jest.unstable_mockModule('fs/promises', () => ({ readFile: mockPromisesReadFile, writeFile: mockPromisesWriteFile, mkdir: mockPromisesMkdir, access: mockPromisesAccess, readdir: mockPromisesReaddir, stat: mockPromisesStat, default: { readFile: mockPromisesReadFile, writeFile: mockPromisesWriteFile, mkdir: mockPromisesMkdir, access: mockPromisesAccess, readdir: mockPromisesReaddir, stat: mockPromisesStat, }, })); describe('Smart Git Push Tool V2', () => { beforeEach(() => { jest.clearAllMocks(); // Mock execSync to return successful git command outputs mockExecSync.mockImplementation((command: string) => { if (command.includes('git diff --cached --name-status')) { // Return some staged files for testing return 'M\tsrc/tools/enhanced-adr.ts\nA\tdocs/adrs/adr-001.md\nM\tpackage.json'; } if (command.includes('git diff --cached')) { return 'diff --git a/src/tools/enhanced-adr.ts b/src/tools/enhanced-adr.ts\n+Added ADR validation'; } if (command.includes('git status')) { return 'On branch main\nChanges to be committed:\n modified: src/tools/enhanced-adr.ts'; } if (command.includes('git commit')) { return 'Commit successful'; } if (command.includes('git push')) { return 'Push successful'; } if (command.includes('git branch')) { return '* main'; } return ''; }); // Mock exec (callback-based) for EnvironmentCapabilityRegistry mockExec.mockImplementation((command: string, callback: any) => { // Simulate successful command execution setImmediate(() => { callback(null, '', ''); }); return {} as any; // Return a mock child process object }); // Mock file system operations mockExistsSync.mockImplementation((path: string) => { if (typeof path === 'string') { if (path.includes('.git')) return true; if (path.includes('package.json')) return true; if (path.includes('.mcp-adr-cache')) return true; } return false; }); mockReadFileSync.mockImplementation((path: string) => { if (typeof path === 'string') { if (path.includes('package.json')) { return JSON.stringify({ name: 'test-project', version: '1.0.0' }); } if (path.includes('.mcp-adr-cache')) { return JSON.stringify({}); } } return ''; }); mockStatSync.mockReturnValue({ size: 1024 } as any); // Mock fs/promises async operations mockPromisesReadFile.mockResolvedValue(''); mockPromisesWriteFile.mockResolvedValue(undefined); mockPromisesMkdir.mockResolvedValue(undefined); mockPromisesAccess.mockResolvedValue(undefined); mockPromisesReaddir.mockResolvedValue([]); mockPromisesStat.mockResolvedValue({ size: 1024, isDirectory: () => false, isFile: () => true, } as any); }); describe('Module Loading', () => { it('should import smart git push tool v2 successfully', async () => { const module = await import('../../src/tools/smart-git-push-tool-v2.js'); expect(module).toBeDefined(); }); it('should export enhanced functions', async () => { const module = await import('../../src/tools/smart-git-push-tool-v2.js'); expect(module.smartGitPushV2).toBeDefined(); }); }); describe('Enhanced Git Push Functionality', () => { it('should handle advanced git push operations', async () => { const { smartGitPushV2 } = await import('../../src/tools/smart-git-push-tool-v2.js'); const result = await smartGitPushV2({ projectPath: '/test/project', branch: 'feature/advanced-feature', strategy: 'smart-merge', }); expect(result).toHaveProperty('content'); expect(result.content).toHaveLength(1); expect(result.content[0]).toHaveProperty('type', 'text'); }); it('should provide enhanced ADR compliance validation', async () => { const { smartGitPushV2 } = await import('../../src/tools/smart-git-push-tool-v2.js'); const result = await smartGitPushV2({ projectPath: '/test/project', checkDeploymentReadiness: true, targetEnvironment: 'production', }); expect(result.content[0].text).toContain('Deployment'); }); it('should support advanced conflict resolution', async () => { const { smartGitPushV2 } = await import('../../src/tools/smart-git-push-tool-v2.js'); const result = await smartGitPushV2({ projectPath: '/test/project', requestHumanConfirmation: true, }); expect(result.content[0].text).toContain('Push Summary'); }); it('should integrate with memory system v2', async () => { const { smartGitPushV2 } = await import('../../src/tools/smart-git-push-tool-v2.js'); const result = await smartGitPushV2({ projectPath: '/test/project', skipSecurity: false, }); expect(result.content[0].text).toContain('Security Issues'); }); it('should handle multi-repository operations', async () => { const { smartGitPushV2 } = await import('../../src/tools/smart-git-push-tool-v2.js'); const result = await smartGitPushV2({ projectPath: '/test/monorepo', multiRepoMode: true, subRepositories: ['frontend', 'backend', 'shared'], }); expect(result).toHaveProperty('content'); }); it('should provide enhanced validation pipeline', async () => { const { smartGitPushV2 } = await import('../../src/tools/smart-git-push-tool-v2.js'); const result = await smartGitPushV2({ projectPath: '/test/project', enforceDeploymentReadiness: true, strictDeploymentMode: true, }); expect(result.content[0].text).toContain('Files'); }); it('should support conversation context v2', async () => { const { smartGitPushV2 } = await import('../../src/tools/smart-git-push-tool-v2.js'); const conversationContext = { previousTools: ['adr-suggestion', 'bootstrap-validation'], currentTool: 'smart-git-push-v2', recommendations: ['create-rollback', 'validate-memory'], sessionHistory: [], }; const result = await smartGitPushV2({ projectPath: '/test/project', conversationContext, }); expect(result).toHaveProperty('content'); }); }); describe('Advanced Bootstrap Integration', () => { it('should validate multi-language deployment readiness', async () => { const { smartGitPushV2 } = await import('../../src/tools/smart-git-push-tool-v2.js'); const result = await smartGitPushV2({ projectPath: '/test/project', testResults: { success: true, testsRun: 10, testsPassed: 10, testsFailed: 0, }, }); expect(result.content[0].text).toContain('Tests'); }); it('should handle containerized environment validation', async () => { const { smartGitPushV2 } = await import('../../src/tools/smart-git-push-tool-v2.js'); const result = await smartGitPushV2({ projectPath: '/test/project', targetEnvironment: 'staging', }); expect(result.content[0].text).toContain('Push Summary'); }); it('should integrate with CI/CD pipeline validation', async () => { const { smartGitPushV2 } = await import('../../src/tools/smart-git-push-tool-v2.js'); const result = await smartGitPushV2({ projectPath: '/test/project', cicdIntegration: true, pipelineFiles: ['.github/workflows/ci.yml', '.gitlab-ci.yml'], validatePipeline: true, }); expect(result.content[0].text).toContain('pipeline'); }); it('should support infrastructure as code validation', async () => { const { smartGitPushV2 } = await import('../../src/tools/smart-git-push-tool-v2.js'); const result = await smartGitPushV2({ projectPath: '/test/project', dryRun: true, }); expect(result.content[0].text).toContain('Dry Run'); }); }); describe('Enhanced Error Handling and Recovery', () => { it('should provide intelligent error recovery', async () => { const { smartGitPushV2 } = await import('../../src/tools/smart-git-push-tool-v2.js'); const result = await smartGitPushV2({ projectPath: '/test/project', intelligentRecovery: true, autoRetry: true, maxRetries: 3, }); expect(result).toHaveProperty('content'); }); it('should handle partial failure scenarios', async () => { const { smartGitPushV2 } = await import('../../src/tools/smart-git-push-tool-v2.js'); const result = await smartGitPushV2({ projectPath: '/test/project', forceUnsafe: true, }); expect(result.content[0].text).toContain('Push Summary'); }); it('should provide detailed failure analysis', async () => { const { smartGitPushV2 } = await import('../../src/tools/smart-git-push-tool-v2.js'); const result = await smartGitPushV2({ projectPath: '/test/project', humanOverrides: [ { path: 'test.txt', purpose: 'testing', userConfirmed: true, timestamp: new Date().toISOString(), overrideReason: 'business-requirement', }, ], }); expect(result.content[0].text).toContain('Push Summary'); }); it('should support rollback strategies v2', async () => { const { smartGitPushV2 } = await import('../../src/tools/smart-git-push-tool-v2.js'); const result = await smartGitPushV2({ projectPath: '/test/project', message: 'test commit message', }); expect(result.content[0].text).toContain('Push Summary'); }); }); describe('Performance and Scalability V2', () => { it('should handle enterprise-scale repositories', async () => { const { smartGitPushV2 } = await import('../../src/tools/smart-git-push-tool-v2.js'); const result = await smartGitPushV2({ projectPath: '/test/enterprise-repo', enterpriseMode: true, optimizeForScale: true, distributedValidation: true, }); expect(result).toHaveProperty('content'); }); it('should support parallel processing v2', async () => { const { smartGitPushV2 } = await import('../../src/tools/smart-git-push-tool-v2.js'); const result = await smartGitPushV2({ projectPath: '/test/project', parallelProcessing: true, workerCount: 8, loadBalancing: true, }); expect(result).toHaveProperty('content'); }); it('should provide advanced caching mechanisms', async () => { const { smartGitPushV2 } = await import('../../src/tools/smart-git-push-tool-v2.js'); const result = await smartGitPushV2({ projectPath: '/test/project', advancedCaching: true, cacheStrategies: ['memory', 'disk', 'distributed'], cacheTtl: 7200, }); expect(result).toHaveProperty('content'); }); it('should support streaming for large operations', async () => { const { smartGitPushV2 } = await import('../../src/tools/smart-git-push-tool-v2.js'); const result = await smartGitPushV2({ projectPath: '/test/large-project', streamingMode: true, chunkSize: 1024 * 1024, progressReporting: true, }); expect(result).toHaveProperty('content'); }); }); describe('Tree-sitter Integration Enhancement', () => { it('should acknowledge tree-sitter enhancement potential', async () => { const { smartGitPushV2 } = await import('../../src/tools/smart-git-push-tool-v2.js'); const result = await smartGitPushV2({ projectPath: '/test/project', treeSitterAnalysis: true, languageParsers: ['typescript', 'python', 'rust'], }); // Should work even without tree-sitter installed expect(result).toHaveProperty('content'); }); it('should provide fallback analysis without tree-sitter', async () => { const { smartGitPushV2 } = await import('../../src/tools/smart-git-push-tool-v2.js'); const result = await smartGitPushV2({ projectPath: '/test/project', branch: 'main', }); expect(result.content[0].text).toContain('Push Summary'); }); it('should suggest tree-sitter integration benefits', async () => { const treeSitterBenefits = [ 'Accurate syntax parsing', 'Multi-language support', 'AST-based analysis', 'Better code understanding', 'Precise error detection', ]; expect(treeSitterBenefits).toHaveLength(5); expect(treeSitterBenefits.every(benefit => benefit.length > 0)).toBe(true); }); }); });

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/tosin2013/mcp-adr-analysis-server'

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