← Files Investment BankingARCHIVED FILE
tests/test_codex_review_fixes.py
8 KB · Oct 2, 2026 · 00:27 UTC
from __future__ import annotations
import importlib.util
import json
import sys
import tempfile
import unittest
from importlib.machinery import SourceFileLoader
from importlib.util import module_from_spec, spec_from_loader
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
def load_python_module(rel: str, name: str):
path = ROOT / rel
spec = importlib.util.spec_from_file_location(name, path)
assert spec is not None
assert spec.loader is not None
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
return module
def load_runtime_module(rel: str, name: str):
path = ROOT / rel
loader = SourceFileLoader(name, str(path))
spec = spec_from_loader(loader.name, loader)
assert spec is not None
module = module_from_spec(spec)
sys.modules[name] = module
loader.exec_module(module)
return module
class CodexReviewFixTests(unittest.TestCase):
def test_private_credit_html_report_renders_sections_and_tables(self) -> None:
metrics = load_python_module(
"skills/private-credit-underwriting/scripts/calculate_credit_metrics.py",
"private_credit_metrics_review_fix",
)
encoded_basis = metrics._markdown_table_cell("First lien | total net leverage")
markdown = f"""# Credit metrics report
- period: FY2026
## Core metrics
| Metric | Value | Basis |
|---|---:|---|
| net leverage | 3.5x | first-pass proxy |
| covenant | {encoded_basis} | source term |
"""
with tempfile.TemporaryDirectory() as tmpdir:
output = Path(tmpdir) / "credit_memo.html"
metrics._write_html_report(output, "Private Credit Underwriting Memo", markdown)
html = output.read_text(encoding="utf-8")
self.assertIn("<h2>Core metrics</h2>", html)
self.assertIn("<table>", html)
self.assertIn("<th>Metric</th>", html)
self.assertIn("<td>net leverage</td>", html)
self.assertIn("<td>First lien | total net leverage</td>", html)
self.assertNotIn("<td>total net leverage</td>", html)
self.assertNotIn("| Metric | Value | Basis |", html)
self.assertNotIn("<pre", html)
def test_three_statement_validated_debt_without_covenants_does_not_warn(self) -> None:
core = load_runtime_module(
"skills/three-statement-model-builder/scripts/skill_core_runtime",
"three_statement_core_review_fix",
)
skill_root = ROOT / "skills" / "three-statement-model-builder"
plan = json.loads((skill_root / "assets" / "plan_template.json").read_text())
plan["source_basis"][1]["evidence_label"] = "source_reported"
plan["source_basis"][1]["confidence"] = "medium"
normalized = core.normalize_plan(plan, skill_root)
scenarios = core.run_scenarios(normalized)
hard_failures, warnings, _checks = core.evaluate_hard_failures_and_warnings(
normalized, scenarios
)
warning_codes = {warning["code"] for warning in warnings}
self.assertNotIn("LIQUIDITY_COVENANT_SUPPORT_UNVALIDATED", warning_codes)
self.assertNotEqual(core.model_status(hard_failures, warnings, normalized), "screen-grade")
def test_three_statement_unsupported_debt_without_covenants_still_warns(self) -> None:
core = load_runtime_module(
"skills/three-statement-model-builder/scripts/skill_core_runtime",
"three_statement_core_unsupported_debt_review_fix",
)
skill_root = ROOT / "skills" / "three-statement-model-builder"
plan = json.loads((skill_root / "assets" / "plan_template.json").read_text())
normalized = core.normalize_plan(plan, skill_root)
scenarios = core.run_scenarios(normalized)
_hard_failures, warnings, _checks = core.evaluate_hard_failures_and_warnings(
normalized, scenarios
)
warning_codes = {warning["code"] for warning in warnings}
self.assertIn("LIQUIDITY_COVENANT_SUPPORT_UNVALIDATED", warning_codes)
def test_three_statement_liquidity_only_source_does_not_validate_debt(self) -> None:
core = load_runtime_module(
"skills/three-statement-model-builder/scripts/skill_core_runtime",
"three_statement_core_liquidity_only_review_fix",
)
skill_root = ROOT / "skills" / "three-statement-model-builder"
plan = json.loads((skill_root / "assets" / "plan_template.json").read_text())
plan["source_basis"][1]["evidence_label"] = "source_reported"
plan["source_basis"][1]["confidence"] = "medium"
plan["source_basis"][1]["covers"] = [
cover for cover in plan["source_basis"][1]["covers"] if cover != "debt"
] + ["liquidity"]
normalized = core.normalize_plan(plan, skill_root)
scenarios = core.run_scenarios(normalized)
_hard_failures, warnings, _checks = core.evaluate_hard_failures_and_warnings(
normalized, scenarios
)
warning_codes = {warning["code"] for warning in warnings}
self.assertIn("LIQUIDITY_COVENANT_SUPPORT_UNVALIDATED", warning_codes)
def test_three_statement_debt_free_plan_does_not_require_debt_support(self) -> None:
core = load_runtime_module(
"skills/three-statement-model-builder/scripts/skill_core_runtime",
"three_statement_core_debt_free_review_fix",
)
skill_root = ROOT / "skills" / "three-statement-model-builder"
plan = json.loads((skill_root / "assets" / "plan_template.json").read_text())
plan["source_basis"][1]["evidence_label"] = "source_reported"
plan["source_basis"][1]["confidence"] = "medium"
plan["source_basis"][1]["covers"] = [
cover for cover in plan["source_basis"][1]["covers"] if cover != "debt"
]
plan["historicals"]["income_statement"]["FY2025"]["interest"] = 0
plan["historicals"]["balance_sheet"]["FY2025"]["debt"] = 0
plan["historicals"]["balance_sheet"]["FY2025"]["retained_earnings"] = 75
plan["historicals"]["debt_schedule"]["FY2025"].update(
{"beginning_debt": 0, "draws": 0, "repayments": 0, "ending_debt": 0}
)
plan["debt"].update(
{
"beginning_debt": 0,
"beginning_revolver_drawn": 0,
"revolver_commitment": 0,
"mandatory_amortization": {},
"optional_draws": {},
"interest_rate": {},
"cash_sweep": {"min_cash": 0, "sweep_pct": 0},
"covenants": {},
}
)
normalized = core.normalize_plan(plan, skill_root)
scenarios = core.run_scenarios(normalized)
hard_failures, warnings, _checks = core.evaluate_hard_failures_and_warnings(
normalized, scenarios
)
warning_codes = {warning["code"] for warning in warnings}
self.assertNotIn("LIQUIDITY_COVENANT_SUPPORT_UNVALIDATED", warning_codes)
self.assertNotEqual(core.model_status(hard_failures, warnings, normalized), "screen-grade")
def test_three_statement_modeled_covenants_still_require_support(self) -> None:
core = load_runtime_module(
"skills/three-statement-model-builder/scripts/skill_core_runtime",
"three_statement_core_modeled_covenant_review_fix",
)
skill_root = ROOT / "skills" / "three-statement-model-builder"
plan = json.loads((skill_root / "assets" / "plan_template.json").read_text())
plan["source_basis"][1]["evidence_label"] = "source_reported"
plan["source_basis"][1]["confidence"] = "medium"
plan["debt"]["covenants"] = {"min_liquidity": 5}
normalized = core.normalize_plan(plan, skill_root)
scenarios = core.run_scenarios(normalized)
_hard_failures, warnings, _checks = core.evaluate_hard_failures_and_warnings(
normalized, scenarios
)
warning_codes = {warning["code"] for warning in warnings}
self.assertIn("LIQUIDITY_COVENANT_SUPPORT_UNVALIDATED", warning_codes)
if __name__ == "__main__":
unittest.main()
SHA-256: 60efa694e04a50649cfcb1cf6302e7d6e084ed04a65ec4b7d0df37dbd2607617