import pytest from visualizers.report_generator import ReportGenerator @pytest.fixture def report_generator(): return ReportGenerator() def _get_base_context(): """Provides a minimal, valid context for rendering.""" return { "workout": { "metadata": { "sport": "Cycling", "sub_sport": "Road", "start_time": "2024-01-01 10:00:00", "total_duration": 120, "total_distance_km": 5.0, "avg_speed_kmh": 25.0, "avg_hr": 150, "avg_power": 200, }, "summary": { "np": 210, "if": 0.8, "tss": 30, }, "zones": {}, "charts": {}, }, "report": { "generated_at": "2024-01-01T12:00:00", "version": "1.0.0", }, } def test_workout_report_renders_minute_section_when_present(report_generator): context = _get_base_context() context["minute_by_minute"] = [ { "minute_index": 0, "distance_km": 0.5, "avg_speed_kmh": 30.0, "avg_cadence": 90, "avg_hr": 140, "max_hr": 145, "avg_gradient": 1.0, "elevation_change": 5, "avg_real_power": 210, "avg_power_estimate": None, } ] # Test HTML html_output = report_generator.generate_workout_report(context, None, "html") assert "

Minute-by-Minute Breakdown

" in html_output assert "Minute" in html_output assert "0.50" in html_output # distance_km assert "30.0" in html_output # avg_speed_kmh assert "140" in html_output # avg_hr assert "210" in html_output # avg_real_power # Test Markdown md_output = report_generator.generate_workout_report(context, None, "md") assert "### Minute-by-Minute Breakdown" in md_output assert "| Minute |" in md_output assert "| 0.50 |" in md_output assert "| 30.0 |" in md_output assert "| 140 |" in md_output assert "| 210 |" in md_output def test_workout_report_omits_minute_section_when_absent(report_generator): context = _get_base_context() # Case 1: key is absent context_absent = context.copy() html_output_absent = report_generator.generate_workout_report( context_absent, None, "html" ) assert "

Minute-by-Minute Breakdown

" not in html_output_absent md_output_absent = report_generator.generate_workout_report( context_absent, None, "md" ) assert "### Minute-by-Minute Breakdown" not in md_output_absent # Case 2: key is present but empty context_empty = context.copy() context_empty["minute_by_minute"] = [] html_output_empty = report_generator.generate_workout_report( context_empty, None, "html" ) assert "

Minute-by-Minute Breakdown

" not in html_output_empty md_output_empty = report_generator.generate_workout_report( context_empty, None, "md" ) assert "### Minute-by-Minute Breakdown" not in md_output_empty