Files
MindSift/e2e/README.md
T
sandrodachandClaude Opus 5.5 8b7a53daab
MindSift CI & Docker Release / Build, Test in Container & Push (push) Successful in 1m16s
feat(notes): push, long polling and fallback detection for note sync
Phase 4 of the collaboration plan:
- The sync engine listens for DOC_SEQ in the note's realtime room and syncs
  right away. Without WebSocket/SSE it long-polls /docs/{id}/changes (25 s);
  after three failures it falls back to polling every 3 s and retries long
  polling when the browser comes back online.
- With push or long polling the engine only syncs every 7 s while holding
  leases (renewal), otherwise every 30 s as a safety net. Focusing a block
  announces its lease immediately (otherwise it could take up to 30 s).
- Realtime connection: SSE counts as connected only after its first event;
  a stream that stays silent for 5 s (buffering proxy) switches SSE off for
  the tab. App-level PING/PONG detects WebSockets that are accepted but
  forward nothing and switches to SSE after 35 s.
- The editor shows the active channel for shared notes.
- Tests: engine channel tests (push, heartbeat, lease on focus, long
  polling, interval fallback, switching), realtime fallback tests with fake
  WebSocket/EventSource, Go tests for PONG and DOC_SEQ delivery, and
  e2e/channels.e2e.mjs measuring latency behind six simulated proxy setups
  (0.2-0.3 s on all live channels, ~3 s with plain polling).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 14:10:29 +01:00

2.1 KiB

Ende-zu-Ende-Tests

Browser-Tests mit Playwright gegen einen echten MindSift-Server.

e2e/run.sh            # baut das Image, startet es im Demo-Modus und führt die Tests aus
ENGINE=docker e2e/run.sh

Gegen einen bereits laufenden Server (Demo-Modus mit admin/admin und user/user nötig):

cd e2e && npm install && MINDSIFT_URL=http://localhost:8080 node collab.e2e.mjs

collab.e2e.mjs

Zwei Browser (Eigentümer und Bearbeiter) arbeiten in derselben Notiz. Geprüft wird:

  • Tippen wird gespeichert und erscheint beim anderen ohne Neuladen
  • neue Bullets per Enter, in beide Richtungen
  • Offline-Phase: Text bleibt lokal und wird nach Rückkehr übertragen
  • beide Browser und der Server zeigen denselben Stand, auch nach Neuladen
  • Sperren eines geschlossenen Browsers laufen nach spätestens 20 s ab
  • Einrücken (Tab) und Zusammenführen (Backspace) bleiben nach Neuladen erhalten

share.e2e.mjs

Der Eigentümer teilt eine Notiz über den Freigabe-Dialog mit Rolle „Bearbeiten“; geprüft wird, dass die Freigabe als write gespeichert, im Dialog als „Bearbeiter“ angezeigt wird und der Empfänger die Notiz bearbeiten kann.

lock.e2e.mjs

Sperren, Präsenz, Rückgängig und Konfliktkopien mit zwei Browsern: Schloss und Schreibschutz am fremd bearbeiteten Bullet, Hinweis statt halb ausgeführter Aktion, Strg+Z/Strg+Umschalt+Z, Tippen direkt nach Enter, Markierung von Konfliktkopien sowie „Übernehmen“ (verweigert bei fremder Sperre, erfolgreich für den Sperrinhaber).

channels.e2e.mjs

Der Eigentümer tippt mit normaler Verbindung, der Bearbeiter sitzt hinter einem simulierten Proxy. Für jede Situation wird der gewählte Weg und die Zeit bis zur Anzeige gemessen: nichts blockiert (WebSocket), WebSocket abgelehnt (SSE), WebSocket angenommen aber stumm (SSE nach Herzschlag-Ausfall), WebSocket und SSE blockiert sowie SSE hängend (Long-Polling), nur normale Anfragen (Abfrage alle 3 s).

collab.e2e.mjs, lock.e2e.mjs und channels.e2e.mjs dauern je etwa eine Minute. Die Tests laufen nicht in der CI, weil sie Browser-Images brauchen.