mirror of
https://github.com/sstent/FitTrack_ReportGenerator.git
synced 2026-01-26 00:52:03 +00:00
This commit introduces the initial version of the FitTrack Report Generator, a FastAPI application for analyzing workout files. Key features include: - Parsing of FIT, TCX, and GPX workout files. - Analysis of power, heart rate, speed, and elevation data. - Generation of summary reports and charts. - REST API for single and batch workout analysis. The project structure has been set up with a `src` directory for core logic, an `api` directory for the FastAPI application, and a `tests` directory for unit, integration, and contract tests. The development workflow is configured to use Docker and modern Python tooling.
84 lines
2.8 KiB
Python
84 lines
2.8 KiB
Python
from datetime import datetime, timedelta
|
|
import pandas as pd
|
|
from src.core.workout_data import WorkoutData, WorkoutMetadata, PowerData, HeartRateData, SpeedData, ElevationData
|
|
|
|
def test_workout_metadata_creation():
|
|
metadata = WorkoutMetadata(
|
|
start_time=datetime(2023, 1, 1, 10, 0, 0),
|
|
duration=timedelta(hours=1),
|
|
device="Garmin",
|
|
file_type="FIT"
|
|
)
|
|
assert metadata.start_time == datetime(2023, 1, 1, 10, 0, 0)
|
|
assert metadata.duration == timedelta(hours=1)
|
|
assert metadata.device == "Garmin"
|
|
assert metadata.file_type == "FIT"
|
|
|
|
def test_power_data_creation():
|
|
power_data = PowerData(
|
|
raw_power_stream=[100.0, 150.0, 200.0],
|
|
average_power=150.0,
|
|
normalized_power=160.0,
|
|
intensity_factor=0.8,
|
|
training_stress_score=75.0,
|
|
zone_distribution={"Zone 2": "30min"}
|
|
)
|
|
assert power_data.average_power == 150.0
|
|
assert power_data.raw_power_stream == [100.0, 150.0, 200.0]
|
|
|
|
def test_heart_rate_data_creation():
|
|
hr_data = HeartRateData(
|
|
raw_hr_stream=[120, 130, 140],
|
|
average_hr=130.0,
|
|
max_hr=180,
|
|
zone_distribution={"Zone 3": "20min"}
|
|
)
|
|
assert hr_data.average_hr == 130.0
|
|
assert hr_data.raw_hr_stream == [120, 130, 140]
|
|
|
|
def test_speed_data_creation():
|
|
speed_data = SpeedData(
|
|
raw_speed_stream=[5.0, 6.0, 7.0],
|
|
average_speed=6.0,
|
|
max_speed=8.0
|
|
)
|
|
assert speed_data.average_speed == 6.0
|
|
|
|
def test_elevation_data_creation():
|
|
elevation_data = ElevationData(
|
|
raw_elevation_stream=[100.0, 110.0, 105.0],
|
|
total_ascent=20.0,
|
|
total_descent=15.0,
|
|
max_elevation=110.0,
|
|
min_elevation=95.0
|
|
)
|
|
assert elevation_data.total_ascent == 20.0
|
|
|
|
def test_workout_data_creation():
|
|
metadata = WorkoutMetadata(
|
|
start_time=datetime(2023, 1, 1, 10, 0, 0),
|
|
duration=timedelta(hours=1),
|
|
device="Garmin",
|
|
file_type="FIT"
|
|
)
|
|
power_data = PowerData(average_power=150.0)
|
|
hr_data = HeartRateData(average_hr=130.0)
|
|
speed_data = SpeedData(average_speed=25.0)
|
|
elevation_data = ElevationData(total_ascent=100.0)
|
|
time_series = pd.DataFrame({"timestamp": [datetime(2023, 1, 1, 10, 0, 0)], "power": [150]})
|
|
|
|
workout_data = WorkoutData(
|
|
metadata=metadata,
|
|
time_series_data=time_series,
|
|
power_data=power_data,
|
|
heart_rate_data=hr_data,
|
|
speed_data=speed_data,
|
|
elevation_data=elevation_data
|
|
)
|
|
|
|
assert workout_data.metadata.file_type == "FIT"
|
|
assert workout_data.power_data.average_power == 150.0
|
|
assert workout_data.heart_rate_data.average_hr == 130.0
|
|
assert workout_data.speed_data.average_speed == 25.0
|
|
assert workout_data.elevation_data.total_ascent == 100.0
|
|
assert not workout_data.time_series_data.empty |