UNPKG

contaigents

Version:

Modular AI Content Ecosystem with Audio Generation

247 lines (241 loc) โ€ข 9.65 kB
#!/usr/bin/env node /** * Test script for Enhanced File Tools * Tests FileSearchTool, FileReadLinesTool, and FileWriteLinesTool */ import { FileSearchTool } from '../services/tools/FileSearchTool.js'; import { FileReadLinesTool } from '../services/tools/FileReadLinesTool.js'; import { FileWriteLinesTool } from '../services/tools/FileWriteLinesTool.js'; import fs from 'fs/promises'; async function createTestFile() { const testFilePath = 'test-enhanced-file-tools.js'; const testContent = `// Test file for enhanced file tools import React from 'react'; import { useState, useEffect } from 'react'; function TestComponent() { const [count, setCount] = useState(0); const [data, setData] = useState(null); useEffect(() => { // TODO: Implement data fetching console.log('Component mounted'); }, []); const handleClick = () => { setCount(count + 1); }; return ( <div> <h1>Test Component</h1> <p>Count: {count}</p> <button onClick={handleClick}>Increment</button> </div> ); } export default TestComponent; `; await fs.writeFile(testFilePath, testContent); console.log(`โœ… Created test file: ${testFilePath}`); return testFilePath; } async function testEnhancedFileTools() { console.log('๐Ÿงช Testing Enhanced File Tools...\n'); try { // Create test file const testFilePath = await createTestFile(); // Initialize tools const fileSearchTool = new FileSearchTool(process.cwd()); const fileReadLinesTool = new FileReadLinesTool(process.cwd()); const fileWriteLinesTool = new FileWriteLinesTool(process.cwd()); console.log('๐Ÿ“‹ Tool Information:'); console.log(`FileSearchTool: ${fileSearchTool.getDescription()}`); console.log(`FileReadLinesTool: ${fileReadLinesTool.getDescription()}`); console.log(`FileWriteLinesTool: ${fileWriteLinesTool.getDescription()}\n`); // Test 1: File Search Tool console.log('๐Ÿ” Test 1: File Search Tool'); // Search for useState hooks const searchResult1 = await fileSearchTool.execute({ file_path: testFilePath, search_pattern: 'useState', search_type: 'text', context_lines_before: 2, context_lines_after: 2 }); if (searchResult1.success) { console.log('โœ… useState search successful!'); console.log(`Found ${searchResult1.data.total_matches} matches`); searchResult1.data.matches.forEach((match, index) => { console.log(` Match ${index + 1} at line ${match.line_number}: ${match.match_text}`); }); } else { console.log('โŒ useState search failed:', searchResult1.error); } // Search with regex const searchResult2 = await fileSearchTool.execute({ file_path: testFilePath, search_pattern: 'const\\s+\\[\\w+,\\s*\\w+\\]', search_type: 'regex', context_lines_before: 1, context_lines_after: 1 }); if (searchResult2.success) { console.log('โœ… Regex search for destructuring successful!'); console.log(`Found ${searchResult2.data.total_matches} matches`); } else { console.log('โŒ Regex search failed:', searchResult2.error); } // Test 2: File Read Lines Tool console.log('\n๐Ÿ“– Test 2: File Read Lines Tool'); // Read specific lines const readResult1 = await fileReadLinesTool.execute({ file_path: testFilePath, line_start: 5, line_end: 10, include_line_numbers: true }); if (readResult1.success) { console.log('โœ… Line reading successful!'); console.log(`Read ${readResult1.data.lines_read} lines:`); console.log(readResult1.data.content); } else { console.log('โŒ Line reading failed:', readResult1.error); } // Read single line const readResult2 = await fileReadLinesTool.execute({ file_path: testFilePath, line_start: 1, include_line_numbers: false }); if (readResult2.success) { console.log('โœ… Single line reading successful!'); console.log(`Content: ${readResult2.data.content}`); } else { console.log('โŒ Single line reading failed:', readResult2.error); } // Test 3: File Write Lines Tool console.log('\nโœ๏ธ Test 3: File Write Lines Tool'); // Preview insert operation const insertPreview = await fileWriteLinesTool.execute({ file_path: testFilePath, operation: 'insert', line_position: 4, content: '// New import added by test\nimport { useCallback } from \'react\';', preview: true }); if (insertPreview.success) { console.log('โœ… Insert preview successful!'); console.log(`Operation: ${insertPreview.data.operation_summary}`); } else { console.log('โŒ Insert preview failed:', insertPreview.error); } // Actually perform insert const insertResult = await fileWriteLinesTool.execute({ file_path: testFilePath, operation: 'insert', line_position: 4, content: '// New import added by test\nimport { useCallback } from \'react\';' }); if (insertResult.success) { console.log('โœ… Insert operation successful!'); console.log(`${insertResult.data.operation_summary}`); } else { console.log('โŒ Insert operation failed:', insertResult.error); } // Test replace operation const replaceResult = await fileWriteLinesTool.execute({ file_path: testFilePath, operation: 'replace', line_position: 6, line_end: 6, content: ' // TODO: Implement data fetching with useCallback' }); if (replaceResult.success) { console.log('โœ… Replace operation successful!'); console.log(`${replaceResult.data.operation_summary}`); } else { console.log('โŒ Replace operation failed:', replaceResult.error); } // Test 4: Integration workflow console.log('\n๐Ÿ”„ Test 4: Integration Workflow'); // 1. Search for TODO comment const todoSearch = await fileSearchTool.execute({ file_path: testFilePath, search_pattern: 'TODO', search_type: 'text', context_lines_before: 1, context_lines_after: 1 }); if (todoSearch.success && todoSearch.data.total_matches > 0) { const todoLine = todoSearch.data.matches[0].line_number; console.log(`โœ… Found TODO at line ${todoLine}`); // 2. Read the TODO line and context const todoContext = await fileReadLinesTool.execute({ file_path: testFilePath, line_start: todoLine - 1, line_end: todoLine + 1 }); if (todoContext.success) { console.log('โœ… Read TODO context:'); console.log(todoContext.data.content); // 3. Insert implementation after TODO const implementResult = await fileWriteLinesTool.execute({ file_path: testFilePath, operation: 'insert', line_position: todoLine + 1, content: ' fetch(\'/api/data\')\n .then(response => response.json())\n .then(data => setData(data));' }); if (implementResult.success) { console.log('โœ… Implementation inserted successfully!'); } else { console.log('โŒ Implementation insertion failed:', implementResult.error); } } } // Test 5: Error handling console.log('\n๐Ÿ” Test 5: Error Handling'); // Test invalid file const invalidFileResult = await fileSearchTool.execute({ file_path: 'non-existent-file.js', search_pattern: 'test' }); if (!invalidFileResult.success) { console.log('โœ… Invalid file correctly rejected:', invalidFileResult.error); } else { console.log('โŒ Invalid file should have been rejected'); } // Test invalid regex const invalidRegexResult = await fileSearchTool.execute({ file_path: testFilePath, search_pattern: '[invalid regex', search_type: 'regex' }); if (!invalidRegexResult.success) { console.log('โœ… Invalid regex correctly rejected:', invalidRegexResult.error); } else { console.log('โŒ Invalid regex should have been rejected'); } // Cleanup console.log('\n๐Ÿงน Cleaning up test files...'); try { await fs.unlink(testFilePath); console.log('โœ… Test file cleaned up'); } catch (error) { console.log('โš ๏ธ Could not clean up test file:', error); } console.log('\n๐ŸŽ‰ Enhanced File Tools tests completed!'); } catch (error) { console.error('โŒ Test failed with error:', error); } } // Run the test testEnhancedFileTools().catch(console.error);