codex@macbookpro
·
2026-03-31
test_branch_a_real_textbooks.py
1from __future__ import annotations
2
3import json
4import subprocess
5import sys
6import tempfile
7import unittest
8from pathlib import Path
9
10from cie.validation_real_textbooks import (
11 DATASET_DIR,
12 DEFAULT_JSON_REPORT_PATH,
13 DEFAULT_MARKDOWN_REPORT_PATH,
14 DEFAULT_REVIEW_REPORT_PATH,
15 REQUIRED_REPORT_KEYS,
16 TEXTBOOKS,
17 VALID_SCENARIO_STATUSES,
18 generate_validation_report,
19)
20
21
22REPO_ROOT = Path(__file__).resolve().parent.parent
23
24
25class BranchARealTextbookValidationTests(unittest.TestCase):
26 @classmethod
27 def setUpClass(cls) -> None:
28 cls.temp_dir = tempfile.TemporaryDirectory()
29 temp_root = Path(cls.temp_dir.name)
30 cls.json_path = temp_root / "branch_a_real_textbooks.json"
31 cls.markdown_path = temp_root / "branch_a_real_textbooks.md"
32 cls.review_path = temp_root / "branch_a_real_textbooks_review.md"
33 cls.report = generate_validation_report(cls.json_path, cls.markdown_path, cls.review_path)
34
35 @classmethod
36 def tearDownClass(cls) -> None:
37 cls.temp_dir.cleanup()
38
39 def test_dataset_exists_with_required_files(self) -> None:
40 self.assertTrue(DATASET_DIR.is_dir())
41 for filename in TEXTBOOKS.values():
42 self.assertTrue((DATASET_DIR / filename).is_file(), msg=filename)
43
44 def test_validation_generates_all_report_files(self) -> None:
45 self.assertTrue(self.json_path.exists())
46 self.assertTrue(self.markdown_path.exists())
47 self.assertTrue(self.review_path.exists())
48
49 def test_json_report_has_required_top_level_keys(self) -> None:
50 payload = json.loads(self.json_path.read_text(encoding="utf-8"))
51 self.assertEqual(tuple(payload), REQUIRED_REPORT_KEYS)
52 self.assertTrue(payload["dataset_check"]["all_required_files_exist"])
53 self.assertIn("fairness_gap_reduced", payload["overall_summary"])
54
55 def test_scenarios_cover_a01_to_a10_with_valid_statuses(self) -> None:
56 scenarios = self.report["scenarios"]
57 self.assertEqual([item["scenario_id"] for item in scenarios], [f"A{index:02d}" for index in range(1, 11)])
58 for scenario in scenarios:
59 self.assertIn(scenario["status"], VALID_SCENARIO_STATUSES)
60 self.assertIn("reason", scenario)
61 self.assertIn("key_metrics", scenario)
62
63 def test_entrypoint_runs_with_default_paths(self) -> None:
64 completed = subprocess.run(
65 [sys.executable, "-m", "cie.validation_real_textbooks"],
66 cwd=REPO_ROOT,
67 capture_output=True,
68 text=True,
69 )
70 self.assertEqual(completed.returncode, 0, msg=completed.stderr)
71 self.assertTrue(DEFAULT_JSON_REPORT_PATH.exists())
72 self.assertTrue(DEFAULT_MARKDOWN_REPORT_PATH.exists())
73 self.assertTrue(DEFAULT_REVIEW_REPORT_PATH.exists())
74
75
76if __name__ == "__main__":
77 unittest.main()