121 lines
4.0 KiB
Python
121 lines
4.0 KiB
Python
from workouts.models import (
|
|
Exercise,
|
|
WorkoutLogData,
|
|
WorkoutRoutine,
|
|
WorkoutSetEntry,
|
|
)
|
|
from workouts.utils import (
|
|
display_value,
|
|
display_weight,
|
|
kg_to_lbs,
|
|
lbs_to_kg,
|
|
normalize_weight,
|
|
)
|
|
|
|
|
|
class TestWeightUtils:
|
|
def test_lbs_to_kg(self):
|
|
assert lbs_to_kg(1) == 0.45
|
|
assert lbs_to_kg(100) == 45.36
|
|
|
|
def test_kg_to_lbs(self):
|
|
assert kg_to_lbs(1) == 2.2
|
|
assert kg_to_lbs(45.36) == 100.0
|
|
|
|
def test_normalize_weight_metric(self):
|
|
assert normalize_weight("50", "metric") == 50.0
|
|
|
|
def test_normalize_weight_imperial(self):
|
|
assert normalize_weight("45", "imperial") == lbs_to_kg(45)
|
|
|
|
def test_normalize_weight_empty(self):
|
|
assert normalize_weight("", "metric") is None
|
|
assert normalize_weight(None, "metric") is None
|
|
|
|
def test_display_value(self):
|
|
assert display_value(50, "metric") == 50.0
|
|
assert display_value(45.36, "imperial") == 100.0
|
|
|
|
def test_display_weight(self):
|
|
assert display_weight(50, "metric") == "50.0 kg"
|
|
assert display_weight(45.36, "imperial") == "100.0 lbs"
|
|
|
|
|
|
class TestExerciseModel:
|
|
def test_str(self, exercise):
|
|
assert str(exercise) == "Deadlift"
|
|
|
|
def test_find_or_create(self, exercise):
|
|
found = Exercise.find_or_create("deadlift")
|
|
assert found.id == exercise.id
|
|
new = Exercise.find_or_create("New Exercise")
|
|
assert new.id != exercise.id
|
|
|
|
|
|
class TestWorkoutRoutineModel:
|
|
def test_media_type_label(self, workout_routine):
|
|
assert workout_routine.media_type_label == "Workout"
|
|
|
|
def test_find_or_create(self, workout_routine):
|
|
found = WorkoutRoutine.find_or_create("test routine")
|
|
assert found.id == workout_routine.id
|
|
|
|
def test_logdata_cls(self, workout_routine):
|
|
assert workout_routine.logdata_cls is WorkoutLogData
|
|
|
|
|
|
class TestWorkoutLogData:
|
|
def test_as_html_metric(self, workout_scrobble, exercise):
|
|
html = workout_scrobble.logdata.as_html()
|
|
assert "Deadlift" in html
|
|
assert "3 x 10" in html
|
|
assert "50.0 kg" in html
|
|
|
|
def test_as_html_imperial(self, workout_scrobble, exercise):
|
|
html = workout_scrobble.logdata.as_html(units="imperial")
|
|
assert "110.2 lbs" in html
|
|
|
|
def test_workout_list(self, workout_scrobble):
|
|
assert "Deadlift" in workout_scrobble.logdata.workout_list
|
|
|
|
def test_from_log_dict_roundtrip(self, workout_scrobble):
|
|
log_dict = workout_scrobble.log
|
|
data = WorkoutLogData.from_log_dict(log_dict)
|
|
assert (
|
|
data["workouts"][0]["exercise_id"]
|
|
== workout_scrobble.log["workouts"][0]["exercise_id"]
|
|
)
|
|
restored = WorkoutLogData(**data)
|
|
assert restored.workouts[0]["sets"] == 3
|
|
assert restored.workouts[0]["weight_kg"] == 50.0
|
|
entry = WorkoutSetEntry(**restored.workouts[0])
|
|
assert entry.sets == 3
|
|
assert entry.weight_kg == 50.0
|
|
|
|
def test_override_fields(self):
|
|
fields = WorkoutLogData.override_fields()
|
|
assert "workouts" in fields
|
|
assert "with_people_ids" in fields
|
|
|
|
def test_prepare_form_metric(self, logdata):
|
|
form = WorkoutLogData.form()()
|
|
WorkoutLogData.prepare_form(form, "metric")
|
|
assert form.fields["workouts"].units == "metric"
|
|
assert form.fields["bodyweight_kg"].label == "Bodyweight (kg)"
|
|
|
|
def test_prepare_form_imperial(self, logdata):
|
|
form = WorkoutLogData.form()()
|
|
WorkoutLogData.prepare_form(form, "imperial")
|
|
assert form.fields["workouts"].units == "imperial"
|
|
assert form.fields["bodyweight_kg"].label == "Bodyweight (lbs)"
|
|
|
|
def test_normalize_form_data_imperial(self, logdata):
|
|
data = {"bodyweight_kg": 180.5}
|
|
WorkoutLogData.normalize_form_data(data, "imperial")
|
|
assert data["bodyweight_kg"] == lbs_to_kg(180.5)
|
|
|
|
def test_normalize_form_data_metric_no_change(self, logdata):
|
|
data = {"bodyweight_kg": 80.0}
|
|
WorkoutLogData.normalize_form_data(data, "metric")
|
|
assert data["bodyweight_kg"] == 80.0
|