Files
lyxy-document/tests/conftest.py
lanyuanxiaoyao 89ffc88082 fix: 优化配置、修复测试和 temp_pdf 中文字体支持
- 优化 config.py,为所有依赖添加版本号,为所有文件类型添加 Darwin-x86_64 配置
- 修改 run_tests.py,添加平台相关 TEST_FIXTURE_DEPENDENCIES,简化 cli 和 all 测试逻辑
- 修复 tests/conftest.py 中 temp_pdf 的中文字体支持,使用 macOS 系统字体
- 更新 tests/test_core/test_advice_generator.py 以适应 Python 3.12 的默认配置
- 更新 openspec 相关规格文档
2026-03-17 10:50:48 +08:00

236 lines
6.4 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""测试配置和共享 fixtures。"""
import sys
from pathlib import Path
# 将 scripts/ 目录添加到 sys.path必须在最顶部在其他导入之前
project_root = Path(__file__).resolve().parent.parent # tests/ 的父目录是项目根目录
scripts_dir = project_root / "scripts"
if str(scripts_dir) not in sys.path:
sys.path.insert(0, str(scripts_dir))
import pytest
from readers import READERS
@pytest.fixture
def all_readers():
"""返回所有 Reader 实例的列表。"""
return [ReaderCls() for ReaderCls in READERS]
@pytest.fixture
def sample_markdown():
"""示例 Markdown 文本。"""
return """# 标题
这是一段测试文本。
## 子标题
- 列表项 1
- 列表项 2
### 另一个标题
这是更多的文本。
"""
@pytest.fixture
def temp_docx(tmp_path):
"""创建临时 DOCX 文件的 fixture 工厂。
Args:
paragraphs: 段落文本列表
headings: 标题列表,格式为 [(level, text), ...]
table_data: 表格数据,格式为 [[cell1, cell2], [cell3, cell4]]
list_items: 列表项列表
Returns:
str: 临时文件路径
"""
def _create_docx(paragraphs=None, headings=None, table_data=None, list_items=None):
from docx import Document
doc = Document()
# 添加标题
if headings:
for level, text in headings:
doc.add_heading(text, level=level)
# 添加段落
if paragraphs:
for para_text in paragraphs:
doc.add_paragraph(para_text)
# 添加表格
if table_data:
table = doc.add_table(rows=len(table_data), cols=len(table_data[0]))
for i, row_data in enumerate(table_data):
for j, cell_text in enumerate(row_data):
table.rows[i].cells[j].text = str(cell_text)
# 添加列表项
if list_items:
for item in list_items:
doc.add_paragraph(item, style='List Bullet')
file_path = tmp_path / "test.docx"
doc.save(str(file_path))
return str(file_path)
return _create_docx
@pytest.fixture
def temp_pdf(tmp_path):
"""创建临时 PDF 文件的 fixture 工厂。
Args:
text: PDF 文本内容
lines: 文本行列表
Returns:
str: 临时文件路径
"""
def _create_pdf(text=None, lines=None):
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
file_path = tmp_path / "test.pdf"
c = canvas.Canvas(str(file_path), pagesize=letter)
# 尝试注册中文字体(如果可用)
font_loaded = False
try:
# 尝试 macOS 中文字体
for font_name, font_path, font_index in [
('PingFangSC', '/System/Library/Fonts/PingFang.ttc', 0),
('STHeiti', '/System/Library/Fonts/STHeiti Light.ttc', 0),
('STHeitiMedium', '/System/Library/Fonts/STHeiti Medium.ttc', 0),
]:
try:
from reportlab.pdfbase.ttfonts import TTFont
import os
if os.path.exists(font_path):
# For TTC files, we need to specify the font index
pdfmetrics.registerFont(TTFont(font_name, font_path, subfontIndex=font_index))
c.setFont(font_name, 12)
font_loaded = True
break
except Exception as e:
continue
except Exception:
pass
if not font_loaded:
# 回退到默认字体
c.setFont('Helvetica', 12)
y_position = 750
if text:
# 单个文本块
for line in text.split('\n'):
c.drawString(100, y_position, line)
y_position -= 20
if lines:
# 多行文本
for line in lines:
c.drawString(100, y_position, line)
y_position -= 20
c.save()
return str(file_path)
return _create_pdf
@pytest.fixture
def temp_html(tmp_path):
"""创建临时 HTML 文件的 fixture 工厂。
Args:
content: HTML 内容字符串
encoding: 文件编码,默认 'utf-8'
Returns:
str: 临时文件路径
"""
def _create_html(content="<html><body><p>Test</p></body></html>", encoding='utf-8'):
file_path = tmp_path / "test.html"
# 如果内容不包含完整的 HTML 结构,添加基本结构
if not content.strip().startswith('<html'):
content = f"<html><head><meta charset='{encoding}'></head><body>{content}</body></html>"
with open(file_path, 'w', encoding=encoding) as f:
f.write(content)
return str(file_path)
return _create_html
@pytest.fixture
def temp_pptx(tmp_path):
"""创建临时 PPTX 文件的 fixture 工厂。
Args:
slides: 幻灯片内容列表,每个元素为 (title, content) 元组
Returns:
str: 临时文件路径
"""
def _create_pptx(slides=None):
from pptx import Presentation
prs = Presentation()
if slides:
for title, content in slides:
slide = prs.slides.add_slide(prs.slide_layouts[1]) # Title and Content layout
slide.shapes.title.text = title
if content:
text_frame = slide.shapes.placeholders[1].text_frame
text_frame.text = content
file_path = tmp_path / "test.pptx"
prs.save(str(file_path))
return str(file_path)
return _create_pptx
@pytest.fixture
def temp_xlsx(tmp_path):
"""创建临时 XLSX 文件的 fixture 工厂。
Args:
data: 表格数据,格式为 [[cell1, cell2], [cell3, cell4]]
Returns:
str: 临时文件路径
"""
def _create_xlsx(data=None):
import pandas as pd
file_path = tmp_path / "test.xlsx"
if data:
df = pd.DataFrame(data)
df.to_excel(str(file_path), index=False, header=False)
else:
# 创建空的 Excel 文件
df = pd.DataFrame()
df.to_excel(str(file_path), index=False)
return str(file_path)
return _create_xlsx