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"