File size: 6,225 Bytes
6f38c76
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
"""
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