super-productivity/e2e/tests/sync
Johannes Millan 18262eb1f3
fix(sync): retention pruning, misc→tasks alias boundary & WS local-win re-upload (#9028)
* fix(supersync): exclude legacy REPAIR from retention cleanup pruning

The daily-cleanup fallback (used when `latestFullStateSeq` is absent, i.e.
legacy/pre-marker installs) selected the pruning boundary with a raw
`opType: { in: [SYNC_IMPORT, BACKUP_IMPORT, REPAIR] }` filter that includes
legacy REPAIR rows (`repairBaseServerSeq` NULL). Such a repair carries no
causal base cursor proving its state is current as of its seq, so pruning
history behind it can permanently drop ops committed between its logical
base and its seq for any device replaying from before it.

#8971 migrated five full-state queries to `CAUSAL_FULL_STATE_OPERATION_WHERE`
but missed this one — the single query whose result directly authorizes a
DELETE. Route it through the same causal-only predicate; a legacy-repair-only
user then yields `protectedFromSeq === null` and is skipped (no deletion),
the safe default already implemented below.

Adds a regression test whose mock `findFirst` honours the causal
`repairBaseServerSeq` predicate.

* fix(supersync): gate misc→tasks conflict alias on the split boundary

`detectConflictForEntity` and `prefetchLatestEntityOpsForBatch` looked up
the legacy `GLOBAL_CONFIG:misc` alias for an incoming `tasks` write with
`schemaVersion < CURRENT_SCHEMA_VERSION`. Once v4 shipped, that aliases
post-split v2/v3 misc writes — disjoint from `tasks` — and fabricates false
`CONFLICT_CONCURRENT` rejections of tasks-settings writes for multi-device
users.

Gate both read-side lookups on the fixed `MISC_TASKS_SPLIT_SCHEMA_VERSION`
(2), matching the `isLegacyMiscConfigOperation` incoming gate and the
warning comment it already carries. Drops the now-unused
`CURRENT_SCHEMA_VERSION` import.

Adds real-PostgreSQL integration coverage for both changed lookups
(`detectConflictForEntity` and the batch `prefetchLatestEntityOpsForBatch`):
a post-split v2/v3 misc write must not alias, a legacy v1 one still must.

* fix(sync): re-upload LWW local-win ops after a WS-triggered download

A WS-triggered download that resolves a conflict against pending local ops
appends LWW local-win replacement ops straight to the op-log, bypassing the
capture effect. Unlike `ImmediateUploadService` and the main sync loop, this
path had no follow-up upload, so the preserved edit sat unsynced until the
next user edit or periodic sync — an unbounded window for manual-sync-only
users.

Re-upload when `localWinOpsCreated > 0`, mirroring the other two paths, and
surface the same terminal outcomes `ImmediateUploadService` does — permanent
rejection / rejected-full-state baseline → ERROR, mandatory-but-missing key →
UNKNOWN_OR_CHANGED — so a preserved edit that fails to converge is not left
silent (the WS path never claims IN_SYNC). Single follow-up only, matching the
sibling side channel.

* fix(supersync): validate the primary latestFullStateSeq marker as causal before pruning

The scheduled retention cleanup trusted `state.latestFullStateSeq` as a pruning
boundary whenever it was `<= lastSnapshotSeq`, with no check that the marked op is
a causal full-state operation. The earlier fix (37bf818) hardened only the
fallback query used when the marker is absent.

Installs upgraded from before #8973 can carry a `latestFullStateSeq` set from a
legacy REPAIR (repairBaseServerSeq NULL) through the old isFullStateOpType gate,
and that migration shipped no backfill to clear stale markers. Trusting such a
marker prunes history behind a repair the replay path deliberately refuses as a
boundary (LegacyRepairReplayUnsupportedError) — permanent, cross-device loss.

Validate the marked op against CAUSAL_FULL_STATE_OPERATION_WHERE before it can
authorize a DELETE; a stale marker drops to the (now causal-only) fallback query
or the user is skipped. Updates the happy-path test to a causal boundary, adds a
stale-marker regression test, and teaches the mock findFirst to honour an exact
serverSeq predicate.

* test(e2e): de-flake USE_REMOTE crash-resume reload

`page.reload()` defaulted to waiting for the `load` event, which can never
fire while an active SuperSync WebSocket/sync connection keeps the page
"loading" — so the reload timed out at 30s (observed flake:
`page.reload: Timeout 30000ms exceeded`). Three sibling sync specs already
document this hang and work around it with close()+newPage(), but that drops
sessionStorage, which this test asserts on across the reload.

Wait only for `domcontentloaded` (with 60s headroom) instead; `waitForAppReady`
— which itself only needs `domcontentloaded` — remains the real readiness gate,
and the reload still preserves sessionStorage.
2026-07-15 13:12:04 +02:00
..
ENCRYPTION-E2E-STATUS.md refactor(sync): consolidate LegacySyncProvider into SyncProviderId 2026-02-15 11:19:22 +01:00
import-sync.spec.ts feat(history): merge Quick History and Worklog into a unified History view (#8033) 2026-06-05 18:10:56 +02:00
supersync-account-deletion.spec.ts fix(e2e): fix failing and flaky supersync tests 2026-02-08 14:16:06 +01:00
supersync-account-reset.spec.ts test(sync): add encryption and supersync e2e test coverage 2026-03-01 21:27:08 +01:00
supersync-advanced-edge-cases.spec.ts fix(e2e): add settle time after done-toggle to prevent sync race condition 2026-03-24 20:09:02 +01:00
supersync-advanced.spec.ts fix(sync): preserve own vector clock counter across full-state op resets 2026-04-01 15:41:13 +02:00
supersync-archive-conflict.spec.ts test(e2e): harden LWW archive and encryption password-change tests 2026-04-19 19:20:34 +02:00
supersync-archive-data-sync.spec.ts feat(history): merge Quick History and Worklog into a unified History view (#8033) 2026-06-05 18:10:56 +02:00
supersync-archive-subtasks.spec.ts refactor(ui): unify primary/secondary action button treatment across dialogs (#8706) 2026-07-02 14:42:59 +02:00
supersync-backup-import-id-mismatch.spec.ts test(e2e): tighten backup-export selector for renamed privacy button 2026-04-21 21:50:52 +02:00
supersync-backup-recovery.spec.ts feat(history): merge Quick History and Worklog into a unified History view (#8033) 2026-06-05 18:10:56 +02:00
supersync-cascade-delete.spec.ts test(e2e): fix reliability issues in supersync E2E tests 2026-02-13 14:06:43 +01:00
supersync-compaction.spec.ts chore(e2e): remove unused eslint-disable directive 2026-02-12 16:43:11 +01:00
supersync-concurrent-delete-reorder.spec.ts fix(sync): improve move operation reliability during sync 2026-03-24 16:25:42 +01:00
supersync-concurrent-import.spec.ts test(e2e): fix supersync E2E tests for mandatory encryption flow 2026-03-06 16:36:38 +01:00
supersync-conflict-gate-non-task-work.spec.ts test(sync): verify non-task conflict convergence 2026-07-10 19:37:55 +02:00
supersync-constraint-error-recovery.spec.ts fix(tests): improve synchronization tests and increase timeout for IndexedDB operations 2026-02-06 20:10:21 +01:00
supersync-cross-entity.spec.ts fix(e2e): improve test stability for parallel execution 2026-01-04 17:35:47 +01:00
supersync-daily-summary.spec.ts test(e2e): retry supersync time-estimate dialog until input binds 2026-06-09 13:56:15 +02:00
supersync-day-change-overdue-6992.spec.ts test(e2e): add day-change sync convergence test (#6992) and fix lint 2026-03-29 19:57:10 +02:00
supersync-divergence-bug-6571.spec.ts fix(sync): preserve own vector clock counter across full-state op resets 2026-04-01 15:41:13 +02:00
supersync-edge-cases.spec.ts test(e2e): fix done-toggle selector to use element instead of class 2026-03-24 16:25:42 +01:00
supersync-encryption-conflict.spec.ts test(e2e): fix done-toggle selector to use element instead of class 2026-03-24 16:25:42 +01:00
supersync-encryption-password-change.spec.ts test(sync): cover incompatible supersync password change 2026-05-13 11:08:54 +02:00
supersync-encryption-password-preservation.spec.ts test(e2e): fix supersync E2E tests for mandatory encryption flow 2026-03-06 16:36:38 +01:00
supersync-encryption.spec.ts fix(sync): never transmit plaintext operations for E2EE-mandatory providers (#8670) 2026-07-01 17:56:39 +02:00
supersync-error-handling.spec.ts test(e2e): fix done-toggle selector to use element instead of class 2026-03-24 16:25:42 +01:00
supersync-error-scenarios.spec.ts test(e2e): fix supersync error scenario tests and skip failing import tests 2026-03-06 23:08:37 +01:00
supersync-example-task-fresh-client.spec.ts [codex] Fix sync import conflict from startup example tasks (#7976) 2026-06-03 15:57:53 +02:00
supersync-global-config-edge-cases.spec.ts test(e2e): strengthen assertions in supersync E2E tests 2026-02-12 16:42:07 +01:00
supersync-import-clean-server-state.spec.ts test(e2e): fix supersync error scenario tests and skip failing import tests 2026-03-06 23:08:37 +01:00
supersync-import-clean-slate.spec.ts test(e2e): fix 11 failing supersync import tests 2026-03-07 13:28:20 +01:00
supersync-import-conflict-dialog.spec.ts fix(sync): persist lastServerSeq after piggybacked ops are applied (#8304) (#8372) 2026-06-13 14:22:23 +02:00
supersync-import-encryption-change.spec.ts test(e2e): fix 11 failing supersync import tests 2026-03-07 13:28:20 +01:00
supersync-import-encryption-preserve.spec.ts test(e2e): fix 11 failing supersync import tests 2026-03-07 13:28:20 +01:00
supersync-import-other-client-ops.spec.ts test(e2e): fix reliability issues in supersync E2E tests 2026-02-13 14:06:43 +01:00
supersync-import-same-client-ops.spec.ts test(e2e): fix reliability issues in supersync E2E tests 2026-02-13 14:06:43 +01:00
supersync-keep-local-archive-preservation.spec.ts feat(history): merge Quick History and Worklog into a unified History view (#8033) 2026-06-05 18:10:56 +02:00
supersync-lastseq-preservation.spec.ts test(e2e): fix reliability issues in supersync E2E tests 2026-02-13 14:06:43 +01:00
supersync-late-join.spec.ts test(e2e): fix failing supersync E2E tests 2026-03-07 22:32:03 +01:00
supersync-legacy-migration-sync.spec.ts Improve on sync (#7736) 2026-05-22 17:49:25 +02:00
supersync-lww-conflict.spec.ts Codex/issue 8081 keep subtask input open (#8423) 2026-06-18 17:58:45 +02:00
supersync-lww-singleton.spec.ts style: fix prettier formatting errors in e2e tests and nav-item scss 2026-04-01 15:41:14 +02:00
supersync-max-retry-rejection.spec.ts test(e2e): fix failing supersync E2E tests 2026-03-07 22:32:03 +01:00
supersync-models.spec.ts test(e2e): fix failing sync tests and reduce flakiness 2026-03-27 17:33:38 +01:00
supersync-multi-tab.spec.ts fix(sync): guard full-state apply against late local ops (#8976) 2026-07-13 20:04:00 +02:00
supersync-network-failure.spec.ts test(supersync): fix flaky E2E tests with timing adjustments 2026-01-24 21:14:57 +01:00
supersync-no-op-sync.spec.ts test(sync): add encryption and supersync e2e test coverage 2026-03-01 21:27:08 +01:00
supersync-planner.spec.ts fix(e2e): improve test stability for parallel execution 2026-01-04 17:35:47 +01:00
supersync-project-delete-conflict.spec.ts test(sync): cover project delete-wins conflicts (#9021) 2026-07-15 10:18:20 +02:00
supersync-provider-switch-to-supersync.spec.ts test(sync): add encryption and supersync e2e test coverage 2026-03-01 21:27:08 +01:00
supersync-provider-switch.spec.ts test(e2e): fix reliability issues in supersync E2E tests 2026-02-13 14:06:43 +01:00
supersync-realtime-push.spec.ts test(e2e): block WebSocket in SuperSync tests to prevent sync race conditions 2026-03-30 23:14:01 +02:00
supersync-reenable-and-account-switch.spec.ts test(sync): add encryption and supersync e2e test coverage 2026-03-01 21:27:08 +01:00
supersync-rejected-ops-transient-download-8331.spec.ts test(sync): target transient rejection assertion 2026-07-11 13:18:03 +02:00
supersync-repeat-task-advanced.spec.ts fix(e2e): improve test stability for parallel execution 2026-01-04 17:35:47 +01:00
supersync-repeat-task.spec.ts fix(sync): only show import conflict dialog for local unsynced imports 2026-01-11 11:22:32 +01:00
supersync-server-backup-revert.spec.ts chore(task-repeat): revert RRULE Phase 1 from master (#7948) Develop the full RFC-5545 RRULE epic on the long-running feat/rrule-epic branch and merge once complete and testable in final form, rather than landing 13 phases into master one half-state at a time. Work preserved on feat/rrule-epic. Not yet shipped (post-v18.9.1), so no user impact. 2026-06-09 13:56:38 +02:00
supersync-server-migration-abort.spec.ts test(sync): add encryption and supersync e2e test coverage 2026-03-01 21:27:08 +01:00
supersync-server-migration.spec.ts test(e2e): add sync-stall recovery to flaky supersync setup and migration 2026-05-28 13:58:19 +02:00
supersync-simple-counter-delete-update-7330.spec.ts fix(op-log): backfill SIMPLE_COUNTER fields on LWW recreate (#7330) (#8646) 2026-06-30 15:40:25 +02:00
supersync-simple-counter.spec.ts test(e2e): fix supersync E2E tests for mandatory encryption flow 2026-03-06 16:36:38 +01:00
supersync-snapshot-vector-clock.spec.ts test(e2e): scope supersync backup-revert DB restore to test user 2026-06-01 16:33:18 +02:00
supersync-stress.spec.ts test(e2e): fix done-toggle selector to use element instead of class 2026-03-24 16:25:42 +01:00
supersync-superseded-clock-regression.spec.ts test(e2e): fix failing supersync E2E tests 2026-03-07 22:32:03 +01:00
supersync-task-ordering.spec.ts fix(e2e): stabilize flaky supersync tests with better waiting strategies 2026-01-13 18:26:45 +01:00
supersync-time-tracking-advanced.spec.ts fix(sync): make task and time replay deterministic (#8979) 2026-07-13 21:53:46 +02:00
supersync-token-expiry.spec.ts test(e2e): fix failing supersync E2E tests 2026-02-12 18:02:14 +01:00
supersync-use-remote-crash-resume.spec.ts fix(sync): retention pruning, misc→tasks alias boundary & WS local-win re-upload (#9028) 2026-07-15 13:12:04 +02:00
supersync-vector-clock-max-size.spec.ts fix(sync): remove dead code, add defensive checks, and clean up vector clock logic 2026-02-02 17:15:13 +01:00
supersync-vector-clock-pruning.spec.ts fix: resolve pre-existing lint and prettier errors blocking commits (#6840) 2026-03-15 16:47:52 +01:00
supersync-worklog.spec.ts feat(history): merge Quick History and Worklog into a unified History view (#8033) 2026-06-05 18:10:56 +02:00
supersync-wrong-password-error.spec.ts test(e2e): fix failing supersync E2E tests 2026-03-07 22:32:03 +01:00
supersync.spec.ts feat(history): merge Quick History and Worklog into a unified History view (#8033) 2026-06-05 18:10:56 +02:00
webdav-conflict-use-remote-restore-8107.spec.ts fix(sync): make 'Use Server Data' recoverable + guard the destructive choice (#8107) (#8151) 2026-06-08 16:34:59 +02:00
webdav-encryption-conflict-use-local.spec.ts feat(shepherd): remove all tours except keyboard navigation 2026-03-22 17:00:42 +01:00
webdav-encryption-disable.spec.ts fix(e2e): resolve flaky WebDAV tests and fix encryption test failures 2026-01-28 21:55:04 +01:00
webdav-first-sync-conflict.spec.ts fix(sync): break iOS WebDAV conflict-dialog loop (#7339) 2026-04-25 22:36:14 +02:00
webdav-legacy-migration-sync.spec.ts Improve on sync (#7736) 2026-05-22 17:49:25 +02:00
webdav-provider-switch.spec.ts fix(e2e): accept overwrite confirmation in provider-switch conflict test 2026-07-07 18:27:49 +02:00
webdav-setup-encryption.spec.ts feat(sync): offer E2EE before first upload for file-based providers (#8709) 2026-07-02 17:17:01 +02:00
webdav-single-client-rapid-sync.spec.ts fix(sync): preserve own vector clock counter across full-state op resets 2026-04-01 15:41:13 +02:00
webdav-sync-advanced.spec.ts test(e2e): open attachment dialog via detail panel after #7314 2026-04-25 22:36:14 +02:00
webdav-sync-archive.spec.ts refactor(ui): unify primary/secondary action button treatment across dialogs (#8706) 2026-07-02 14:42:59 +02:00
webdav-sync-delete-cascade.spec.ts feat(shepherd): remove all tours except keyboard navigation 2026-03-22 17:00:42 +01:00
webdav-sync-error-handling.spec.ts test(e2e): harden failure signals and provider gates (#7753) 2026-05-23 20:33:04 +02:00
webdav-sync-expansion.spec.ts test(e2e): fix failing sync tests and reduce flakiness 2026-03-27 17:33:38 +01:00
webdav-sync-full.spec.ts feat(sync): replace WebDAV header-based conflict detection with content hashing 2026-03-30 17:33:06 +02:00
webdav-sync-tags.spec.ts fix(ci): exclude WebDAV and SuperSync tests from build workflow 2026-01-21 20:42:50 +01:00
webdav-sync-task-order.spec.ts fix(ci): exclude WebDAV and SuperSync tests from build workflow 2026-01-21 20:42:50 +01:00
webdav-sync-today-tag.spec.ts feat(shepherd): remove all tours except keyboard navigation 2026-03-22 17:00:42 +01:00