diet-guard/diet_guard/tests
Krzysztof kuhy Rudnicki 8871408b5b perf(cli): publish off-thread so logging a meal returns immediately
`diet-guard log ...` blocked for ~15.5s after every meal. The publish itself
has to happen -- until it lands the phone still believes the slot is unlogged
and nags for it -- but only ~2.5s of that is the 293KB push the phone needs;
the rest is pulling peers' banks, which publishing does not require.

The local write is already durable before the publish starts, so the worst
case is a late publish, which is the trade `_sync_events` already documents
for the event-driven model. Moving it to a worker thread lets the caller
print and return at once. Measured: 15.5s -> 2ms before the prompt comes back.

The thread is deliberately non-daemon: the CLI's output is already flushed,
so the process lingers only as long as the push, and the publish is never
killed halfway. A failure still surfaces, via a callback the caller supplies,
just after its own output rather than in the middle of it.

Deliberately NOT applied to the gate. `diet-guard-gate.service` is
`Type=oneshot`, so systemd reaps the unit the moment the main thread exits
and a background publish would be killed mid-push. The gate keeps calling
`publish_after_log` and waiting, which is correct there -- its publish
already runs after the window is gone, where nobody is waiting on it.

`conftest._isolate_state` follows the rename to
`publish_after_log_detached`; without that every meal-logging test would
reach the network through a newly unpatched seam. Verified with
`scripts/check_patch_targets.py` and by timing the real command against a
temporary data dir, never the live log.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LJ5YnA3CERitQ57HjMu2Qz
2026-08-21 13:22:26 +02:00
..
__init__.py feat(diet_guard): add meal-logging screen-lock gate with trigger fix 2026-06-10 22:32:39 +02:00
_gate_fixtures.py Let the PC gate set the eating window and meal count 2026-08-16 15:02:35 +02:00
_gate_focus_probe.py Split the six Python gate files; guard the fake-tk patch set 2026-08-15 20:08:03 +02:00
_gate_keyboard_probe.py Split the six Python gate files; guard the fake-tk patch set 2026-08-15 20:08:03 +02:00
_gate_layout_probe.py Split the six Python gate files; guard the fake-tk patch set 2026-08-15 20:08:03 +02:00
_gate_measurement.py Split the six Python gate files; guard the fake-tk patch set 2026-08-15 20:08:03 +02:00
_sync_fakes.py Split _sync.py and its tests; extract the gate fixtures from conftest 2026-08-15 18:51:18 +02:00
_tk_fakes_canvas.py Split _state.py and _tk_fakes.py; make the food-log redirect fail closed 2026-08-15 20:21:26 +02:00
_tk_fakes_containers.py Split _state.py and _tk_fakes.py; make the food-log redirect fail closed 2026-08-15 20:21:26 +02:00
_tk_fakes.py Make _FakeTclError subclass the real tkinter.TclError 2026-08-15 20:24:11 +02:00
conftest.py perf(cli): publish off-thread so logging a meal returns immediately 2026-08-21 13:22:26 +02:00
test_averages_report.py Split the last seven Python files; extend the redirect guard to all five paths 2026-08-15 20:37:05 +02:00
test_averages.py Split the last seven Python files; extend the redirect guard to all five paths 2026-08-15 20:37:05 +02:00
test_budget_history_io.py Split the last seven Python files; extend the redirect guard to all five paths 2026-08-15 20:37:05 +02:00
test_budget_history.py Split the last seven Python files; extend the redirect guard to all five paths 2026-08-15 20:37:05 +02:00
test_budget.py Split the last seven Python files; extend the redirect guard to all five paths 2026-08-15 20:37:05 +02:00
test_calendar_averages.py Show weekly and monthly average intake on both devices 2026-08-09 14:59:40 +02:00
test_calendar_view.py Migrate diet_guard to gatelock v0.2.0 per-output locking 2026-07-25 16:56:13 +02:00
test_cli_averages.py Show weekly and monthly average intake on both devices 2026-08-09 14:59:40 +02:00
test_cli_gate.py perf(gate): narrow the pre-lock pull and defer the heavy imports 2026-08-21 12:58:44 +02:00
test_cli_sync.py Migrate sync to shared crdt_sync library (Python + Dart) 2026-07-10 23:49:43 +02:00
test_cli.py perf(cli): publish off-thread so logging a meal returns immediately 2026-08-21 13:22:26 +02:00
test_daystatus.py Split _state.py and _tk_fakes.py; make the food-log redirect fail closed 2026-08-15 20:21:26 +02:00
test_estimator.py Split the last seven Python files; extend the redirect guard to all five paths 2026-08-15 20:37:05 +02:00
test_foodbank_manual.py Split the last seven Python files; extend the redirect guard to all five paths 2026-08-15 20:37:05 +02:00
test_foodbank_rebuild.py Split the last seven Python files; extend the redirect guard to all five paths 2026-08-15 20:37:05 +02:00
test_foodbank.py Split the last seven Python files; extend the redirect guard to all five paths 2026-08-15 20:37:05 +02:00
test_fuzzy.py Extract diet_guard from testsAndMisc as a standalone repo 2026-06-22 12:18:39 +02:00
test_gate_layout_fits.py Fit the meal gate on 1366x768 with a full day logged, and stop the auto-scroll 2026-08-03 16:00:13 +02:00
test_gate_tk_modules.py Make _FakeTclError subclass the real tkinter.TclError 2026-08-15 20:24:11 +02:00
test_gate.py Extract diet_guard from testsAndMisc as a standalone repo 2026-06-22 12:18:39 +02:00
test_gatelock_calendar.py Split the last seven Python files; extend the redirect guard to all five paths 2026-08-15 20:37:05 +02:00
test_gatelock_dashboard.py perf(gate): unfreeze "Fetch from sync" and bound the interactive timeout 2026-08-21 13:07:37 +02:00
test_gatelock_fanout.py Split the three gate test files; assert fake_tk really swaps tkinter 2026-08-15 20:12:13 +02:00
test_gatelock_form.py Split the three gate test files; assert fake_tk really swaps tkinter 2026-08-15 20:12:13 +02:00
test_gatelock_groups.py Split the three gate test files; assert fake_tk really swaps tkinter 2026-08-15 20:12:13 +02:00
test_gatelock_keyboard.py Split the six Python gate files; guard the fake-tk patch set 2026-08-15 20:08:03 +02:00
test_gatelock_mealflow.py Split the three gate test files; assert fake_tk really swaps tkinter 2026-08-15 20:12:13 +02:00
test_gatelock_scheduleedit.py Let the PC gate set the eating window and meal count 2026-08-16 15:02:35 +02:00
test_gatelock.py Split the three gate test files; assert fake_tk really swaps tkinter 2026-08-15 20:12:13 +02:00
test_main.py Extract diet_guard from testsAndMisc as a standalone repo 2026-06-22 12:18:39 +02:00
test_mcp_averages.py Make PC sync event-driven; retire the 15-min timer 2026-08-15 19:21:30 +02:00
test_mcp.py Make PC sync event-driven; retire the 15-min timer 2026-08-15 19:21:30 +02:00
test_meal_schedule_store.py Read the meal schedule from a forward-only history (Python) 2026-08-16 14:28:22 +02:00
test_meal_schedule.py Derive meal slots from an eating window and a meal count 2026-08-16 14:21:12 +02:00
test_portions.py Extract diet_guard from testsAndMisc as a standalone repo 2026-06-22 12:18:39 +02:00
test_resolve.py Extract diet_guard from testsAndMisc as a standalone repo 2026-06-22 12:18:39 +02:00
test_slots.py Read the meal schedule from a forward-only history (Python) 2026-08-16 14:28:22 +02:00
test_state_redirect.py Register the _hmac_key fixture; guard the redirect so it fails locally 2026-08-15 21:19:35 +02:00
test_state_sync.py Split _state.py and _tk_fakes.py; make the food-log redirect fail closed 2026-08-15 20:21:26 +02:00
test_state_today.py Split _state.py and _tk_fakes.py; make the food-log redirect fail closed 2026-08-15 20:21:26 +02:00
test_state.py Split _state.py and _tk_fakes.py; make the food-log redirect fail closed 2026-08-15 20:21:26 +02:00
test_sync_backend.py perf(gate): unfreeze "Fetch from sync" and bound the interactive timeout 2026-08-21 13:07:37 +02:00
test_sync_banks_mirror.py perf(sync): hoist the device listing and stop the curated-bank 404 storm 2026-08-21 13:16:08 +02:00
test_sync_banks.py Split the last seven Python files; extend the redirect guard to all five paths 2026-08-15 20:37:05 +02:00
test_sync_budget.py Sync the meal schedule as sched: fields on the budget record 2026-08-16 14:49:08 +02:00
test_sync_device_id.py perf(sync): hoist the device listing and stop the curated-bank 404 storm 2026-08-21 13:16:08 +02:00
test_sync_events.py perf(cli): publish off-thread so logging a meal returns immediately 2026-08-21 13:22:26 +02:00
test_sync_merge_banks.py Split _sync.py and its tests; extract the gate fixtures from conftest 2026-08-15 18:51:18 +02:00
test_sync_merge_budget.py Split _sync.py and its tests; extract the gate fixtures from conftest 2026-08-15 18:51:18 +02:00
test_sync_merge_schedule.py Sync the meal schedule as sched: fields on the budget record 2026-08-16 14:49:08 +02:00
test_sync_merge.py Split _sync.py and its tests; extract the gate fixtures from conftest 2026-08-15 18:51:18 +02:00
test_sync_pull.py perf(sync): hoist the device listing and stop the curated-bank 404 storm 2026-08-21 13:16:08 +02:00
test_sync_refresh.py perf(gate): narrow the pre-lock pull and defer the heavy imports 2026-08-21 12:58:44 +02:00
test_sync.py Split the last seven Python files; extend the redirect guard to all five paths 2026-08-15 20:37:05 +02:00
test_test_guard.py Remove unused features; fix reminder false alarms; share all state 2026-07-26 16:39:52 +02:00