#!/usr/bin/env python3
"""
HTML Coverage Report Enhancer
Post-processes pytest-cov HTML reports to add branch coverage visualization,
color coding, and summary dashboard.
Usage:
python backend/tests/scripts/enhance_html_coverage.py [--html-path PATH]
Examples:
python backend/tests/scripts/enhance_html_coverage.py
python backend/tests/scripts/enhance_html_coverage.py --html-path custom/htmlcov/index.html
"""
import argparse
import re
from pathlib import Path
from typing import Optional
def enhance_html_report(html_path: Path) -> bool:
"""
Enhance HTML coverage report with branch visualization and dashboard.
Args:
html_path: Path to htmlcov/index.html
Returns:
True if successful, False otherwise
"""
if not html_path.exists():
print(f"Error: HTML report not found: {html_path}")
return False
# Read HTML content
with open(html_path, 'r') as f:
html_content = f.read()
# Enhance the HTML
enhanced_html = add_color_coding(html_content)
enhanced_html = add_dashboard(enhanced_html)
enhanced_html = add_branch_toggle(enhanced_html)
# Write enhanced version
with open(html_path, 'w') as f:
f.write(enhanced_html)
print(f"Enhanced HTML report: {html_path}")
return True
def add_color_coding(html_content: str) -> str:
"""
Add CSS for coverage color coding.
Args:
html_content: Original HTML content
Returns:
HTML with added color coding CSS
"""
css_injection = """
"""
# Insert CSS before closing tag
if "" in html_content:
return html_content.replace("", css_injection + "")
else:
return css_injection + html_content
def add_dashboard(html_content: str) -> str:
"""
Add summary dashboard at top of HTML report.
Args:
html_content: Original HTML content
Returns:
HTML with added dashboard
"""
dashboard_html = """
Coverage Summary Dashboard
Overall Coverage
Loading...
Branch Coverage
Loading...
Modules Tested
Loading...
Uncovered Lines
Loading...
"""
# Insert dashboard after opening tag
if "" in html_content:
return html_content.replace("", "" + dashboard_html)
elif "]*>', r'\g<0>' + dashboard_html, html_content, count=1)
else:
return dashboard_html + html_content
def add_branch_toggle(html_content: str) -> str:
"""
Add JavaScript for branch visibility toggle.
Args:
html_content: Original HTML content
Returns:
HTML with added branch toggle functionality
"""
toggle_script = """
"""
# Insert before closing tag
if "" in html_content:
return html_content.replace("", toggle_script + "")
else:
return html_content + toggle_script
def post_process_coverage_html() -> bool:
"""
Post-process all HTML coverage files to add enhancements.
Returns:
True if successful
"""
backend_dir = Path(__file__).parent.parent
htmlcov_dir = backend_dir / "coverage_reports" / "html"
if not htmlcov_dir.exists():
print(f"HTML coverage directory not found: {htmlcov_dir}")
return False
# Enhance index.html
index_html = htmlcov_dir / "index.html"
if index_html.exists():
enhance_html_report(index_html)
else:
print(f"Index HTML not found: {index_html}")
return False
print(f"\nEnhanced coverage report available at: file://{index_html}")
return True
def main():
"""Main execution entry point."""
parser = argparse.ArgumentParser(
description="Enhance HTML coverage reports with branch visualization"
)
parser.add_argument(
"--html-path",
type=Path,
default=None,
help="Path to htmlcov/index.html (default: backend/tests/coverage_reports/html/index.html)"
)
args = parser.parse_args()
if args.html_path:
# Enhance specific HTML file
success = enhance_html_report(args.html_path)
else:
# Enhance default coverage report
success = post_process_coverage_html()
return 0 if success else 1
if __name__ == "__main__":
import sys
sys.exit(main())