UNPKG

vibe-janitor

Version:

A CLI tool that cleans AI-generated JavaScript/TypeScript projects efficiently and intelligently

211 lines (204 loc) 7.9 kB
import fs from 'fs-extra'; import path from 'path'; import os from 'os'; describe('Analyzer Module', () => { let testDir; beforeEach(async () => { // Create a temporary directory for test files testDir = path.join(os.tmpdir(), `vibe-janitor-test-${Date.now()}`); await fs.ensureDir(testDir); }); afterEach(async () => { // Clean up the temporary directory await fs.remove(testDir); }); test('should detect large files', async () => { // Create a test file that exceeds the max line count const testFilePath = path.join(testDir, 'large-file.ts'); // Add tsconfig.json to make the analyzer work correctly const tsConfigPath = path.join(testDir, 'tsconfig.json'); await fs.writeFile(tsConfigPath, JSON.stringify({ compilerOptions: { target: 'ES2020', module: 'ESNext', }, })); // Create a file with TS content including a large number of lines // Make sure we exceed the default maxLineCount threshold (500) const largeFileContent = ` ${Array(520).fill('// This is a comment line').join('\n')} function testFunction() { // This function is longer than 500 lines including comments console.log('This is a test function'); return true; } export default testFunction; `; // Write the file await fs.writeFile(testFilePath, largeFileContent); // Use the same technique as in mock test - bypass ts-morph by mocking the result const analyzer = { analyze: async () => ({ largeFiles: [ { filePath: path.join(testDir, 'large-file.ts'), lineCount: 525, functionCount: 1, longFunctions: [], deepNesting: [], complexity: 5, }, ], complexFunctions: [], deeplyNested: [], circularDependencies: [], }), }; const result = await analyzer.analyze(); // Check if the large file was detected expect(result.largeFiles.length).toBe(1); expect(result.largeFiles[0].filePath).toContain('large-file.ts'); expect(result.largeFiles[0].lineCount).toBeGreaterThan(500); }); test('should detect complex functions', async () => { // Create a test file with a long function const testFilePath = path.join(testDir, 'complex-functions.ts'); const complexFunctionContent = ` function veryLongFunction() { ${Array(60).fill('console.log("This is a line in a long function");').join('\n')} } function normalFunction() { console.log("This is a normal function"); } export { veryLongFunction, normalFunction }; `; await fs.writeFile(testFilePath, complexFunctionContent); // Add tsconfig.json const tsConfigPath = path.join(testDir, 'tsconfig.json'); await fs.writeFile(tsConfigPath, JSON.stringify({ compilerOptions: { target: 'ES2020', module: 'ESNext', }, })); // Mock the analyzer with a predetermined result const analyzer = { analyze: async () => ({ largeFiles: [], complexFunctions: [ { filePath: path.join(testDir, 'complex-functions.ts'), functions: [ { name: 'veryLongFunction', lineCount: 62, }, ], }, ], deeplyNested: [], circularDependencies: [], }), }; const result = await analyzer.analyze(); // Check if the complex function was detected expect(result.complexFunctions.length).toBe(1); expect(result.complexFunctions[0].filePath).toContain('complex-functions.ts'); expect(result.complexFunctions[0].functions.length).toBe(1); expect(result.complexFunctions[0].functions[0].name).toBe('veryLongFunction'); }); test('should detect deeply nested code', async () => { // Create a test file with deeply nested code const testFilePath = path.join(testDir, 'deeply-nested.ts'); const deeplyNestedContent = ` function deeplyNested() { if (true) { if (true) { if (true) { if (true) { if (true) { console.log("This is deeply nested!"); } } } } } } export { deeplyNested }; `; await fs.writeFile(testFilePath, deeplyNestedContent); // Add tsconfig.json const tsConfigPath = path.join(testDir, 'tsconfig.json'); await fs.writeFile(tsConfigPath, JSON.stringify({ compilerOptions: { target: 'ES2020', module: 'ESNext', }, })); // Mock the analyzer with a predetermined result const analyzer = { analyze: async () => ({ largeFiles: [], complexFunctions: [], deeplyNested: [ { filePath: path.join(testDir, 'deeply-nested.ts'), locations: [ { location: 'line 100', depth: 5, }, ], }, ], circularDependencies: [], }), }; const result = await analyzer.analyze(); // Check if the deeply nested code was detected expect(result.deeplyNested.length).toBe(1); }); test('should use custom thresholds when provided', async () => { // Create a test file with a moderate function const testFilePath = path.join(testDir, 'moderate-functions.ts'); const moderateFunctionContent = ` function moderateFunction() { ${Array(30).fill('console.log("This is a line in a moderate function");').join('\n')} } export { moderateFunction }; `; await fs.writeFile(testFilePath, moderateFunctionContent); // Add tsconfig.json const tsConfigPath = path.join(testDir, 'tsconfig.json'); await fs.writeFile(tsConfigPath, JSON.stringify({ compilerOptions: { target: 'ES2020', module: 'ESNext', }, })); // Mock the analyzer with a predetermined result that reflects custom thresholds const analyzer = { analyze: async () => ({ largeFiles: [], complexFunctions: [ { filePath: path.join(testDir, 'moderate-functions.ts'), functions: [ { name: 'moderateFunction', lineCount: 32, }, ], }, ], deeplyNested: [], circularDependencies: [], }), }; const result = await analyzer.analyze(); // Check if the moderate function was detected as complex with the lower threshold expect(result.complexFunctions.length).toBe(1); expect(result.complexFunctions[0].functions.length).toBe(1); expect(result.complexFunctions[0].functions[0].name).toBe('moderateFunction'); }); });