diff options
Diffstat (limited to 'modules/test/test-ai-fs-tools.js')
| -rw-r--r-- | modules/test/test-ai-fs-tools.js | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/modules/test/test-ai-fs-tools.js b/modules/test/test-ai-fs-tools.js index c427783..3968abe 100644 --- a/modules/test/test-ai-fs-tools.js +++ b/modules/test/test-ai-fs-tools.js @@ -65,6 +65,58 @@ const run = async (ai, name, args) => JSON.parse(await ai.runTool(name, args)); ok('D2 content landed', vfs.readFile('/missing/dir/f.txt') === 'x'); } + // E. write onto a directory node is refused, and the directory survives + { + const { ai, vfs } = mk(); + vfs.mkdirRecursive('/adir'); + vfs.writeFile('/adir/keep.txt', 'k'); + const res = await ai.runTool('write_file', { path: '/adir', content: 'x' }); + ok('E1 write onto a directory is refused', /Write FAILED/.test(String(res)), String(res)); + ok('E2 directory contents intact', vfs.readFile('/adir/keep.txt') === 'k'); + } + + // F. a read-only virtual path names that as the reason + { + const { ai } = mk(); + const res = await ai.runTool('write_file', { path: '/sys/info', content: 'x' }); + ok('F1 virtual path reports read-only', /Write FAILED: \/sys\/info — read-only virtual path/.test(String(res)), String(res)); + } + + // G. list_files on a FILE is an error, on '/' is the root listing + { + const { ai, vfs } = mk(); + vfs.writeFile('/file.txt', 'x'); + const onFile = await run(ai, 'list_files', { path: '/file.txt' }); + ok('G1 listing a file reports Directory not found', !!onFile.error && /\/file\.txt/.test(onFile.error), JSON.stringify(onFile)); + const onRoot = await run(ai, 'list_files', { path: '/' }); + ok('G2 root lists the virtual sys mount', Array.isArray(onRoot) && onRoot.some(e => e.name === 'sys'), JSON.stringify(onRoot).slice(0, 120)); + } + + // H. no argument means the CURRENT directory, not the root + { + const { ai, vfs } = mk(); + vfs.mkdirRecursive('/work'); + vfs.writeFile('/work/inside.txt', 'x'); + vfs.writeFile('/root-only.txt', 'y'); + vfs.currentPath = ['work']; + const cwd = await run(ai, 'list_files', {}); + const names = (cwd.error ? [] : cwd.map(e => e.name)); + ok('H1 no-arg lists the cwd', names.includes('inside.txt') && !names.includes('root-only.txt'), JSON.stringify(cwd).slice(0, 140)); + ok('H2 cwd is restored after the call', JSON.stringify(vfs.currentPath) === '["work"]', JSON.stringify(vfs.currentPath)); + } + + // I. a relative path resolves from the cwd + { + const { ai, vfs } = mk(); + vfs.mkdirRecursive('/docs'); + vfs.writeFile('/docs/sub.txt', 'x'); + vfs.currentPath = ['docs']; + const res = await run(ai, 'list_files', { path: 'sub.txt' }); + ok('I1 a relative file path is resolved, not guessed', !!res.error, JSON.stringify(res)); + const dirRes = await run(ai, 'list_files', { path: '.' }); + ok('I2 "." lists the cwd', Array.isArray(dirRes) && dirRes.some(e => e.name === 'sub.txt'), JSON.stringify(dirRes).slice(0, 120)); + } + if (fails === 0) { console.log('test-ai-fs-tools: ' + passes + ' passed, 0 failed'); } else { |