ui-regression-testing-2 / report_generator.py
riazmo's picture
Upload 61 files
6f38c76 verified
"""
Report Generator
Generates JSON and Markdown reports from visual difference analysis
"""
from typing import Dict, Any
import json
import os
from datetime import datetime
class ReportGenerator:
"""Generates comprehensive reports from analysis results."""
@staticmethod
def generate_json_report(state: 'WorkflowState', output_path: str) -> bool:
"""Generate JSON report."""
try:
# Prepare report data
report = {
"metadata": {
"execution_id": state.execution_id,
"timestamp": datetime.now().isoformat(),
"figma_file": state.figma_file_key,
"website_url": state.website_url,
"status": state.status
},
"summary": {
"total_differences": len(state.visual_differences),
"high_severity": len([d for d in state.visual_differences if d.severity == "High"]),
"medium_severity": len([d for d in state.visual_differences if d.severity == "Medium"]),
"low_severity": len([d for d in state.visual_differences if d.severity == "Low"]),
"similarity_score": state.similarity_score
},
"differences": []
}
# Add differences
for diff in state.visual_differences:
diff_dict = {
"name": diff.name,
"category": diff.category,
"severity": diff.severity,
"description": diff.description,
"viewport": diff.viewport,
"detected_by": diff.detected_by if hasattr(diff, 'detected_by') else "Unknown",
"location": diff.location if hasattr(diff, 'location') else {}
}
report["differences"].append(diff_dict)
# Write report
os.makedirs(os.path.dirname(output_path), exist_ok=True)
with open(output_path, 'w') as f:
json.dump(report, f, indent=2)
return True
except Exception as e:
print(f"Error generating JSON report: {str(e)}")
return False
@staticmethod
def generate_markdown_report(state: 'WorkflowState', output_path: str) -> bool:
"""Generate Markdown report."""
try:
lines = []
lines.append("# 🎨 UI Regression Testing Report\n")
lines.append(f"**Generated**: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
lines.append(f"**Execution ID**: {state.execution_id}\n")
lines.append(f"**Website**: {state.website_url}\n")
lines.append(f"**Figma File**: {state.figma_file_key}\n\n")
# Summary
lines.append("## πŸ“Š Summary\n")
lines.append(f"- **Similarity Score**: {state.similarity_score:.1f}/100")
lines.append(f"- **Total Differences**: {len(state.visual_differences)}")
lines.append(f"- πŸ”΄ **High Severity**: {len([d for d in state.visual_differences if d.severity == 'High'])}")
lines.append(f"- 🟠 **Medium Severity**: {len([d for d in state.visual_differences if d.severity == 'Medium'])}")
lines.append(f"- 🟒 **Low Severity**: {len([d for d in state.visual_differences if d.severity == 'Low'])}\n\n")
# Differences by severity
high_diffs = [d for d in state.visual_differences if d.severity == "High"]
medium_diffs = [d for d in state.visual_differences if d.severity == "Medium"]
low_diffs = [d for d in state.visual_differences if d.severity == "Low"]
if high_diffs:
lines.append("## πŸ”΄ High Severity Issues\n")
for i, diff in enumerate(high_diffs, 1):
lines.append(f"### {i}. {diff.name}")
lines.append(f"- **Category**: {diff.category}")
lines.append(f"- **Description**: {diff.description}")
lines.append(f"- **Viewport**: {diff.viewport}\n")
if medium_diffs:
lines.append("## 🟠 Medium Severity Issues\n")
for i, diff in enumerate(medium_diffs, 1):
lines.append(f"### {i}. {diff.name}")
lines.append(f"- **Category**: {diff.category}")
lines.append(f"- **Description**: {diff.description}")
lines.append(f"- **Viewport**: {diff.viewport}\n")
if low_diffs:
lines.append("## 🟒 Low Severity Issues\n")
for i, diff in enumerate(low_diffs, 1):
lines.append(f"### {i}. {diff.name}")
lines.append(f"- **Category**: {diff.category}")
lines.append(f"- **Description**: {diff.description}")
lines.append(f"- **Viewport**: {diff.viewport}\n")
# Write report
os.makedirs(os.path.dirname(output_path), exist_ok=True)
with open(output_path, 'w') as f:
f.write("\n".join(lines))
return True
except Exception as e:
print(f"Error generating Markdown report: {str(e)}")
return False
@staticmethod
def generate_all_reports(state: 'WorkflowState', output_dir: str) -> bool:
"""Generate all report types."""
try:
os.makedirs(output_dir, exist_ok=True)
# Generate JSON report
json_path = os.path.join(output_dir, "report.json")
ReportGenerator.generate_json_report(state, json_path)
# Generate Markdown report
md_path = os.path.join(output_dir, "report_summary.md")
ReportGenerator.generate_markdown_report(state, md_path)
return True
except Exception as e:
print(f"Error generating reports: {str(e)}")
return False