super-productivity/e2e/tests
Johannes Millan 654f4d80ee fix(sync): break iOS WebDAV conflict-dialog loop (#7339)
Two compounding bugs trapped iOS WebDAV users in a per-minute conflict
dialog that no button could resolve:

1. FileBasedSyncAdapter's snapshotReplacement heuristic re-fires
   gapDetected on every sync from a non-writing client (clientId \!=
   excludeClient is true forever), so the download keeps coming back
   with snapshotState and OperationLogSyncService keeps throwing
   LocalDataConflictError despite the local clock already dominating
   the remote snapshot. Skip hydration and conflict when
   compareVectorClocks(local, remote) is EQUAL or GREATER_THAN, gated
   on both clocks being non-empty so a fresh client still hydrates a
   legacy/clockless snapshot.

2. SyncWrapperService._openConflictDialog$ filtered undefined out of
   the afterClosed() stream, so a programmatic close (iOS WebView
   lifecycle, re-entry) collapsed the observable and firstValueFrom
   threw EmptyError — the user's Use Local/Use Remote/Cancel click
   never reached the resolution branches. Drop the filter so undefined
   flows through to the existing cancellation path.

The dominate-skip deliberately does NOT append result.newOps to the
op log: VectorClockService.getEntityFrontier is last-write-wins by
seq, and writing historical remote ops at the current tail would
regress per-entity frontiers and let future LWW resolution overwrite
local data. Trade-off documented inline.

Adds an adapter-level integration reproducer that asserts gapDetected
re-fires forever for a non-writing client (the upstream loop trigger),
a 3-client WebDAV e2e that reproduces the loop end-to-end against a
real provider, plus service-level tests for the dominate-skip, the
empty-clock guard, the concurrent-clock conservative path, and
consecutive-sync loop prevention.
2026-04-25 22:36:14 +02:00
..
add-task-bar refactor(e2e): extract ensureGlobalAddTaskBarOpen helper to reduce code duplication 2026-01-16 13:35:59 +01:00
app-features feat(tasks): replace drag handle with done toggle circle and improve mobile UX 2026-03-22 18:14:16 +01:00
autocomplete Merge branch 'master' into feat/operation-logs 2026-01-03 18:51:51 +01:00
boards test(e2e): add comprehensive E2E test coverage for core features 2026-01-12 15:11:27 +01:00
break test(e2e): use correct route /#/tag/TODAY/tasks instead of /#/tag/TODAY 2026-03-15 18:48:00 +01:00
daily-summary refactor(e2e): replace waitForTimeout with condition-based waits 2026-01-03 15:29:38 +01:00
focus-mode test(e2e): fix skip break button selector in pomodoro tests 2026-03-03 20:14:54 +01:00
import-export fix(tasks): handle markdown links in short syntax URL extraction (#7032) 2026-03-30 23:01:48 +02:00
issue-provider-panel test(e2e): fix flaky dialog interactions by scoping to container 2026-01-26 19:48:12 +01:00
keyboard test(e2e): add comprehensive E2E test coverage for core features 2026-01-12 15:11:27 +01:00
menu chore: address code review feedback 2026-01-15 10:57:43 +01:00
migration fix(backup): move shared timestamp util into electron/ for snap packaging 2026-04-22 16:14:56 +02:00
navigation test(e2e): use correct route /#/tag/TODAY/tasks instead of /#/tag/TODAY 2026-03-15 18:48:00 +01:00
notes fix(note): linkify URLs in locked notes so markdown links stay clickable 2026-04-16 19:47:52 +02:00
performance test(e2e): disable failing for now 2025-09-21 00:59:11 +02:00
planner test(e2e): use correct route /#/tag/TODAY/tasks instead of /#/tag/TODAY 2026-03-15 18:48:00 +01:00
plugins fix(lint): resolve prettier formatting and lint errors from CI run 2026-03-24 18:08:30 +01:00
project test(e2e): fix done-toggle selector to use element instead of class 2026-03-24 16:25:42 +01:00
recurring fix(task-repeat-cfg): preserve planned date when converting past-dated task to recurring (#7344) 2026-04-24 17:57:38 +02:00
reminders refactor(reminders): address code review feedback for deadline fixes 2026-04-21 21:50:52 +02:00
schedule Remove schedule initial setup dialog component (#6460) 2026-02-11 17:02:22 +01:00
search improve E2E test reliability and add snapshotOpType interface param 2026-01-27 20:55:30 +01:00
settings test(e2e): use correct route /#/tag/TODAY/tasks instead of /#/tag/TODAY 2026-03-15 18:48:00 +01:00
short-syntax refactor(e2e): replace waitForTimeout with condition-based waits 2026-01-03 15:29:38 +01:00
sync fix(sync): break iOS WebDAV conflict-dialog loop (#7339) 2026-04-25 22:36:14 +02:00
tags test(e2e): add comprehensive E2E test coverage for core features 2026-01-12 15:11:27 +01:00
task-basic test(e2e): fix done-toggle selector to use element instead of class 2026-03-24 16:25:42 +01:00
task-detail test(e2e): update Show/hide task panel button label (#7260) 2026-04-17 22:19:22 +02:00
task-dragdrop test(e2e): fix done-toggle selector to use element instead of class 2026-03-24 16:25:42 +01:00
task-list-basic test(e2e): fix done-toggle selector to use element instead of class 2026-03-24 16:25:42 +01:00
work-view test(e2e): fix done-toggle selector to use element instead of class 2026-03-24 16:25:42 +01:00
workflow test(e2e): add comprehensive E2E test coverage for core features 2026-01-12 15:11:27 +01:00
worklog test(e2e): add comprehensive E2E test coverage for core features 2026-01-12 15:11:27 +01:00
all-basic-routes-without-error.spec.ts refactor(e2e): replace waitForTimeout with condition-based waits 2026-01-03 15:29:38 +01:00