# 文档处理功能测试计划

**日期**: 2026-06-23
**目标**: 验证文档处理功能（U1-U9）是否完整实现 R1-R28 需求，并发现潜在 Bug

## 测试范围

### 需求覆盖矩阵

| 需求 | 描述 | 现有覆盖 | 测试计划 |
|------|------|----------|----------|
| R1 | Word 创建 | test_word_renderer.py | 已覆盖，补充边界 |
| R2 | Excel 创建 | test_excel_renderer.py | 已覆盖，补充边界 |
| R3 | PDF 创建 | test_pdf_renderer.py | 已覆盖，补充 CJK |
| R4 | 文档读取 | test_document_tool.py | 已覆盖，补充 PDF/HTML |
| R5-R8 | Agent 工具 | test_document_tool.py | 已覆盖 |
| R9-R10 | REST API | test_documents.py | 已覆盖，补充认证 |
| R11-R12 | 存储+元数据 | test_db.py | 已覆盖 |
| R13 | 路径遍历防护 | test_db.py | 已覆盖 |
| R14 | 文件命名 | test_db.py | 已覆盖 |
| R15 | 下载 | test_documents.py | 已覆盖 |
| R16 | 过期清理 | **未实现** | 标记为已知缺口 |
| R17-R22 | 前端 | 无后端测试 | 前端手动验证 |
| R23-R25 | 模板填充 | test_template_renderer.py | 已覆盖 |
| R26 | SSTI 防护 | test_template_renderer.py | 补充深度测试 |
| R27 | 认证 | **未测试** | **新增认证测试** |
| R28 | 文件大小限制 | 部分覆盖 | 补充 create 限制 |

### 端到端流程

| 流程 | 描述 | 现有覆盖 | 测试计划 |
|------|------|----------|----------|
| F1 | 对话触发文档生成 | 未覆盖 | **新增 E2E 测试** |
| F2 | 前端独立操作 | 部分覆盖 | **新增完整流程测试** |
| F3 | 面板查看/下载 | 部分覆盖 | **新增 list→download 流程** |

## 测试用例清单

### 1. 安全测试（高优先级）

#### 1.1 认证测试（R27）
- `test_create_without_api_key_returns_401`: 配置 API key 但请求不带 → 401
- `test_create_with_wrong_api_key_returns_401`: 错误 key → 401
- `test_create_with_valid_api_key_returns_200`: 正确 key → 200
- `test_download_without_api_key_returns_401`: 下载不带 key → 401
- `test_list_without_api_key_returns_401`: 列表不带 key → 401
- `test_upload_template_without_api_key_returns_401`: 上传不带 key → 401
- `test_api_key_via_query_param`: query param 传 key → 200
- `test_api_key_via_header`: header 传 key → 200
- `test_no_key_configured_allows_all`: 未配置 key → 允许所有（向后兼容）

#### 1.2 模板路径遍历（Bug 确认）
- `test_create_with_template_path_traversal`: template=`../../etc/passwd` → 应 404/400
- `test_create_with_template_absolute_path`: template=`/etc/passwd` → 应 404/400
- `test_create_with_template_null_byte`: template=`file.docx\x00../../etc/passwd` → 应拒绝

#### 1.3 深度 SSTI 测试（R26）
- `test_ssti_class_subclasses`: `{{ ''.__class__.__mro__[1].__subclasses__() }}` → 拦截
- `test_ssti_config_access`: `{{ config }}` → 不泄露
- `test_ssti_globals_access`: `{{ namespace.__init__.__globals__ }}` → 拦截
- `test_ssti_import_statement`: `{% import os %}` → 拦截

### 2. 端到端集成测试（高优先级）

#### 2.1 F1: 创建→列表→下载完整流程
- `test_e2e_create_word_list_download`: 创建 Word → 列表包含 → 下载内容匹配
- `test_e2e_create_excel_list_download`: 创建 Excel → 列表包含 → 下载内容匹配
- `test_e2e_create_pdf_list_download`: 创建 PDF → 列表包含 → 下载内容匹配
- `test_e2e_multiple_documents_same_conversation`: 同一对话多文档，列表按时间倒序

#### 2.2 F2: 模板完整流程
- `test_e2e_upload_template_create_download`: 上传模板 → 用模板创建 → 下载 → 验证变量已替换
- `test_e2e_template_with_loop`: 模板含循环 → 填充 → 下载 → 验证循环展开

#### 2.3 F3: 跨对话隔离
- `test_e2e_conversation_isolation`: 对话 A 的文档不出现在对话 B 列表中
- `test_e2e_download_other_conversation`: 下载不关联当前对话的文档（当前无 ACL，验证可下载）

### 3. Bug 查找测试（中优先级）

#### 3.1 数据库并发
- `test_concurrent_inserts`: 10 个并发 insert_document 全部成功
- `test_concurrent_create_document`: 并发 create_document 无锁错误

#### 3.2 文件系统异常
- `test_download_metadata_exists_file_missing`: 元数据存在但文件被删 → 404
- `test_create_disk_write_failure`: mock 写入失败 → 500（不产生孤立元数据）

#### 3.3 模板异常
- `test_create_with_invalid_docx_template`: 模板不是有效 docx → 错误处理
- `test_create_with_corrupted_template`: 损坏的 docx 文件 → 错误处理
- `test_template_with_missing_variables`: data 缺少变量 → 宽松处理（不崩溃）

#### 3.4 边界情况
- `test_create_empty_content`: 空内容 → 各格式正确处理
- `test_create_very_large_content`: 超大内容（10MB Markdown）→ 不超时
- `test_filename_unicode`: Unicode 文件名 → 正确存储
- `test_filename_only_special_chars`: 文件名只有特殊字符 → sanitize 后非空
- `test_excel_empty_cells_in_renderer`: Markdown 表格含空单元格 → 正确渲染
- `test_excel_special_chars_in_cells`: 单元格含 `|`、换行 → 正确处理
- `test_pdf_mixed_cjk_ascii`: 中英文混合 → 正确渲染
- `test_read_pdf_file`: 读取自创建的 PDF → 返回文本
- `test_read_html_file`: 读取 HTML → 返回纯文本

#### 3.5 数据一致性
- `test_create_document_metadata_matches_file`: 元数据 size 与实际文件大小一致
- `test_create_document_filename_has_correct_extension`: 各格式文件扩展名正确
- `test_download_returns_correct_filename`: 下载响应的 filename 与元数据一致

## 已知缺口（不在本次测试范围）

- R16 过期清理：源码未实现，需先实现再测试
- R17-R22 前端：需手动验证或 E2E 浏览器测试
- 文件大小限制（R28 for /create）：需先实现 content 大小限制

## 验证标准

- 所有安全测试通过（认证、路径遍历、SSTI）
- 所有 E2E 流程测试通过
- Bug 查找测试发现的问题记录为 Issue
- 现有 110 个测试无回归
