From f4271c9f3e84c300ab91ad5caac4b25940ae99bd Mon Sep 17 00:00:00 2001 From: fy59 Date: Wed, 9 Sep 2026 04:08:43 +0200 Subject: [PATCH] test: cover exercise label reconciliation --- .../data/TrainlogRepositoryDraftTest.kt | 29 ++++++++++++++++- tests/test_max_sync.py | 31 ++++++++++++++++++- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/android/app/src/test/java/com/labfytools/trainlog/data/TrainlogRepositoryDraftTest.kt b/android/app/src/test/java/com/labfytools/trainlog/data/TrainlogRepositoryDraftTest.kt index 0ce7a6f..ab28174 100644 --- a/android/app/src/test/java/com/labfytools/trainlog/data/TrainlogRepositoryDraftTest.kt +++ b/android/app/src/test/java/com/labfytools/trainlog/data/TrainlogRepositoryDraftTest.kt @@ -1571,7 +1571,32 @@ class TrainlogRepositoryDraftTest { assertEquals(listOf("sxe_max_pec", "sxe_max_rear"), detail.exercises.map { it.entryId }) assertEquals(listOf(101.5, 86.0), detail.exercises.map { it.maxWeightKg }) assertTrue(detail.exercises.all { it.sets.isEmpty() }) - assertEquals(2, reopened.listLatestExerciseMaxima().size) + val renamed = reopened.editExercise( + ExerciseEditInput( + rearDelt.exerciseId, + "Rear Delt", + rearDelt.recordingMode, + rearDelt.trackingMode, + rearDelt.dataFields, + ), + ) + assertTrue(renamed is EditExerciseResult.Saved) + assertEquals(rearDelt.exerciseId, (renamed as EditExerciseResult.Saved).exercise.exerciseId) + assertEquals(2, reopened.listExercises().size) + val renamedDetail = reopened.getSessionDetail(sessionId)!! + assertEquals("Rear Delt", renamedDetail.exercises[1].exerciseName) + assertEquals("sxe_max_rear", renamedDetail.exercises[1].entryId) + assertEquals(86.0, renamedDetail.exercises[1].maxWeightKg!!, 0.0) + assertEquals("rear_delt_pec_fly", renamedDetail.exercises[1].equipmentId) + val latestMaxima = reopened.listLatestExerciseMaxima() + assertEquals(2, latestMaxima.size) + assertTrue( + latestMaxima.any { + it.exerciseId == rearDelt.exerciseId && + it.exerciseName == "Rear Delt" && + it.maxWeightKg == 86.0 + }, + ) try { reopened.buildMobileExportJson() fail("Frozen V1 must refuse explicit max data") @@ -1585,6 +1610,8 @@ class TrainlogRepositoryDraftTest { .getJSONArray("exercises") assertEquals(101.5, exported.getJSONObject(0).getDouble("max_weight_kg"), 0.0) assertEquals(86.0, exported.getJSONObject(1).getDouble("max_weight_kg"), 0.0) + assertEquals(rearDelt.exerciseId, exported.getJSONObject(1).getString("exercise_id")) + assertEquals("Rear Delt", exported.getJSONObject(1).getString("name")) assertFalse(exported.getJSONObject(0).has("sets")) assertFalse(exported.getJSONObject(1).has("sets")) val replay = reopened.applyPcMobileExportV2Json(exportedJson) diff --git a/tests/test_max_sync.py b/tests/test_max_sync.py index 3a34d1d..430e86e 100644 --- a/tests/test_max_sync.py +++ b/tests/test_max_sync.py @@ -84,7 +84,34 @@ def main(): assert second.returncode == 0, second.stdout + second.stderr assert "sessions_skipped=1" in second.stdout - resumed = payload() + renamed = payload() + renamed["exercises"][1]["name"] = "Rear Delt" + renamed["sessions"][0]["exercises"][1]["name"] = "Rear Delt" + artifact.write_text(json.dumps(renamed), encoding="utf-8") + rename_result = run(IMPORTER, artifact, "--database", database) + assert rename_result.returncode == 0, rename_result.stdout + rename_result.stderr + assert "exercises_reconciled=1" in rename_result.stdout + assert "sessions_skipped=1" in rename_result.stdout + connection = sqlite3.connect(database) + assert connection.execute( + "SELECT exercise_id,name FROM exercises WHERE exercise_id='ex_rear'" + ).fetchone() == ("ex_rear", "Rear Delt") + assert connection.execute("SELECT count(*) FROM exercises").fetchone()[0] == 2 + assert connection.execute("SELECT count(*) FROM sessions").fetchone()[0] == 1 + assert connection.execute( + "SELECT se.entry_id,se.equipment_id,mr.max_weight_kg " + "FROM max_results mr JOIN session_exercises se " + "ON se.id=mr.session_exercise_row_id ORDER BY se.position" + ).fetchall() == [ + ("sxe_pec", "rear_delt_pec_fly", 100.0), + ("sxe_rear", "rear_delt_pec_fly", 86.0), + ] + connection.close() + rename_replay = run(IMPORTER, artifact, "--database", database) + assert rename_replay.returncode == 0, rename_replay.stdout + rename_replay.stderr + assert "sessions_skipped=1" in rename_replay.stdout + + resumed = copy.deepcopy(renamed) resumed["sessions"][0]["exercises"][0]["max_weight_kg"] = 101.5 artifact.write_text(json.dumps(resumed), encoding="utf-8") update = run(IMPORTER, artifact, "--database", database) @@ -100,6 +127,8 @@ def main(): round_trip = json.loads(exported.read_text(encoding="utf-8")) values = round_trip["sessions"][0]["exercises"] assert [entry["max_weight_kg"] for entry in values] == [101.5, 86.0] + assert values[1]["exercise_id"] == "ex_rear" + assert values[1]["name"] == "Rear Delt" assert all("sets" not in entry and "continuous" not in entry for entry in values) invalid = copy.deepcopy(payload())