contaigents
Version:
Modular AI Content Ecosystem with Audio Generation
247 lines (241 loc) โข 9.65 kB
JavaScript
#!/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);