feat(measure): memorizza tempo di inserimento misura (input_duration_ms)

Colonna nullable su measurements + migration 003, campo opzionale negli
schemi API (create singola e batch), passthrough nel proxy Flask e timer
lato client in task_execute: parte all'attivazione del subtask, si
resetta su auto-advance e navigazione manuale.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-28 14:32:35 +02:00
parent edb7eb382c
commit 3f03ec8ab1
9 changed files with 141 additions and 0 deletions
+53
View File
@@ -55,6 +55,59 @@ class TestCreateMeasurement:
assert data["pass_fail"] in ("pass", "warning", "fail")
assert data["measured_by"] == measurement_tec_user.id
async def test_create_measurement_with_input_duration(
self,
client: AsyncClient,
measurement_tec_user: User,
db_session: AsyncSession,
):
"""input_duration_ms is stored and returned when provided."""
recipe = await create_test_recipe(
db_session, measurement_tec_user.id
)
subtask_id, version_id = await _get_subtask_and_version(
client, measurement_tec_user, recipe.id
)
resp = await client.post(
"/api/measurements/",
headers=auth_headers(measurement_tec_user),
json={
"subtask_id": subtask_id,
"version_id": version_id,
"value": 10.0,
"input_duration_ms": 4250,
},
)
assert resp.status_code == 200
assert resp.json()["input_duration_ms"] == 4250
async def test_create_measurement_without_input_duration(
self,
client: AsyncClient,
measurement_tec_user: User,
db_session: AsyncSession,
):
"""input_duration_ms defaults to null when omitted."""
recipe = await create_test_recipe(
db_session, measurement_tec_user.id
)
subtask_id, version_id = await _get_subtask_and_version(
client, measurement_tec_user, recipe.id
)
resp = await client.post(
"/api/measurements/",
headers=auth_headers(measurement_tec_user),
json={
"subtask_id": subtask_id,
"version_id": version_id,
"value": 10.0,
},
)
assert resp.status_code == 200
assert resp.json()["input_duration_ms"] is None
async def test_measurement_requires_auth(self, client: AsyncClient):
"""Creating measurement without auth returns 401."""
resp = await client.post(