Files
vrobbler/tests/workouts_tests/test_models.py

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