sync conflict detection + wiremock tests
two changes in one commit: the sync worker now rejects stale pushes, and the Rust sync client has a real test suite.
conflict detection
if the client sends a snapshotId with its push, the worker checks it against the current server snapshot. if they don’t match, someone else pushed in between, and you get a 409 back with the current server snapshot ID and a message to pull first.
the snapshotId used to be passed through from the client or generated fresh. now it’s always generated server-side. the client’s snapshotId is only used for the conflict check, never as the new snapshot. small change, but it means two clients can’t accidentally create the same snapshot ID.
last_sync is now a Mutex
WorkerSyncProvider.last_sync went from Option<DateTime> to Mutex<Option<DateTime>>. it gets updated after both push and pull succeed. this matters because SyncProvider is behind an Arc in the real app, and last_sync needs interior mutability. also added #[serde(rename_all = "camelCase")] on SyncSnapshot so the JSON fields match what the worker actually sends.
wiremock tests
238 lines of new tests using wiremock to mock the HTTP worker. each test spins up a local mock server, registers response expectations, and exercises the WorkerSyncProvider against it. no real network, no real worker, fully deterministic.
covers: connect (200 and 500), push (returns snapshot, forwards snapshot ID, handles 500, handles 409 conflict), pull (returns notes/embeddings/positions, sends since query param), status (parses all fields), last_sync (none initially, updated after push).
the with_rt() helper builds a single-threaded tokio runtime with IO enabled for each test since wiremock needs async + network.
the TODO
“Cloud sync” is checked off. one item left: Dioxus UI.
aaaaaaaaa
Comments 0
No comments yet. Be the first!
Sign in to join the conversation.