204 lines
7.0 KiB
Markdown
204 lines
7.0 KiB
Markdown
# Phase 17 — Tool 子模块纯逻辑测试
|
||
|
||
> 创建日期:2026-04-02
|
||
> 预计:+150 tests / 11 files
|
||
> 目标:覆盖 Tool 目录下有丰富纯逻辑但零测试的子模块
|
||
|
||
---
|
||
|
||
## 17.1 `src/tools/PowerShellTool/__tests__/powershellSecurity.test.ts`(~25 tests)
|
||
|
||
**目标模块**: `src/tools/PowerShellTool/powershellSecurity.ts`(1091 行)
|
||
|
||
**安全关键** — 检测 ~20 种攻击向量。
|
||
|
||
| 测试分组 | 测试数 | 验证点 |
|
||
|---------|-------|--------|
|
||
| Invoke-Expression 检测 | 3 | `IEX`, `Invoke-Expression`, 变形 |
|
||
| Download cradle 检测 | 3 | `Net.WebClient`, `Invoke-WebRequest`, pipe |
|
||
| Privilege escalation | 3 | `Start-Process -Verb RunAs`, `runas.exe` |
|
||
| COM object | 2 | `New-Object -ComObject`, WScript.Shell |
|
||
| Scheduled tasks | 2 | `schtasks`, `Register-ScheduledTask` |
|
||
| WMI | 2 | `Invoke-WmiMethod`, `Get-WmiObject` |
|
||
| Module loading | 2 | `Import-Module` 从网络路径 |
|
||
| 安全命令通过 | 3 | `Get-Process`, `Get-ChildItem`, `Write-Host` |
|
||
| 混淆绕过尝试 | 3 | base64, 字符串拼接, 空格变形 |
|
||
| 组合命令 | 2 | `;` 分隔的多命令 |
|
||
|
||
**Mock**: 构造 `ParsedPowerShellCommand` 对象(不需要真实 AST)
|
||
|
||
---
|
||
|
||
## 17.2 `src/tools/PowerShellTool/__tests__/commandSemantics.test.ts`(~10 tests)
|
||
|
||
**目标模块**: `src/tools/PowerShellTool/commandSemantics.ts`(143 行)
|
||
|
||
| 测试用例 | 验证点 |
|
||
|---------|--------|
|
||
| grep exit 0/1/2 | 语义映射 |
|
||
| robocopy exit codes | Windows 特殊退出码 |
|
||
| findstr exit codes | Windows find 工具 |
|
||
| unknown command | 默认语义 |
|
||
| extractBaseCommand — basic | `grep "pattern" file` → `grep` |
|
||
| extractBaseCommand — path | `C:\tools\rg.exe` → `rg` |
|
||
| heuristicallyExtractBaseCommand | 模糊匹配 |
|
||
|
||
---
|
||
|
||
## 17.3 `src/tools/PowerShellTool/__tests__/destructiveCommandWarning.test.ts`(~15 tests)
|
||
|
||
**目标模块**: `src/tools/PowerShellTool/destructiveCommandWarning.ts`(110 行)
|
||
|
||
| 测试用例 | 验证点 |
|
||
|---------|--------|
|
||
| Remove-Item -Recurse -Force | 危险 |
|
||
| Format-Volume | 危险 |
|
||
| git reset --hard | 危险 |
|
||
| DROP TABLE | 危险 |
|
||
| Remove-Item (no -Force) | 安全 |
|
||
| Get-ChildItem | 安全 |
|
||
| 管道组合 | `rm -rf` + pipe |
|
||
| 大小写混合 | `ReMoVe-ItEm` |
|
||
|
||
---
|
||
|
||
## 17.4 `src/tools/PowerShellTool/__tests__/gitSafety.test.ts`(~12 tests)
|
||
|
||
**目标模块**: `src/tools/PowerShellTool/gitSafety.ts`(177 行)
|
||
|
||
| 测试用例 | 验证点 |
|
||
|---------|--------|
|
||
| normalizeGitPathArg — forward slash | 规范化 |
|
||
| normalizeGitPathArg — backslash | Windows 路径规范化 |
|
||
| normalizeGitPathArg — NTFS short name | `GITFI~1` → `.git` |
|
||
| isGitInternalPathPS — .git/config | true |
|
||
| isGitInternalPathPS — normal file | false |
|
||
| isDotGitPathPS — hidden git dir | true |
|
||
| isDotGitPathPS — .gitignore | false |
|
||
| bare repo attack | `.git` 路径遍历 |
|
||
|
||
---
|
||
|
||
## 17.5 `src/tools/LSPTool/__tests__/formatters.test.ts`(~20 tests)
|
||
|
||
**目标模块**: `src/tools/LSPTool/formatters.ts`(593 行)
|
||
|
||
| 测试用例 | 验证点 |
|
||
|---------|--------|
|
||
| formatGoToDefinitionResult — single | 单个定义 |
|
||
| formatGoToDefinitionResult — multiple | 多个定义(分组) |
|
||
| formatFindReferencesResult | 引用列表 |
|
||
| formatHoverResult — markdown | markdown 内容 |
|
||
| formatHoverResult — plaintext | 纯文本 |
|
||
| formatDocumentSymbolResult — classes | 类符号 |
|
||
| formatDocumentSymbolResult — functions | 函数符号 |
|
||
| formatDocumentSymbolResult — nested | 嵌套符号 |
|
||
| formatWorkspaceSymbolResult | 工作区符号 |
|
||
| formatPrepareCallHierarchyResult | 调用层次 |
|
||
| formatIncomingCallsResult | 入调用 |
|
||
| formatOutgoingCallsResult | 出调用 |
|
||
| empty results | 各函数空结果 |
|
||
| groupByFile helper | 文件分组逻辑 |
|
||
|
||
---
|
||
|
||
## 17.6 `src/tools/GrepTool/__tests__/utils.test.ts`(~10 tests)
|
||
|
||
**目标模块**: `src/tools/GrepTool/GrepTool.ts`(577 行)
|
||
|
||
| 测试用例 | 验证点 |
|
||
|---------|--------|
|
||
| applyHeadLimit — within limit | 不截断 |
|
||
| applyHeadLimit — exceeds limit | 正确截断 |
|
||
| applyHeadLimit — offset + limit | 分页逻辑 |
|
||
| applyHeadLimit — zero limit | 边界 |
|
||
| formatLimitInfo — basic | 格式化输出 |
|
||
|
||
**Mock**: `mock.module("src/utils/log.ts", ...)` 解锁导入
|
||
|
||
---
|
||
|
||
## 17.7 `src/tools/WebFetchTool/__tests__/utils.test.ts`(~15 tests)
|
||
|
||
**目标模块**: `src/tools/WebFetchTool/utils.ts`(531 行)
|
||
|
||
| 测试用例 | 验证点 |
|
||
|---------|--------|
|
||
| validateURL — valid http | 通过 |
|
||
| validateURL — valid https | 通过 |
|
||
| validateURL — ftp | 拒绝 |
|
||
| validateURL — no protocol | 拒绝 |
|
||
| validateURL — localhost | 处理 |
|
||
| isPermittedRedirect — same host | 允许 |
|
||
| isPermittedRedirect — different host | 拒绝 |
|
||
| isPermittedRedirect — subdomain | 处理 |
|
||
| isRedirectInfo — valid object | true |
|
||
| isRedirectInfo — invalid | false |
|
||
|
||
---
|
||
|
||
## 17.8 `src/tools/WebFetchTool/__tests__/preapproved.test.ts`(~10 tests)
|
||
|
||
**目标模块**: `src/tools/WebFetchTool/preapproved.ts`(167 行)
|
||
|
||
| 测试用例 | 验证点 |
|
||
|---------|--------|
|
||
| exact hostname match | 通过 |
|
||
| subdomain match | 处理 |
|
||
| path prefix match | `/docs/api` 匹配 |
|
||
| path non-match | `/internal` 不匹配 |
|
||
| unknown hostname | false |
|
||
| empty pathname | 边界 |
|
||
|
||
---
|
||
|
||
## 17.9 `src/tools/FileReadTool/__tests__/utils.test.ts`(~15 tests)
|
||
|
||
**目标模块**: `src/tools/FileReadTool/FileReadTool.ts`(1184 行)
|
||
|
||
| 测试用例 | 验证点 |
|
||
|---------|--------|
|
||
| isBlockedDevicePath — /dev/sda | true |
|
||
| isBlockedDevicePath — /dev/null | 处理 |
|
||
| isBlockedDevicePath — normal file | false |
|
||
| detectSessionFileType — .jsonl | 会话文件类型 |
|
||
| detectSessionFileType — unknown | 未知类型 |
|
||
| formatFileLines — basic | 行号格式 |
|
||
| formatFileLines — empty | 空文件 |
|
||
|
||
---
|
||
|
||
## 17.10 `src/tools/AgentTool/__tests__/agentToolUtils.test.ts`(~18 tests)
|
||
|
||
**目标模块**: `src/tools/AgentTool/agentToolUtils.ts`(688 行)
|
||
|
||
| 测试用例 | 验证点 |
|
||
|---------|--------|
|
||
| filterToolsForAgent — builtin only | 只返回内置工具 |
|
||
| filterToolsForAgent — exclude async | 排除异步工具 |
|
||
| filterToolsForAgent — permission mode | 权限过滤 |
|
||
| resolveAgentTools — wildcard | 通配符展开 |
|
||
| resolveAgentTools — explicit list | 显式列表 |
|
||
| countToolUses — multiple | 消息中工具调用计数 |
|
||
| countToolUses — zero | 无工具调用 |
|
||
| extractPartialResult — text only | 提取文本 |
|
||
| extractPartialResult — mixed | 混合内容 |
|
||
| getLastToolUseName — basic | 最后工具名 |
|
||
| getLastToolUseName — no tool use | 无工具调用 |
|
||
|
||
**Mock**: `mock.module("src/bootstrap/state.ts", ...)`, `mock.module("src/utils/log.ts", ...)`
|
||
|
||
---
|
||
|
||
## 17.11 `src/tools/LSPTool/__tests__/schemas.test.ts`(~5 tests)
|
||
|
||
**目标模块**: `src/tools/LSPTool/schemas.ts`(216 行)
|
||
|
||
| 测试用例 | 验证点 |
|
||
|---------|--------|
|
||
| isValidLSPOperation — goToDefinition | true |
|
||
| isValidLSPOperation — findReferences | true |
|
||
| isValidLSPOperation — hover | true |
|
||
| isValidLSPOperation — invalid | false |
|
||
| isValidLSPOperation — empty string | false |
|