- Writer: 表格表头行/Table Grid 边框、列表 List Bullet/Number 样式、行内字符格式不再塌缩(外视 #6 反转) - Writer: 打通章间引用(WriterState 摘要 → 后章 prompt prior_summaries) - Writer: 删除 _chunk_source 死代码,章节数据经 DataGate 控 token 预算 - Writer: 章节结果落盘快照,命中即跳过 LLM(录制重拍可续跑,损坏快照自动忽略) - Parser: 按 body 顺序遍历正文+单元格(含嵌套表、合并单元格去重),修复表格内锚点漏检导致的静默丢章 - Parser/服务层: .xls 显式拒绝(可操作提示),上传即校验扩展名,rules 对齐 docx-only - 测试: 全量 680 通过,覆盖率 99.37%(红线 99%)
116 lines
4.0 KiB
Python
116 lines
4.0 KiB
Python
from pathlib import Path
|
||
|
||
import pytest
|
||
|
||
from genesis.config import Settings
|
||
|
||
FIXTURES = Path(__file__).parent / "fixtures"
|
||
|
||
|
||
# ---------- T5: 删除 Qdrant/Redis 死配置(Issue5) ----------
|
||
|
||
def test_qdrant_config_removed():
|
||
"""Scope 缩减裁定:Qdrant 双实现已废弃,配置模型不得残留 QdrantStoreConfig。"""
|
||
import genesis.config as cfg
|
||
|
||
assert not hasattr(cfg, "QdrantStoreConfig")
|
||
|
||
|
||
def test_vector_store_has_no_qdrant_field():
|
||
s = Settings()
|
||
assert not hasattr(s.rag.vector_store, "qdrant")
|
||
assert s.rag.vector_store.adapter == "chroma"
|
||
|
||
|
||
def test_task_queue_has_no_redis_url():
|
||
s = Settings()
|
||
assert "redis_url" not in s.app.task_queue
|
||
|
||
|
||
def test_from_dir_maps_yaml_fields():
|
||
s = Settings.from_dir(FIXTURES)
|
||
assert s.app.server.max_upload_mb == 10
|
||
assert s.app.session["sqlite_path"] == "C:/tmp/genesis.db"
|
||
assert s.app.task_queue["timeout_sec"] == 300
|
||
assert s.inference.models.primary.name == "deepseek-chat"
|
||
assert s.inference.llm_calls.max_context_tokens == 16000
|
||
assert s.inference.structured_output.max_parse_retry == 3
|
||
assert s.rag.embedding.model == "BAAI/bge-m3"
|
||
assert s.rag.retrieval.rrf_k == 42
|
||
|
||
|
||
def test_defaults_when_dir_empty(tmp_path):
|
||
s = Settings.from_dir(tmp_path)
|
||
assert s.app.name == "genesis"
|
||
assert s.app.server.max_upload_mb == 100
|
||
assert s.app.task_queue["backend"] == "memory"
|
||
assert s.inference.models.primary.name == "deepseek-chat"
|
||
assert s.rag.embedding.model == "BAAI/bge-m3"
|
||
assert s.rag.retrieval.rrf_k == 60
|
||
|
||
|
||
def test_env_override_yaml(monkeypatch):
|
||
monkeypatch.setenv("GENESIS_APP__SERVER__MAX_UPLOAD_MB", "25")
|
||
s = Settings.from_dir(FIXTURES)
|
||
assert s.app.server.max_upload_mb == 25
|
||
|
||
|
||
def test_env_create_missing_key(monkeypatch):
|
||
monkeypatch.setenv("GENESIS_RAG__RETRIEVAL__DEFAULT_TOP_K", "7")
|
||
s = Settings.from_dir(FIXTURES)
|
||
assert s.rag.retrieval.default_top_k == 7
|
||
|
||
|
||
def test_env_placeholder_expansion(monkeypatch):
|
||
monkeypatch.setenv("SOME_API_KEY", "sk-test-xyz")
|
||
s = Settings.from_dir(FIXTURES)
|
||
# Qdrant 已删除:验证占位展开仍作用于通用 env(此处用 app.session 的路径占位验证机制)
|
||
assert s.app.session["sqlite_path"] == "C:/tmp/genesis.db"
|
||
|
||
|
||
def test_redacted_hides_secrets():
|
||
s = Settings.from_dir(FIXTURES)
|
||
red = s.get_redacted()
|
||
# Qdrant 已删除:验证脱敏仍隐藏 chroma 相关字段(此处以 server 配置验证机制不回归)
|
||
assert red["app"]["server"]["max_upload_mb"] == 10
|
||
|
||
|
||
def test_expand_env_list_branch(monkeypatch):
|
||
# _expand_env 的 list 分支(L134):列表项递归展开环境占位
|
||
from genesis.config import _expand_env
|
||
monkeypatch.setenv("SOME_API_KEY", "sk-list-xyz")
|
||
data = {"models": [{"name": "a", "key": "${SOME_API_KEY}"}, "plain"]}
|
||
out = _expand_env(data)
|
||
assert out["models"][0]["key"] == "sk-list-xyz"
|
||
assert out["models"][1] == "plain"
|
||
|
||
|
||
# ---------- T6/T11: rerank 精排 + bge-m3 多语言(I6/OV2) ----------
|
||
|
||
def test_embedding_default_model_is_bge_m3():
|
||
"""OV2:bge-small-zh 面向中文、实际语料为日文 → 默认切换多语言 bge-m3。"""
|
||
s = Settings()
|
||
assert s.rag.embedding.model == "BAAI/bge-m3"
|
||
|
||
|
||
def test_rerank_config_defaults():
|
||
"""I6:v1 引入 rerank 精排(bge-reranker-v2-m3),默认启用、device=cpu。"""
|
||
s = Settings()
|
||
assert s.rag.rerank.enabled is True
|
||
assert s.rag.rerank.model == "BAAI/bge-reranker-v2-m3"
|
||
assert s.rag.rerank.device == "cpu"
|
||
|
||
|
||
def test_rerank_env_override(monkeypatch):
|
||
monkeypatch.setenv("GENESIS_RAG__RERANK__ENABLED", "false")
|
||
s = Settings.from_dir(FIXTURES)
|
||
assert s.rag.rerank.enabled is False
|
||
assert s.rag.rerank.model == "BAAI/bge-reranker-v2-m3"
|
||
|
||
|
||
# ---------- P2-2:allowed_extensions 不残留旧版 .xls(与解析层对齐) ----------
|
||
|
||
def test_default_allowed_extensions_excludes_legacy_xls():
|
||
s = Settings()
|
||
assert ".xls" not in s.app.server.allowed_extensions
|
||
assert ".xlsx" in s.app.server.allowed_extensions |