test: cover exercise label reconciliation

This commit is contained in:
fy59 2026-09-09 04:08:43 +02:00
parent 56535704ca
commit f4271c9f3e
2 changed files with 58 additions and 2 deletions

View file

@ -1571,7 +1571,32 @@ class TrainlogRepositoryDraftTest {
assertEquals(listOf("sxe_max_pec", "sxe_max_rear"), detail.exercises.map { it.entryId }) assertEquals(listOf("sxe_max_pec", "sxe_max_rear"), detail.exercises.map { it.entryId })
assertEquals(listOf(101.5, 86.0), detail.exercises.map { it.maxWeightKg }) assertEquals(listOf(101.5, 86.0), detail.exercises.map { it.maxWeightKg })
assertTrue(detail.exercises.all { it.sets.isEmpty() }) 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 { try {
reopened.buildMobileExportJson() reopened.buildMobileExportJson()
fail("Frozen V1 must refuse explicit max data") fail("Frozen V1 must refuse explicit max data")
@ -1585,6 +1610,8 @@ class TrainlogRepositoryDraftTest {
.getJSONArray("exercises") .getJSONArray("exercises")
assertEquals(101.5, exported.getJSONObject(0).getDouble("max_weight_kg"), 0.0) 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(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(0).has("sets"))
assertFalse(exported.getJSONObject(1).has("sets")) assertFalse(exported.getJSONObject(1).has("sets"))
val replay = reopened.applyPcMobileExportV2Json(exportedJson) val replay = reopened.applyPcMobileExportV2Json(exportedJson)

View file

@ -84,7 +84,34 @@ def main():
assert second.returncode == 0, second.stdout + second.stderr assert second.returncode == 0, second.stdout + second.stderr
assert "sessions_skipped=1" in second.stdout 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 resumed["sessions"][0]["exercises"][0]["max_weight_kg"] = 101.5
artifact.write_text(json.dumps(resumed), encoding="utf-8") artifact.write_text(json.dumps(resumed), encoding="utf-8")
update = run(IMPORTER, artifact, "--database", database) update = run(IMPORTER, artifact, "--database", database)
@ -100,6 +127,8 @@ def main():
round_trip = json.loads(exported.read_text(encoding="utf-8")) round_trip = json.loads(exported.read_text(encoding="utf-8"))
values = round_trip["sessions"][0]["exercises"] values = round_trip["sessions"][0]["exercises"]
assert [entry["max_weight_kg"] for entry in values] == [101.5, 86.0] 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) assert all("sets" not in entry and "continuous" not in entry for entry in values)
invalid = copy.deepcopy(payload()) invalid = copy.deepcopy(payload())