feat: smart recreate and dedupe

This commit is contained in:
2026-06-16 19:36:12 +02:00
parent 2e25e7eb34
commit 9141a09b56
4 changed files with 100 additions and 3 deletions

View File

@ -216,6 +216,7 @@ def test_sync_recreates_date_name_match_with_different_steps(tmp_path, monkeypat
assert result["created"] == 1
assert garmin.client.unscheduled == ["s1"]
assert garmin.client.deleted == ["w-old"]
assert garmin.client.scheduled == [("w1", "2026-06-16")]
@ -295,6 +296,7 @@ def test_current_mapping_recreates_when_calendar_entry_is_missing(
assert garmin.client.uploads
assert garmin.client.scheduled == [("w1", "2026-06-16")]
assert garmin.client.unscheduled == []
assert garmin.client.deleted == ["w-old"]
mapping = repo.get_clone_mapping("2026-06-16")
assert mapping is not None
assert mapping["clone_workout_id"] == "w1"

View File

@ -60,6 +60,44 @@ def test_workout_steps_equal_ignores_ids_but_compares_steps() -> None:
assert not workout_steps_equal(left, right)
def test_workout_steps_equal_ignores_garmin_upload_defaults() -> None:
left = build_dummy_cycling_workout("Left")
right = build_dummy_cycling_workout("Right")
repeat = right["workoutSegments"][0]["workoutSteps"][1]
repeat["stepOrder"] = 2
repeat["childStepId"] = 1
repeat["smartRepeat"] = False
for idx, step in enumerate(right["workoutSegments"][0]["workoutSteps"], start=1):
step["stepId"] = 1000 + idx
step["stepOrder"] = idx
step["equipmentType"] = {
"displayOrder": 0,
"equipmentTypeId": 0,
"equipmentTypeKey": None,
}
step["strokeType"] = {
"displayOrder": 0,
"strokeTypeId": 0,
"strokeTypeKey": None,
}
for idx, step in enumerate(repeat["workoutSteps"], start=3):
step["childStepId"] = 1
step["stepId"] = 1000 + idx
step["stepOrder"] = idx
step["equipmentType"] = {
"displayOrder": 0,
"equipmentTypeId": 0,
"equipmentTypeKey": None,
}
step["strokeType"] = {
"displayOrder": 0,
"strokeTypeId": 0,
"strokeTypeKey": None,
}
assert workout_steps_equal(left, right)
def test_existing_clone_names_filters_by_prefix_and_date() -> None:
names = existing_clone_names(
[