Files
2026Technology-Competition/tests/test_config.py
T
lhl d9aa3a3325 fix(writer): 修复概要设计书输出塌缩与章间引用缺失,并补 parser 防灾
- 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%)
2026-09-15 21:30:55 +08:00

116 lines
4.0 KiB
Python
Raw 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.
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():
"""OV2bge-small-zh 面向中文、实际语料为日文 → 默认切换多语言 bge-m3。"""
s = Settings()
assert s.rag.embedding.model == "BAAI/bge-m3"
def test_rerank_config_defaults():
"""I6v1 引入 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-2allowed_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