MindSift CI & Docker Release / Build, Test in Container & Push (push) Successful in 1m16s
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>
40 lines
2.1 KiB
Markdown
40 lines
2.1 KiB
Markdown
# Ende-zu-Ende-Tests
|
|
|
|
Browser-Tests mit Playwright gegen einen echten MindSift-Server.
|
|
|
|
```bash
|
|
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):
|
|
|
|
```bash
|
|
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.
|