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(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)

View file

@ -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())