The backend no longer mentions MinIO anywhere: MinioClient -> GarageClient (minio_client.py -> garage_client.py), MINIO_* env vars -> GARAGE_*, and the `minio` Python package is replaced with `boto3` (AWS's generic S3 client) since Garage is the only storage backend this project targets now. S3 API semantics are unchanged, so document_service.py's behavior is identical — this is a naming and dependency swap, not a logic change. Also updates test fixtures/names (FakeMinioClient -> FakeGarageClient, FakeMinioSDK -> FakeS3SDK) and storage/README.md, which no longer frames Garage as a MinIO replacement (that migration note has served its purpose now that no MinIO reference remains in the codebase). Backend: 54/54 tests passing. Frontend: 38/38 tests passing (unaffected, verified for regressions since it talks to the backend only through the unchanged REST API).
92 lines
2.7 KiB
Python
92 lines
2.7 KiB
Python
from app.text_extract import html_to_text, markdown_to_text
|
||
|
||
|
||
def test_html_to_text_strips_tags():
|
||
html = """
|
||
<html>
|
||
<body>
|
||
<h1>架构设计</h1>
|
||
<p>DocHub 是一个基于 <strong>Garage</strong> 的文档管理系统。</p>
|
||
<ul>
|
||
<li>浏览文档</li>
|
||
<li>全文检索</li>
|
||
</ul>
|
||
</body>
|
||
</html>
|
||
"""
|
||
result = html_to_text(html)
|
||
assert "架构设计" in result
|
||
assert "DocHub 是一个基于 Garage 的文档管理系统。" in result
|
||
assert "浏览文档" in result
|
||
assert "<h1>" not in result
|
||
assert "<strong>" not in result
|
||
|
||
|
||
def test_html_to_text_collapses_whitespace():
|
||
html = "<p>第一段</p>\n\n\n<p>第二段</p>"
|
||
result = html_to_text(html)
|
||
assert result == "第一段 第二段"
|
||
|
||
|
||
def test_markdown_to_text_strips_headers_and_emphasis():
|
||
markdown = """# 架构设计
|
||
|
||
## 背景
|
||
|
||
DocHub 是一个 **基于 Garage** 的 _文档管理系统_,支持全文检索。
|
||
"""
|
||
result = markdown_to_text(markdown)
|
||
assert "#" not in result
|
||
assert "**" not in result
|
||
assert "_" not in result
|
||
assert "架构设计" in result
|
||
assert "背景" in result
|
||
assert "基于 Garage" in result
|
||
assert "文档管理系统" in result
|
||
|
||
|
||
def test_markdown_to_text_strips_links_and_list_markers():
|
||
markdown = """## 功能列表
|
||
|
||
- 浏览 [Garage](https://garagehq.deuxfleurs.fr) 中存储的文档
|
||
- 支持 [Meilisearch](https://www.meilisearch.com) 全文检索
|
||
1. 在线编辑并保存
|
||
"""
|
||
result = markdown_to_text(markdown)
|
||
assert "[" not in result
|
||
assert "](" not in result
|
||
assert "浏览 Garage 中存储的文档" in result
|
||
assert "支持 Meilisearch 全文检索" in result
|
||
assert "在线编辑并保存" in result
|
||
|
||
|
||
def test_html_to_text_escapes_raw_tag_like_text_content():
|
||
html_doc = "<p>点击查看 <img src=x onerror=alert(1)> 示例</p>"
|
||
result = html_to_text(html_doc)
|
||
assert "<img" not in result
|
||
assert "<img src=x onerror=alert(1)>" in result
|
||
|
||
|
||
def test_markdown_to_text_escapes_raw_html_in_markdown_body():
|
||
markdown = "# 说明\n\n请勿插入 <img src=x onerror=alert(1)> 这样的标签。"
|
||
result = markdown_to_text(markdown)
|
||
assert "<img" not in result
|
||
assert "<img src=x onerror=alert(1)>" in result
|
||
|
||
|
||
def test_markdown_to_text_strips_code_fences_and_inline_code():
|
||
markdown = """使用 `pip install -r requirements.txt` 安装依赖。
|
||
|
||
```python
|
||
def hello():
|
||
return "world"
|
||
```
|
||
|
||
安装完成后启动服务。
|
||
"""
|
||
result = markdown_to_text(markdown)
|
||
assert "```" not in result
|
||
assert "def hello" not in result
|
||
assert "使用 pip install -r requirements.txt 安装依赖。" in result
|
||
assert "安装完成后启动服务。" in result
|