test_reviewer_config.py python
98 lines 3.7 KB
Raw
sha256:a78e7e5a8740e03315f325d19edeb3aa1b306b3337d04abbaa9a9e0f3bbeb7a1 docs: MuseHub-first before ISR #74 — staging solidify NEXT Human 1 day ago
1 """Unit tests for freeze_contract.reviewer schema (§K5.3)."""
2
3 from __future__ import annotations
4
5 from pathlib import Path
6
7 import pytest
8 import yaml
9
10 from adapters.config import load_config
11 from adapters.errors import ConfigError
12 from cli.config_gen import default_config_dict, load_config_from_dict
13 from tests.support import FIXTURES, write_config
14
15
16 def test_nested_reviewer_mapping_parses(repo_root: Path) -> None:
17 path = write_config(repo_root, "config-git-only.yaml")
18 data = yaml.safe_load(path.read_text(encoding="utf-8"))
19 data["freeze_contract"]["reviewer"] = {
20 "mode": "agent",
21 "model": "thinking-high",
22 "provider": "local",
23 "fallback": "human",
24 }
25 path.write_text(yaml.safe_dump(data), encoding="utf-8")
26 config = load_config(path)
27 assert config.freeze_contract.reviewer.mode == "agent"
28 assert config.freeze_contract.reviewer.model == "thinking-high"
29
30
31 def test_legacy_string_normalizes(repo_root: Path) -> None:
32 config = load_config(write_config(repo_root, "config-git-only.yaml"))
33 assert config.freeze_contract.reviewer.mode == "agent"
34 assert config.freeze_contract.reviewer.model == "thinking-high"
35 assert config.freeze_contract.reviewer.provider == "local"
36 assert config.freeze_contract.reviewer.fallback == "human"
37
38
39 def test_unknown_model_label_rejected_via_cli_validation(tmp_path: Path) -> None:
40 from cli.kit_root import kit_root
41 from tools.freeze_reviewer.labels import validate_reviewer_model
42
43 with pytest.raises(ConfigError, match="unknown reviewer.model"):
44 validate_reviewer_model("not-a-real-label", kit_root())
45
46
47 def test_unknown_provider_rejected(repo_root: Path) -> None:
48 path = write_config(repo_root, "config-git-only.yaml")
49 data = yaml.safe_load(path.read_text(encoding="utf-8"))
50 data["freeze_contract"]["reviewer"] = {
51 "mode": "agent",
52 "model": "thinking-high",
53 "provider": "satellite",
54 "fallback": "human",
55 }
56 path.write_text(yaml.safe_dump(data), encoding="utf-8")
57 with pytest.raises(ConfigError, match="provider"):
58 load_config(path)
59
60
61 def test_unknown_escalation_token_rejected(repo_root: Path) -> None:
62 path = write_config(repo_root, "config-git-only.yaml")
63 data = yaml.safe_load(path.read_text(encoding="utf-8"))
64 data["freeze_contract"]["human_escalation"] = ["bogus"]
65 path.write_text(yaml.safe_dump(data), encoding="utf-8")
66 with pytest.raises(ConfigError, match="human_escalation"):
67 load_config(path)
68
69
70 def test_extra_reviewer_keys_rejected(repo_root: Path) -> None:
71 path = write_config(repo_root, "config-git-only.yaml")
72 data = yaml.safe_load(path.read_text(encoding="utf-8"))
73 data["freeze_contract"]["reviewer"] = {
74 "mode": "agent",
75 "model": "thinking-high",
76 "provider": "local",
77 "fallback": "human",
78 "extra": True,
79 }
80 path.write_text(yaml.safe_dump(data), encoding="utf-8")
81 with pytest.raises(ConfigError, match="unknown freeze_contract.reviewer keys"):
82 load_config(path)
83
84
85 def test_missing_agent_reviewer_fields_rejected(repo_root: Path) -> None:
86 path = write_config(repo_root, "config-git-only.yaml")
87 data = yaml.safe_load(path.read_text(encoding="utf-8"))
88 data["freeze_contract"]["reviewer"] = {"mode": "agent"}
89 path.write_text(yaml.safe_dump(data), encoding="utf-8")
90 with pytest.raises(ConfigError, match="required when mode is agent"):
91 load_config(path)
92
93
94 def test_init_emits_nested_reviewer() -> None:
95 data = default_config_dict(regime="git-only", repo_name="x", docs_dir="docs")
96 reviewer = data["freeze_contract"]["reviewer"]
97 assert isinstance(reviewer, dict)
98 assert reviewer["mode"] == "agent"
File History 2 commits
sha256:a78e7e5a8740e03315f325d19edeb3aa1b306b3337d04abbaa9a9e0f3bbeb7a1 docs: MuseHub-first before ISR #74 — staging solidify NEXT Human 1 day ago
sha256:4671b7f787ddbe63ced31c895b688c77ab495653b65a730b423329f26b3c1439 feat: K1-P1 complete — agent provenance, build-verification… Sonnet 4.6 patch 53 days ago