Commit graph

8 commits

Author SHA1 Message Date
Johannes Millan
9fd9d386a8 refactor(sync): move vector clocks to sync-core 2026-05-11 15:21:08 +02:00
Johannes Millan
82815cf9b2 fix(infra): repair supersync test Dockerfile retry CMD
Two bugs in the prisma db push retry loop introduced in 81634a17f2:

1. Shell form CMD wraps the command in /bin/sh -c, so $(seq 1 15) was
   expanded by the outer shell into a multi-line value. Busybox's ash
   refuses `for i in 1\n2\n...\n15; do` with "expected do" and the
   container exited immediately. Switched to exec form so the inner
   sh -c does the expansion in unquoted context where word-splitting
   flattens the newlines.

2. After 15 failed attempts the loop's final exit status was the
   status of `sleep 2` (zero), so `&& node` would still launch the
   server against an unmigrated DB and surface as confusing Prisma
   errors at request time. Replaced break/&& with `exec node
   dist/src/index.js` on success so the loop cannot fall through,
   followed by an explicit exit 1 if the loop ends.
2026-04-29 16:17:56 +02:00
Johannes Millan
add56d818c fix(infra): close db-startup race in supersync e2e stack
pg_isready -U supersync without -d returned OK as soon as postgres
accepted connections to the default database, but during first-run
initdb the server briefly bounced while POSTGRES_DB was created.
supersync's prisma db push then race-failed with P1001.

- Healthcheck now runs psql -d supersync_db -c 'SELECT 1' so it only
  passes once the app's db is queryable.
- Dockerfile.test entrypoint retries prisma db push up to 15x before
  giving up — defense in depth if anything else ever races.
2026-04-29 16:17:56 +02:00
Johannes Millan
6501950760 fix: resolve build issues and update E2E tests for sync import conflict
- Fix TypeScript error in passkey.ts (Buffer to Uint8Array conversion)
- Update Dockerfile.test to use npm install instead of npm ci for workspace sync
- Update E2E test to not setup sync before import
- Add additional unit tests for sync-wrapper.service

Note: E2E tests for sync import conflict dialog need further work due to
automatic upload of SYNC_IMPORT when sync is enabled. The core dialog
functionality is implemented and unit tested.
2026-01-10 18:48:47 +01:00
Johannes Millan
b77328a381 fix(docker): fix supersync container startup issues
- Fix Dockerfile.test: use correct path dist/src/index.js (not dist/index.js)
  since TypeScript compiles with rootDir="." preserving src/ directory
- Fix healthcheck: use 127.0.0.1 instead of localhost to avoid IPv6
  resolution issues (wget resolves localhost to ::1 but server listens on IPv4)
2025-12-19 17:04:32 +01:00
Johannes Millan
49faa5da92 fix(supersync): Resolve e2e test failures
Fixes:
- : Corrected a TypeScript type casting error () when handling gzipped request bodies by casting  to  before .
- : Added  and  dependencies to the Alpine-based Docker image. This resolves Prisma engine startup failures and ensures database tables are correctly pushed during container initialization, which was causing 'table does not exist' errors in server logs.
- Added  to  to prevent generated Prisma client files from being tracked.

These changes collectively fix the
> superProductivity@16.5.5 e2e:supersync
> docker compose up -d --build supersync && echo 'Waiting for SuperSync server...' && until curl -s http://localhost:1900/health > /dev/null 2>&1; do sleep 1; done && echo 'Server ready!' && npm run e2e -- --grep @supersync; docker compose down supersync

#1 [internal] load local bake definitions
#1 reading from stdin 560B done
#1 DONE 0.0s

#2 [internal] load build definition from Dockerfile.test
#2 transferring dockerfile: 1.65kB done
#2 DONE 0.0s

#3 [internal] load metadata for docker.io/library/node:22-alpine
#3 DONE 0.9s

#4 [internal] load .dockerignore
#4 transferring context: 147B done
#4 DONE 0.0s

#5 [ 1/15] FROM docker.io/library/node:22-alpine@sha256:9632533eda8061fc1e9960cfb3f8762781c07a00ee7317f5dc0e13c05e15166f
#5 DONE 0.0s

#6 [internal] load build context
#6 transferring context: 104.47kB 0.0s done
#6 DONE 0.0s

#7 [ 6/15] COPY packages/super-sync-server/package.json ./packages/super-sync-server/
#7 CACHED

#8 [ 3/15] RUN apk add --no-cache openssl libc6-compat
#8 CACHED

#9 [ 4/15] COPY package.json package-lock.json ./
#9 CACHED

#10 [ 5/15] COPY packages/shared-schema/package.json ./packages/shared-schema/
#10 CACHED

#11 [ 7/15] RUN npm ci --workspace=packages/shared-schema --workspace=packages/super-sync-server --ignore-scripts
#11 CACHED

#12 [ 2/15] WORKDIR /app
#12 CACHED

#13 [ 8/15] COPY packages/shared-schema/ ./packages/shared-schema/
#13 CACHED

#14 [ 9/15] COPY packages/super-sync-server/ ./packages/super-sync-server/
#14 DONE 0.4s

#15 [10/15] WORKDIR /app/packages/shared-schema
#15 DONE 0.0s

#16 [11/15] RUN npm run build
#16 0.236
#16 0.236 > @sp/shared-schema@1.0.0 build
#16 0.236 > tsc
#16 0.236
#16 DONE 1.1s

#17 [12/15] WORKDIR /app/packages/super-sync-server
#17 DONE 0.0s

#18 [13/15] RUN npx prisma generate
#18 1.958 Environment variables loaded from .env
#18 1.959 Prisma schema loaded from prisma/schema.prisma
#18 2.232
#18 2.232 ✔ Generated Prisma Client (v5.22.0) to ./node_modules/@prisma/client in 72ms
#18 2.232
#18 2.232 Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
#18 2.232
#18 2.232 Tip: Want to turn off tips and other hints? https://pris.ly/tip-4-nohints
#18 2.232
#18 DONE 2.5s

#19 [14/15] RUN rm -rf dist && npm run build
#19 0.254
#19 0.254 > @super-productivity/super-sync-server@1.0.0 build
#19 0.254 > tsc
#19 0.254
#19 DONE 1.7s

#20 [15/15] RUN cp -r public dist/
#20 DONE 0.2s

#21 exporting to image
#21 exporting layers
#21 exporting layers 0.4s done
#21 writing image sha256:2c3f259261e139e1fea2689043c83b2f4dbcead0a5e2a59966eb4a922df925eb done
#21 naming to docker.io/library/sup-claude-supersync done
#21 DONE 0.5s

#22 resolving provenance for metadata file
#22 DONE 0.0s
Waiting for SuperSync server...
Server ready!

> superProductivity@16.5.5 pree2e
> npm run plugins:build

> superProductivity@16.5.5 plugins:build
> npm run vite-plugin:build && cd packages/plugin-dev && npm run build:all

> superProductivity@16.5.5 vite-plugin:build
> cd packages/vite-plugin && npm run build

> @super-productivity/vite-plugin@1.0.0 build
> tsc

> @super-productivity/plugin-dev@1.0.0 build:all
> node scripts/build-all.js


🚀 Building all plugins...

📦 Building procrastination-buster...
  Installing dependencies...

📦 Building api-test-plugin...
  Installing dependencies...

📦 Building sync-md...
  Installing dependencies...

📦 Building yesterday-tasks-plugin...
  Installing dependencies...

📦 Building ai-productivity-prompts...
  Installing dependencies...
  Building...
 api-test-plugin - Copied to assets (0.2s)
  Building...
 yesterday-tasks-plugin - Copied to assets (0.2s)
  Building...
  Building...
  Building...
 sync-md - Built and copied to assets (0.9s)
 ai-productivity-prompts - Built and copied to assets (1.3s)
 procrastination-buster - Built and copied to assets (1.3s)

📊 Build Summary:
  Total plugins: 5
  Successful: 5
  Total time: 1.3s

📁 Build outputs:
  • sync-md/dist/
  • ai-productivity-prompts/dist/

> superProductivity@16.5.5 e2e
> npx playwright test --config e2e/playwright.config.ts --reporter=line --grep @supersync

[WebServer] 
[WebServer] > superProductivity@16.5.5 startFrontend:e2e
[WebServer] > npm run env && ng serve --port=4242
[WebServer] 

[WebServer] 
[WebServer] > superProductivity@16.5.5 env
[WebServer] > node ./tools/load-env.js
[WebServer] 

[WebServer]  Found 3 environment variable(s)

[WebServer]  Generated /home/johannes/www/sup-claude/src/app/config/env.generated.ts

[WebServer] ❯ Building...

[WebServer] ✔ Building...

[WebServer] Initial chunk files | Names                         |  Raw size
[WebServer] chunk-B5GBBGFZ.js   | -                             |   1.59 MB | 
[WebServer] main.js             | main                          |   1.50 MB | 
[WebServer] chunk-73SFRLD7.js   | -                             | 405.10 kB | 
[WebServer] chunk-4GQJAWHV.js   | -                             | 368.88 kB | 
[WebServer] chunk-GVSM3YI6.js   | -                             | 315.27 kB | 
[WebServer] styles.css          | styles                        | 296.84 kB | 
[WebServer] chunk-SMTMT6UB.js   | -                             | 227.13 kB | 
[WebServer] chunk-ZQQLCIPY.js   | -                             | 166.64 kB | 
[WebServer] chunk-VO4RJIGM.js   | -                             | 136.58 kB | 
[WebServer] chunk-URLH5Z6W.js   | -                             | 122.59 kB | 
[WebServer] chunk-ONOVC6TO.js   | -                             |  68.76 kB | 
[WebServer] chunk-QRUNPE3P.js   | -                             |  63.69 kB | 
[WebServer] chunk-F7PG5TTX.js   | -                             |  55.01 kB | 
[WebServer] chunk-QGJQW3EB.js   | -                             |  42.06 kB | 
[WebServer] chunk-PYPQ3TRT.js   | -                             |  36.73 kB | 
[WebServer] chunk-HSTZRFNF.js   | -                             |  31.90 kB | 
[WebServer] chunk-D53RABDQ.js   | -                             |  27.86 kB | 
[WebServer] chunk-7D42UK3V.js   | -                             |  23.63 kB | 
[WebServer] chunk-4TYACKT3.js   | -                             |  17.55 kB | 
[WebServer] chunk-ZWN6FFZO.js   | -                             |  16.54 kB | 
[WebServer] chunk-2IQPEDY7.js   | -                             |  15.72 kB | 
[WebServer] chunk-4QJA3367.js   | -                             |  13.70 kB | 
[WebServer] chunk-W7AH2J3I.js   | -                             |  13.51 kB | 
[WebServer] chunk-MCWDR5V7.js   | -                             |  13.18 kB | 
[WebServer] chunk-X5IWF2EC.js   | -                             |  12.16 kB | 
[WebServer] chunk-TAD6ZV7S.js   | -                             |  11.76 kB | 
[WebServer] chunk-EX2CES47.js   | -                             |  11.27 kB | 
[WebServer] chunk-4SOE6J4V.js   | -                             |   8.12 kB | 
[WebServer] chunk-TWC2RC7A.js   | -                             |   8.11 kB | 
[WebServer] chunk-GIPKJ6OE.js   | -                             |   7.65 kB | 
[WebServer] chunk-G3JA22CS.js   | -                             |   7.62 kB | 
[WebServer] chunk-RTM45NAG.js   | -                             |   6.61 kB | 
[WebServer] chunk-IOASK5PE.js   | -                             |   5.91 kB | 
[WebServer] chunk-3GNZKYAW.js   | -                             |   5.89 kB | 
[WebServer] chunk-Z4K6LGBW.js   | -                             |   5.81 kB | 
[WebServer] chunk-BE7CIT5D.js   | -                             |   5.41 kB | 
[WebServer] chunk-T3NZZKCV.js   | -                             |   5.20 kB | 
[WebServer] chunk-6PDYIKD2.js   | -                             |   5.05 kB | 
[WebServer] chunk-UZESUJ4I.js   | -                             |   4.93 kB | 
[WebServer] chunk-DMW3XK7Y.js   | -                             |   4.21 kB | 
[WebServer] chunk-TMH5BTGC.js   | -                             |   4.06 kB | 
[WebServer] chunk-WOQ4O7SL.js   | -                             |   3.67 kB | 
[WebServer] chunk-LODE43G5.js   | -                             |   3.31 kB | 
[WebServer] chunk-PF3SKUEW.js   | -                             |   2.92 kB | 
[WebServer] chunk-H72E5A3L.js   | -                             |   2.90 kB | 
[WebServer] chunk-A7NV3EZJ.js   | -                             |   2.73 kB | 
[WebServer] chunk-R2KZN2E2.js   | -                             |   2.67 kB | 
[WebServer] chunk-APGCNZCS.js   | -                             |   2.50 kB | 
[WebServer] chunk-QKGIPAGN.js   | -                             |   2.36 kB | 
[WebServer] chunk-PCML2QOC.js   | -                             |   2.14 kB | 
[WebServer] chunk-VSZF3HME.js   | -                             |   1.94 kB | 
[WebServer] chunk-F7TMK2PM.js   | -                             |   1.88 kB | 
[WebServer] chunk-REG3UXPA.js   | -                             |   1.70 kB | 
[WebServer] chunk-CVJHXYHS.js   | -                             |   1.54 kB | 
[WebServer] chunk-QFVN6FHD.js   | -                             |   1.40 kB | 
[WebServer] chunk-FYTAYCL2.js   | -                             |   1.38 kB | 
[WebServer] chunk-HVC7CZTJ.js   | -                             |   1.38 kB | 
[WebServer] chunk-7HDUANM3.js   | -                             |   1.36 kB | 
[WebServer] chunk-YULDQP7H.js   | -                             |   1.28 kB | 
[WebServer] polyfills.js        | polyfills                     | 467 bytes | 
[WebServer] chunk-CJ4PWQKZ.js   | -                             | 431 bytes | 
[WebServer] chunk-OIDKS6PW.js   | -                             | 375 bytes | 
[WebServer] 
[WebServer]                     | Initial total                 |   5.73 MB
[WebServer] 
[WebServer] Lazy chunk files    | Names                         |  Raw size
[WebServer] chunk-DJQ6CVQS.js   | daily-summary-component       | 140.80 kB | 
[WebServer] chunk-I77IMFKB.js   | config-page-component         | 123.23 kB | 
[WebServer] chunk-R2GNBCCX.js   | -                             |  54.47 kB | 
[WebServer] chunk-ECMUBYXW.js   | metric-page-component         |  50.72 kB | 
[WebServer] chunk-DZVJMCDS.js   | boards-component              |  49.28 kB | 
[WebServer] chunk-JOTLEBHQ.js   | -                             |  40.69 kB | 
[WebServer] chunk-5MOXPKA7.js   | schedule-component            |  30.21 kB | 
[WebServer] chunk-FCWXEDT7.js   | worklog-component             |  29.03 kB | 
[WebServer] chunk-VSXYGPVR.js   | -                             |  27.23 kB | 
[WebServer] chunk-CNHMH3MS.js   | scheduled-list-page-component |  27.01 kB | 
[WebServer] worker-W2VREO2A.js  | reminder-worker               |  26.35 kB | 
[WebServer] chunk-CIZJR6XT.js   | planner-component             |  17.13 kB | 
[WebServer] chunk-5QAAGCOD.js   | -                             |  15.29 kB | 
[WebServer] chunk-QHLVN5TP.js   | quick-history-component       |  15.16 kB | 
[WebServer] chunk-T6QFUCYX.js   | search-page-component         |  12.10 kB | 
[WebServer] ...and 13 more lazy chunks files. Use "--verbose" to show all the files.
[WebServer] 
[WebServer] Application bundle generation complete. [9.592 seconds] - 2025-12-10T12:10:06.690Z
[WebServer] 

[WebServer] Watch mode enabled. Watching for file changes...

[WebServer] NOTE: Raw file sizes do not reflect development server per-request transformations.

[WebServer]   ➜  Local:   http://localhost:4242/

Running tests with 4 workers

Running 26 tests using 4 workers

[1/26] [chromium] › e2e/tests/sync/supersync-advanced.spec.ts:132:7 › @supersync SuperSync Advanced › Tag Management: Add/Remove tags syncs correctly
[2/26] [chromium] › e2e/tests/sync/import-sync.spec.ts:220:7 › @importsync @supersync Import + Sync E2E › Import merges with existing synced data
[3/26] [chromium] › e2e/tests/sync/import-sync.spec.ts:66:7 › @importsync @supersync Import + Sync E2E › Import backup file on Client A, sync to Client B
[4/26] [chromium] › e2e/tests/sync/supersync-advanced.spec.ts:50:7 › @supersync SuperSync Advanced › Large dataset sync (50 tasks)
[chromium] › e2e/tests/sync/import-sync.spec.ts:220:7 › @importsync @supersync Import + Sync E2E › Import merges with existing synced data
[Merge Test] Phase 1: Creating initial tasks

[chromium] › e2e/tests/sync/import-sync.spec.ts:66:7 › @importsync @supersync Import + Sync E2E › Import backup file on Client A, sync to Client B
[Import Test] Phase 1: Client A importing backup

[chromium] › e2e/tests/sync/supersync-advanced.spec.ts:50:7 › @supersync SuperSync Advanced › Large dataset sync (50 tasks)
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[chromium] › e2e/tests/sync/import-sync.spec.ts:66:7 › @importsync @supersync Import + Sync E2E › Import backup file on Client A, sync to Client B
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[chromium] › e2e/tests/sync/import-sync.spec.ts:220:7 › @importsync @supersync Import + Sync E2E › Import merges with existing synced data
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[chromium] › e2e/tests/sync/supersync-advanced.spec.ts:132:7 › @supersync SuperSync Advanced › Tag Management: Add/Remove tags syncs correctly
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[chromium] › e2e/tests/sync/supersync-advanced.spec.ts:50:7 › @supersync SuperSync Advanced › Large dataset sync (50 tasks)
[LargeData] Creating 50 tasks on Client A...

[chromium] › e2e/tests/sync/import-sync.spec.ts:220:7 › @importsync @supersync Import + Sync E2E › Import merges with existing synced data
[Merge Test] Client A created and synced: ExistingA-1765368607691

[chromium] › e2e/tests/sync/import-sync.spec.ts:66:7 › @importsync @supersync Import + Sync E2E › Import backup file on Client A, sync to Client B
[Import Test] Client A imported backup successfully

[Import Test] Client A has imported tasks visible

[Import Test] Phase 2: Client A syncing to server

[Import Test] Client A sync complete

[Import Test] Phase 3: Client B syncing from server

[chromium] › e2e/tests/sync/import-sync.spec.ts:220:7 › @importsync @supersync Import + Sync E2E › Import merges with existing synced data
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[SuperSyncPage] Conflict dialog detected, using remote...

[chromium] › e2e/tests/sync/supersync-advanced.spec.ts:132:7 › @supersync SuperSync Advanced › Tag Management: Add/Remove tags syncs correctly
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[SuperSyncPage] Conflict dialog detected, using remote...

[chromium] › e2e/tests/sync/import-sync.spec.ts:220:7 › @importsync @supersync Import + Sync E2E › Import merges with existing synced data
[SuperSyncPage] Clicking Apply to apply resolution...

[chromium] › e2e/tests/sync/supersync-advanced.spec.ts:132:7 › @supersync SuperSync Advanced › Tag Management: Add/Remove tags syncs correctly
[SuperSyncPage] Clicking Apply to apply resolution...

[chromium] › e2e/tests/sync/import-sync.spec.ts:66:7 › @importsync @supersync Import + Sync E2E › Import backup file on Client A, sync to Client B
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[Import Test] Client B sync complete

[Import Test] Phase 4: Verifying active tasks on Client B

[Import Test] Client B has both active tasks

[Import Test] Phase 5: Verifying archived tasks in worklog

[Import Test] Checking for archived tasks in worklog...

[Import Test] Client B worklog has archived task entries

[Import Test] Phase 6: Final state verification

[Import Test] Client A task count: 3

[Import Test] Client B task count: 3

[Import Test] ✓ Import + Sync test passed!

[5/26] [chromium] › e2e/tests/sync/supersync-advanced.spec.ts:244:7 › @supersync SuperSync Advanced › Concurrent Delete vs. Update (Conflict Handling)
[chromium] › e2e/tests/sync/import-sync.spec.ts:220:7 › @importsync @supersync Import + Sync E2E › Import merges with existing synced data
[Merge Test] Client B created and synced: ExistingB-1765368607691

[Merge Test] Phase 2: Client A importing backup

[chromium] › e2e/tests/sync/supersync-advanced.spec.ts:132:7 › @supersync SuperSync Advanced › Tag Management: Add/Remove tags syncs correctly
[TagTest] ✓ Tag added and removed successfully across clients

[6/26] [chromium] › e2e/tests/sync/supersync-daily-summary.spec.ts:47:7 › @supersync Daily Summary Sync › Archived tasks and time tracking appear on Daily Summary
[chromium] › e2e/tests/sync/supersync-advanced.spec.ts:244:7 › @supersync SuperSync Advanced › Concurrent Delete vs. Update (Conflict Handling)
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[chromium] › e2e/tests/sync/supersync-daily-summary.spec.ts:47:7 › @supersync Daily Summary Sync › Archived tasks and time tracking appear on Daily Summary
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[chromium] › e2e/tests/sync/supersync-advanced.spec.ts:244:7 › @supersync SuperSync Advanced › Concurrent Delete vs. Update (Conflict Handling)
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[chromium] › e2e/tests/sync/import-sync.spec.ts:220:7 › @importsync @supersync Import + Sync E2E › Import merges with existing synced data
[Merge Test] Client A imported backup

[Merge Test] Phase 3: Syncing after import

[chromium] › e2e/tests/sync/supersync-advanced.spec.ts:244:7 › @supersync SuperSync Advanced › Concurrent Delete vs. Update (Conflict Handling)
[SuperSyncPage] Conflict dialog detected, using remote...

[SuperSyncPage] Clicking Apply to apply resolution...

[chromium] › e2e/tests/sync/supersync-daily-summary.spec.ts:47:7 › @supersync Daily Summary Sync › Archived tasks and time tracking appear on Daily Summary
Client A manually set time to: 10m

[chromium] › e2e/tests/sync/import-sync.spec.ts:220:7 › @importsync @supersync Import + Sync E2E › Import merges with existing synced data
[Merge Test] Phase 4: Verifying merged data

[Merge Test] Client A has imported tasks

[Merge Test] Client B received imported tasks via sync

[Merge Test] ✓ Import merge test passed!

[7/26] [chromium] › e2e/tests/sync/supersync-edge-cases.spec.ts:113:7 › @supersync SuperSync Edge Cases › Move task between projects syncs correctly
[chromium] › e2e/tests/sync/supersync-daily-summary.spec.ts:47:7 › @supersync Daily Summary Sync › Archived tasks and time tracking appear on Daily Summary
Client A archived tasks.

Client A synced.

[chromium] › e2e/tests/sync/supersync-edge-cases.spec.ts:113:7 › @supersync SuperSync Edge Cases › Move task between projects syncs correctly
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[chromium] › e2e/tests/sync/supersync-daily-summary.spec.ts:47:7 › @supersync Daily Summary Sync › Archived tasks and time tracking appear on Daily Summary
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[SuperSyncPage] Conflict dialog detected, using remote...

[chromium] › e2e/tests/sync/supersync-advanced.spec.ts:244:7 › @supersync SuperSync Advanced › Concurrent Delete vs. Update (Conflict Handling)
[SuperSyncPage] Conflict dialog detected, using remote...

[chromium] › e2e/tests/sync/supersync-daily-summary.spec.ts:47:7 › @supersync Daily Summary Sync › Archived tasks and time tracking appear on Daily Summary
[SuperSyncPage] Clicking Apply to apply resolution...

[chromium] › e2e/tests/sync/supersync-advanced.spec.ts:244:7 › @supersync SuperSync Advanced › Concurrent Delete vs. Update (Conflict Handling)
[SuperSyncPage] Clicking Apply to apply resolution...

[chromium] › e2e/tests/sync/supersync-edge-cases.spec.ts:113:7 › @supersync SuperSync Edge Cases › Move task between projects syncs correctly
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[SuperSyncPage] Conflict dialog detected, using remote...

[SuperSyncPage] Clicking Apply to apply resolution...

[chromium] › e2e/tests/sync/supersync-advanced.spec.ts:244:7 › @supersync SuperSync Advanced › Concurrent Delete vs. Update (Conflict Handling)
[ConflictTest] ✓ Concurrent Delete/Update resolved correctly (deletion won)

[8/26] [chromium] › e2e/tests/sync/supersync-edge-cases.spec.ts:226:8 › @supersync SuperSync Edge Cases › Undo propagation syncs correctly
[9/26] [chromium] › e2e/tests/sync/supersync-edge-cases.spec.ts:328:8 › @supersync SuperSync Edge Cases › Field-level merging syncs correctly
[10/26] [chromium] › e2e/tests/sync/supersync-edge-cases.spec.ts:433:7 › @supersync SuperSync Edge Cases › Offline burst of changes syncs correctly
[chromium] › e2e/tests/sync/supersync-daily-summary.spec.ts:47:7 › @supersync Daily Summary Sync › Archived tasks and time tracking appear on Daily Summary
Client B synced.

Client B on Daily Summary.

Row A Content: A-1765368625691-3-TaskA-17653686256910:10 0:10  - undo check

Row B Content: A-1765368625691-3-TaskB-1765368625691- -  - undo check

✓ Daily Summary verification passed!

[11/26] [chromium] › e2e/tests/sync/supersync-encryption.spec.ts:63:8 › @supersync SuperSync Encryption › Encrypted data syncs correctly with valid password
[12/26] [chromium] › e2e/tests/sync/supersync-encryption.spec.ts:110:8 › @supersync SuperSync Encryption › Encrypted data fails to sync with wrong password
[13/26] [chromium] › e2e/tests/sync/supersync-late-join.spec.ts:37:7 › @supersync SuperSync Late Join › Late joiner merges correctly with existing server data
[chromium] › e2e/tests/sync/supersync-edge-cases.spec.ts:433:7 › @supersync SuperSync Edge Cases › Offline burst of changes syncs correctly
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[chromium] › e2e/tests/sync/supersync-late-join.spec.ts:37:7 › @supersync SuperSync Late Join › Late joiner merges correctly with existing server data
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[chromium] › e2e/tests/sync/supersync-edge-cases.spec.ts:433:7 › @supersync SuperSync Edge Cases › Offline burst of changes syncs correctly
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[SuperSyncPage] Conflict dialog detected, using remote...

[SuperSyncPage] Clicking Apply to apply resolution...

[chromium] › e2e/tests/sync/supersync-late-join.spec.ts:37:7 › @supersync SuperSync Late Join › Late joiner merges correctly with existing server data
Client A synced initial tasks

Client B created local tasks

[chromium] › e2e/tests/sync/supersync-edge-cases.spec.ts:433:7 › @supersync SuperSync Edge Cases › Offline burst of changes syncs correctly
[SuperSyncPage] Conflict dialog detected, using remote...

[SuperSyncPage] Clicking Apply to apply resolution...

[chromium] › e2e/tests/sync/supersync-edge-cases.spec.ts:113:7 › @supersync SuperSync Edge Cases › Move task between projects syncs correctly
[MoveTask] ✓ Task moved between projects successfully across clients

[14/26] [chromium] › e2e/tests/sync/supersync-models.spec.ts:165:7 › @supersync SuperSync Models › Projects and their tasks sync correctly
[chromium] › e2e/tests/sync/supersync-late-join.spec.ts:37:7 › @supersync SuperSync Late Join › Late joiner merges correctly with existing server data
Client A added more tasks and synced

[chromium] › e2e/tests/sync/supersync-edge-cases.spec.ts:433:7 › @supersync SuperSync Edge Cases › Offline burst of changes syncs correctly
[BurstTest] ✓ Offline burst changes synced successfully

[15/26] [chromium] › e2e/tests/sync/supersync-models.spec.ts:237:7 › @supersync SuperSync Models › Tags and tagged tasks sync correctly
[chromium] › e2e/tests/sync/supersync-late-join.spec.ts:37:7 › @supersync SuperSync Late Join › Late joiner merges correctly with existing server data
Client B added more local tasks

Client B enabling sync...

[SuperSyncPage] Initial sync started automatically, waiting for completion...

[SuperSyncPage] Conflict dialog detected, using remote...

[chromium] › e2e/tests/sync/supersync-models.spec.ts:165:7 › @supersync SuperSync Models › Projects and their tasks sync correctly
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[chromium] › e2e/tests/sync/supersync-late-join.spec.ts:37:7 › @supersync SuperSync Late Join › Late joiner merges correctly with existing server data
[SuperSyncPage] Clicking Apply to apply resolution...

[chromium] › e2e/tests/sync/supersync-models.spec.ts:237:7 › @supersync SuperSync Models › Tags and tagged tasks sync correctly
[SuperSyncPage] Initial sync started automatically, waiting for completion...

Context menu item not found, trying shortcut...

[chromium] › e2e/tests/sync/supersync-late-join.spec.ts:37:7 › @supersync SuperSync Late Join › Late joiner merges correctly with existing server data
Verifying all tasks on Client A

Verifying all tasks on Client B

[16/26] [chromium] › e2e/tests/sync/supersync-models.spec.ts:403:7 › @supersync SuperSync Models › Project notes sync correctly
[chromium] › e2e/tests/sync/supersync-models.spec.ts:403:7 › @supersync SuperSync Models › Project notes sync correctly
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[chromium] › e2e/tests/sync/supersync-models.spec.ts:165:7 › @supersync SuperSync Models › Projects and their tasks sync correctly
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[SuperSyncPage] Conflict dialog detected, using remote...

[SuperSyncPage] Clicking Apply to apply resolution...

[chromium] › e2e/tests/sync/supersync-models.spec.ts:237:7 › @supersync SuperSync Models › Tags and tagged tasks sync correctly
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[SuperSyncPage] Conflict dialog detected, using remote...

[SuperSyncPage] Clicking Apply to apply resolution...

[17/26] [chromium] › e2e/tests/sync/supersync.spec.ts:69:7 › @supersync SuperSync E2E › 2.1 Client A creates task, Client B downloads it
[18/26] [chromium] › e2e/tests/sync/supersync.spec.ts:131:7 › @supersync SuperSync E2E › 2.2 Both clients create different tasks
[chromium] › e2e/tests/sync/supersync.spec.ts:69:7 › @supersync SuperSync E2E › 2.1 Client A creates task, Client B downloads it
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[chromium] › e2e/tests/sync/supersync.spec.ts:131:7 › @supersync SuperSync E2E › 2.2 Both clients create different tasks
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[chromium] › e2e/tests/sync/supersync-models.spec.ts:403:7 › @supersync SuperSync Models › Project notes sync correctly
Attempt 1 to open note dialog failed, retrying...

[chromium] › e2e/tests/sync/supersync.spec.ts:131:7 › @supersync SuperSync E2E › 2.2 Both clients create different tasks
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[SuperSyncPage] Conflict dialog detected, using remote...

[chromium] › e2e/tests/sync/supersync-advanced.spec.ts:50:7 › @supersync SuperSync Advanced › Large dataset sync (50 tasks)
[LargeData] Creation complete. Verifying local count...

[LargeData] Syncing Client A...

[chromium] › e2e/tests/sync/supersync.spec.ts:131:7 › @supersync SuperSync E2E › 2.2 Both clients create different tasks
[SuperSyncPage] Clicking Apply to apply resolution...

[chromium] › e2e/tests/sync/supersync.spec.ts:69:7 › @supersync SuperSync E2E › 2.1 Client A creates task, Client B downloads it
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[SuperSyncPage] Conflict dialog detected, using remote...

[SuperSyncPage] Clicking Apply to apply resolution...

[chromium] › e2e/tests/sync/supersync-models.spec.ts:403:7 › @supersync SuperSync Models › Project notes sync correctly
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[SuperSyncPage] Conflict dialog detected, using remote...

[SuperSyncPage] Clicking Apply to apply resolution...

[19/26] [chromium] › e2e/tests/sync/supersync.spec.ts:196:7 › @supersync SuperSync E2E › 1.3 Update propagates between clients
[chromium] › e2e/tests/sync/supersync-advanced.spec.ts:50:7 › @supersync SuperSync Advanced › Large dataset sync (50 tasks)
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[SuperSyncPage] Conflict dialog detected, using remote...

[SuperSyncPage] Clicking Apply to apply resolution...

[LargeData] Syncing Client B...

[20/26] [chromium] › e2e/tests/sync/supersync.spec.ts:258:7 › @supersync SuperSync E2E › 1.4 Delete propagates between clients
[chromium] › e2e/tests/sync/supersync.spec.ts:196:7 › @supersync SuperSync E2E › 1.3 Update propagates between clients
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[chromium] › e2e/tests/sync/supersync-advanced.spec.ts:50:7 › @supersync SuperSync Advanced › Large dataset sync (50 tasks)
[LargeData] Verifying Client B count...

[21/26] [chromium] › e2e/tests/sync/supersync.spec.ts:340:7 › @supersync SuperSync E2E › 3.1 Concurrent edits handled gracefully
[LargeData] ✓ Success: Synced 50 tasks.

[chromium] › e2e/tests/sync/supersync.spec.ts:258:7 › @supersync SuperSync E2E › 1.4 Delete propagates between clients
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[22/26] [chromium] › e2e/tests/sync/supersync.spec.ts:415:7 › @supersync SuperSync E2E › 2.3 Client A creates parent, Client B creates subtask
[chromium] › e2e/tests/sync/supersync.spec.ts:340:7 › @supersync SuperSync E2E › 3.1 Concurrent edits handled gracefully
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[chromium] › e2e/tests/sync/supersync.spec.ts:415:7 › @supersync SuperSync E2E › 2.3 Client A creates parent, Client B creates subtask
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[chromium] › e2e/tests/sync/supersync.spec.ts:196:7 › @supersync SuperSync E2E › 1.3 Update propagates between clients
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[SuperSyncPage] Conflict dialog detected, using remote...

[SuperSyncPage] Clicking Apply to apply resolution...

[chromium] › e2e/tests/sync/supersync.spec.ts:258:7 › @supersync SuperSync E2E › 1.4 Delete propagates between clients
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[SuperSyncPage] Conflict dialog detected, using remote...

[SuperSyncPage] Clicking Apply to apply resolution...

[chromium] › e2e/tests/sync/supersync.spec.ts:340:7 › @supersync SuperSync E2E › 3.1 Concurrent edits handled gracefully
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[SuperSyncPage] Conflict dialog detected, using remote...

[SuperSyncPage] Clicking Apply to apply resolution...

[chromium] › e2e/tests/sync/supersync.spec.ts:415:7 › @supersync SuperSync E2E › 2.3 Client A creates parent, Client B creates subtask
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[SuperSyncPage] Conflict dialog detected, using remote...

[23/26] [chromium] › e2e/tests/sync/supersync.spec.ts:512:7 › @supersync SuperSync E2E › 4.1 Complex chain of actions syncs correctly
[SuperSyncPage] Clicking Apply to apply resolution...

[24/26] [chromium] › e2e/tests/sync/supersync.spec.ts:724:7 › @supersync SuperSync E2E › 5.1 Archived tasks appear in worklog on both clients
[chromium] › e2e/tests/sync/supersync.spec.ts:512:7 › @supersync SuperSync E2E › 4.1 Complex chain of actions syncs correctly
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[chromium] › e2e/tests/sync/supersync.spec.ts:340:7 › @supersync SuperSync E2E › 3.1 Concurrent edits handled gracefully
[SuperSyncPage] Conflict dialog detected, using remote...

[SuperSyncPage] Clicking Apply to apply resolution...

[chromium] › e2e/tests/sync/supersync.spec.ts:724:7 › @supersync SuperSync E2E › 5.1 Archived tasks appear in worklog on both clients
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[25/26] [chromium] › e2e/tests/sync/supersync.spec.ts:895:7 › @supersync SuperSync E2E › 6.1 Time tracking syncs between clients
[chromium] › e2e/tests/sync/supersync.spec.ts:512:7 › @supersync SuperSync E2E › 4.1 Complex chain of actions syncs correctly
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[SuperSyncPage] Conflict dialog detected, using remote...

[26/26] [chromium] › e2e/tests/sync/supersync.spec.ts:1033:7 › @supersync SuperSync E2E › 7.1 Three clients achieve eventual consistency
[chromium] › e2e/tests/sync/supersync.spec.ts:1033:7 › @supersync SuperSync E2E › 7.1 Three clients achieve eventual consistency
[3-Client Test] Phase 1: Client A creates Task-1

[chromium] › e2e/tests/sync/supersync.spec.ts:512:7 › @supersync SuperSync E2E › 4.1 Complex chain of actions syncs correctly
[SuperSyncPage] Clicking Apply to apply resolution...

[chromium] › e2e/tests/sync/supersync.spec.ts:724:7 › @supersync SuperSync E2E › 5.1 Archived tasks appear in worklog on both clients
[Archive Test] Client A created task: Archive-Task1-1765368701284

[chromium] › e2e/tests/sync/supersync.spec.ts:512:7 › @supersync SuperSync E2E › 4.1 Complex chain of actions syncs correctly
[Chain Test] Client A created task: ProjectX-1765368698503

[chromium] › e2e/tests/sync/supersync.spec.ts:724:7 › @supersync SuperSync E2E › 5.1 Archived tasks appear in worklog on both clients
[Archive Test] Client A created task: Archive-Task2-1765368701284

[Archive Test] Client A marked Archive-Task1-1765368701284 as done

[Archive Test] Client A marked Archive-Task2-1765368701284 as done

[chromium] › e2e/tests/sync/supersync.spec.ts:895:7 › @supersync SuperSync E2E › 6.1 Time tracking syncs between clients
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[chromium] › e2e/tests/sync/supersync.spec.ts:1033:7 › @supersync SuperSync E2E › 7.1 Three clients achieve eventual consistency
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[chromium] › e2e/tests/sync/supersync.spec.ts:724:7 › @supersync SuperSync E2E › 5.1 Archived tasks appear in worklog on both clients
[Archive Test] Client A synced tasks

[chromium] › e2e/tests/sync/supersync.spec.ts:895:7 › @supersync SuperSync E2E › 6.1 Time tracking syncs between clients
[TimeTrack Test] Client A created task: TimeTrack-1765368704669

[TimeTrack Test] Client A started time tracking

[TimeTrack Test] Time tracking active

[TimeTrack Test] Waiting 5 seconds for time to accumulate...

[chromium] › e2e/tests/sync/supersync.spec.ts:1033:7 › @supersync SuperSync E2E › 7.1 Three clients achieve eventual consistency
[3-Client Test] Client A created: Task1-1765368705251

[chromium] › e2e/tests/sync/supersync.spec.ts:512:7 › @supersync SuperSync E2E › 4.1 Complex chain of actions syncs correctly
[Chain Test] Client B received initial task

[Chain Test] Client B renamed task to: ProjectX-Planning-1765368698503

[Chain Test] Client B added subtask: Research-1765368698503

[chromium] › e2e/tests/sync/supersync.spec.ts:1033:7 › @supersync SuperSync E2E › 7.1 Three clients achieve eventual consistency
[3-Client Test] Client A synced

[3-Client Test] Phase 2: Client B syncs and creates Task-2

[chromium] › e2e/tests/sync/supersync.spec.ts:724:7 › @supersync SuperSync E2E › 5.1 Archived tasks appear in worklog on both clients
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[SuperSyncPage] Conflict dialog detected, using remote...

[SuperSyncPage] Clicking Apply to apply resolution...

[chromium] › e2e/tests/sync/supersync.spec.ts:512:7 › @supersync SuperSync E2E › 4.1 Complex chain of actions syncs correctly
[Chain Test] Client A received rename and subtask

[Chain Test] Client A marked Research-1765368698503 as done

[chromium] › e2e/tests/sync/supersync.spec.ts:1033:7 › @supersync SuperSync E2E › 7.1 Three clients achieve eventual consistency
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[chromium] › e2e/tests/sync/supersync.spec.ts:895:7 › @supersync SuperSync E2E › 6.1 Time tracking syncs between clients
[TimeTrack Test] Client A stopped time tracking

[TimeTrack Test] Client A recorded time: -

[chromium] › e2e/tests/sync/supersync.spec.ts:1033:7 › @supersync SuperSync E2E › 7.1 Three clients achieve eventual consistency
[SuperSyncPage] Conflict dialog detected, using remote...

[chromium] › e2e/tests/sync/supersync.spec.ts:512:7 › @supersync SuperSync E2E › 4.1 Complex chain of actions syncs correctly
[Chain Test] Client A added subtask: Implementation-1765368698503

[chromium] › e2e/tests/sync/supersync.spec.ts:724:7 › @supersync SuperSync E2E › 5.1 Archived tasks appear in worklog on both clients
[Archive Test] Client B synced (downloaded tasks)

[Archive Test] Client B received both tasks

[Archive Test] Client B clicked Finish Day

[Archive Test] Client B on daily summary page

[chromium] › e2e/tests/sync/supersync.spec.ts:1033:7 › @supersync SuperSync E2E › 7.1 Three clients achieve eventual consistency
[SuperSyncPage] Clicking Apply to apply resolution...

[chromium] › e2e/tests/sync/supersync.spec.ts:724:7 › @supersync SuperSync E2E › 5.1 Archived tasks appear in worklog on both clients
[Archive Test] Client B clicked Save and go home (archiving)

[Archive Test] Client B back on work view after archiving

[chromium] › e2e/tests/sync/supersync.spec.ts:895:7 › @supersync SuperSync E2E › 6.1 Time tracking syncs between clients
[TimeTrack Test] Client A synced

[chromium] › e2e/tests/sync/supersync.spec.ts:724:7 › @supersync SuperSync E2E › 5.1 Archived tasks appear in worklog on both clients
[Archive Test] Client B synced (uploaded archive)

[chromium] › e2e/tests/sync/supersync.spec.ts:1033:7 › @supersync SuperSync E2E › 7.1 Three clients achieve eventual consistency
[3-Client Test] Client B received Task-1

[chromium] › e2e/tests/sync/supersync.spec.ts:512:7 › @supersync SuperSync E2E › 4.1 Complex chain of actions syncs correctly
[Chain Test] Client B received done status and new subtask

[chromium] › e2e/tests/sync/supersync.spec.ts:724:7 › @supersync SuperSync E2E › 5.1 Archived tasks appear in worklog on both clients
[Archive Test] Client A synced (downloaded archive)

[Archive Test] Client A navigated to worklog

[chromium] › e2e/tests/sync/supersync.spec.ts:512:7 › @supersync SuperSync E2E › 4.1 Complex chain of actions syncs correctly
[Chain Test] Client B added subtask: Testing-1765368698503

[chromium] › e2e/tests/sync/supersync.spec.ts:724:7 › @supersync SuperSync E2E › 5.1 Archived tasks appear in worklog on both clients
[Archive Test] Client B navigated to worklog

[chromium] › e2e/tests/sync/supersync.spec.ts:1033:7 › @supersync SuperSync E2E › 7.1 Three clients achieve eventual consistency
[3-Client Test] Client B created: Task2-1765368705251

[3-Client Test] Phase 3: Client C syncs, creates Task-3, renames Task-1

[chromium] › e2e/tests/sync/supersync.spec.ts:512:7 › @supersync SuperSync E2E › 4.1 Complex chain of actions syncs correctly
[Chain Test] Client B marked Testing-1765368698503 as done

[chromium] › e2e/tests/sync/supersync.spec.ts:895:7 › @supersync SuperSync E2E › 6.1 Time tracking syncs between clients
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[SuperSyncPage] Conflict dialog detected, using remote...

[SuperSyncPage] Clicking Apply to apply resolution...

[chromium] › e2e/tests/sync/supersync.spec.ts:724:7 › @supersync SuperSync E2E › 5.1 Archived tasks appear in worklog on both clients
[Archive Test] Client A worklog has both tasks

[Archive Test] Client B worklog has both tasks

[Archive Test] ✓ All verifications passed!

[chromium] › e2e/tests/sync/supersync.spec.ts:1033:7 › @supersync SuperSync E2E › 7.1 Three clients achieve eventual consistency
[SuperSyncPage] Initial sync started automatically, waiting for completion...

[SuperSyncPage] Conflict dialog detected, using remote...

[chromium] › e2e/tests/sync/supersync.spec.ts:512:7 › @supersync SuperSync E2E › 4.1 Complex chain of actions syncs correctly
[Chain Test] Verifying final state...

[Chain Test] ✓ All verifications passed!

[chromium] › e2e/tests/sync/supersync.spec.ts:1033:7 › @supersync SuperSync E2E › 7.1 Three clients achieve eventual consistency
[SuperSyncPage] Clicking Apply to apply resolution...

[chromium] › e2e/tests/sync/supersync.spec.ts:895:7 › @supersync SuperSync E2E › 6.1 Time tracking syncs between clients
[TimeTrack Test] Client B synced

[chromium] › e2e/tests/sync/supersync.spec.ts:1033:7 › @supersync SuperSync E2E › 7.1 Three clients achieve eventual consistency
[3-Client Test] Client C received Task-1

[chromium] › e2e/tests/sync/supersync.spec.ts:895:7 › @supersync SuperSync E2E › 6.1 Time tracking syncs between clients
[TimeTrack Test] Client B shows time: -

[TimeTrack Test] Time values match on both clients

[TimeTrack Test] ✓ All verifications passed!

[chromium] › e2e/tests/sync/supersync.spec.ts:1033:7 › @supersync SuperSync E2E › 7.1 Three clients achieve eventual consistency
[3-Client Test] Client C created: Task3-1765368705251

[3-Client Test] Client C renamed Task-1 to: Task1-Renamed-1765368705251

[3-Client Test] Phase 4: Client B syncs (uploads Task-2)

[3-Client Test] Client B synced

[3-Client Test] Phase 5: Client C syncs

[3-Client Test] Client C received Task-2

[3-Client Test] Phase 6: Client A syncs

[3-Client Test] Client A received all updates

[3-Client Test] Phase 7: Client B syncs

[3-Client Test] Client B received all updates

[3-Client Test] Phase 8: Verifying eventual consistency

[3-Client Test] Client A task count: 3

[3-Client Test] Client B task count: 3

[3-Client Test] Client C task count: 3

[3-Client Test] Task-1 (renamed) exists on all clients

[3-Client Test] Task-2 exists on all clients

[3-Client Test] Task-3 exists on all clients

[3-Client Test] ✓ All three clients have identical state!

[3-Client Test] ✓ Eventual consistency achieved!

  4 skipped
  22 passed (2.3m) failures.
2025-12-12 20:48:40 +01:00
Johannes Millan
b6fc65831c feat(superSync): implement prisma and postgres 2025-12-12 20:48:38 +01:00
Johannes Millan
5ec4cc6444 test(sync): add offline queue persistence tests for OperationLogStoreService
Add tests for previously untested methods:
- appendBatch: batch append operations in single transaction
- getOpById: retrieve operation entry by ID
- markApplied: update application status from pending to applied
- getPendingRemoteOps: get pending remote ops for crash recovery
- markFailed: increment retry count and handle max retries
- getFailedRemoteOps: get failed remote operations

Also add:
- Crash recovery scenario tests
- AppliedOpIds cache invalidation tests
2025-12-12 20:48:12 +01:00