CIE-Unified

git clone 

CIE-Unified / tests
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()