Frontend Testanforderungen: Kollaborative Editoren¶
Version: 1.0 | Stand: 30. Dezember 2025
Übersicht¶
Dieses Dokument beschreibt alle Tests für den kollaborativen Markdown-Editor (Markdown Collab).
1. Markdown Collab (/MarkdownCollab)¶
Komponenten: MarkdownCollabHome.vue, MarkdownCollabWorkspace.vue
Priorität: P1
Permissions: feature:markdown_collab:view, feature:markdown_collab:edit, feature:markdown_collab:share
Home Tests¶
| ID | Test | Erwartung | Art |
|---|---|---|---|
| MD-001 | Home lädt | Workspace-Liste sichtbar | E2E |
| MD-002 | Eigene Workspaces | Owner-Workspaces angezeigt | E2E |
| MD-003 | Geteilte Workspaces | Shared-Workspaces angezeigt | E2E |
| MD-004 | Neuer Workspace | Dialog öffnet | E2E |
| MD-005 | Workspace erstellen | Workspace in DB | E2E |
| MD-006 | Workspace löschen | Workspace entfernt | E2E |
| MD-007 | Workspace-Card | Metadata korrekt | E2E |
| MD-008 | Workspace öffnen | Editor lädt | E2E |
Workspace Tests¶
| ID | Test | Erwartung | Art |
|---|---|---|---|
| MD-W01 | Workspace lädt | Editor + Preview sichtbar | E2E |
| MD-W02 | Document Tree | Dateiliste links | E2E |
| MD-W03 | Document erstellen | Neues Dokument in Tree | E2E |
| MD-W04 | Document umbenennen | Name aktualisiert | E2E |
| MD-W05 | Document löschen | Dokument entfernt | E2E |
| MD-W06 | Document wechseln | Editor wechselt Inhalt | E2E |
| MD-W07 | Ordner erstellen | Ordner in Tree | E2E |
| MD-W08 | Member hinzufügen | User hat Zugriff | E2E |
| MD-W09 | Member entfernen | User verliert Zugriff | E2E |
| MD-W10 | Workspace verlassen | Redirect zu Home | E2E |
Editor Tests¶
| ID | Test | Erwartung | Art |
|---|---|---|---|
| MD-E01 | Text eingeben | Text erscheint | E2E |
| MD-E02 | Markdown formatieren | bold, italic funktioniert | E2E |
| MD-E03 | Preview aktualisiert | Live-Preview rendert | E2E |
| MD-E04 | Code-Block | Syntax Highlighting | E2E |
| MD-E05 | Link einfügen | Link klickbar in Preview | E2E |
| MD-E06 | Bild einfügen | Bild in Preview | E2E |
| MD-E07 | Tabelle | Tabelle rendert korrekt | E2E |
| MD-E08 | Heading | Überschriften-Hierarchie | E2E |
| MD-E09 | Undo/Redo | Ctrl+Z/Ctrl+Y funktioniert | E2E |
| MD-E10 | Auto-Save | Änderungen gespeichert | E2E |
Collaboration Tests (YJS)¶
| ID | Test | Erwartung | Art |
|---|---|---|---|
| MD-Y01 | Zwei User verbinden | Beide sehen Editor | E2E |
| MD-Y02 | Text synct | User B sieht User A Eingabe | E2E |
| MD-Y03 | Cursor Awareness | Remote Cursor sichtbar | E2E |
| MD-Y04 | User-Farbe | Collab-Farbe korrekt | E2E |
| MD-Y05 | Gleichzeitige Eingabe | Kein Conflict, CRDT merge | E2E |
| MD-Y06 | Reconnection | Nach Disconnect sync | E2E |
| MD-Y07 | Offline Eingabe | Nach Reconnect synct | E2E |
| MD-Y08 | User verlässt | Cursor verschwindet | E2E |
E2E Test-Code (Multi-User)¶
// e2e/collaboration/markdown-collab.spec.ts
import { test, expect } from '@playwright/test'
import { testUsers, login } from '../fixtures/auth'
test.describe('Markdown Collaboration', () => {
test('MD-Y02: real-time sync between users', async ({ browser }) => {
// User A Context
const contextA = await browser.newContext()
const pageA = await contextA.newPage()
await login(pageA, testUsers.researcher)
// User B Context
const contextB = await browser.newContext()
const pageB = await contextB.newPage()
await login(pageB, testUsers.admin)
// Beide öffnen gleichen Workspace
await pageA.goto('/MarkdownCollab/workspace/1')
await pageB.goto('/MarkdownCollab/workspace/1')
// User A tippt
await pageA.locator('.editor').type('Hello from User A')
// User B sieht es
await expect(pageB.locator('.editor')).toContainText('Hello from User A', {
timeout: 5000
})
await contextA.close()
await contextB.close()
})
test('MD-Y03: cursor awareness', async ({ browser }) => {
const contextA = await browser.newContext()
const pageA = await contextA.newPage()
await login(pageA, testUsers.researcher)
const contextB = await browser.newContext()
const pageB = await contextB.newPage()
await login(pageB, testUsers.admin)
await pageA.goto('/MarkdownCollab/workspace/1')
await pageB.goto('/MarkdownCollab/workspace/1')
// User A klickt in Editor
await pageA.locator('.editor').click()
// User B sieht Remote Cursor
await expect(pageB.locator('.remote-cursor')).toBeVisible({
timeout: 5000
})
await contextA.close()
await contextB.close()
})
})
2. User Settings: Collab-Farbe ändern¶
Komponente: User Settings Dialog
API: PATCH /api/users/me/settings
Tests¶
| ID | Test | Erwartung | Art |
|---|---|---|---|
| COLOR-001 | Settings öffnen | Color Picker sichtbar | E2E |
| COLOR-002 | Farbe wählen | Neue Farbe selektiert | E2E |
| COLOR-003 | Speichern | API-Call erfolgreich | E2E |
| COLOR-004 | Farbe persistent | Nach Reload gleiche Farbe | E2E |
| COLOR-005 | In Collab sichtbar | Remote Cursor hat neue Farbe | E2E |
| COLOR-006 | Avatar-Änderung | Neuer Avatar generierbar | E2E |
| COLOR-007 | Avatar-Limit | Max 3 Änderungen/Tag | E2E |
E2E Test-Code¶
// e2e/user/settings.spec.ts
import { test, expect } from '../fixtures/auth'
test.describe('User Settings', () => {
test('COLOR-003: change collab color', async ({ authenticatedPage }) => {
// User Menu öffnen
await authenticatedPage.click('[data-testid="user-menu"]')
await authenticatedPage.click('text=Einstellungen')
// Color Picker
const colorInput = authenticatedPage.locator('input[type="color"]')
await colorInput.fill('#FF5733')
// Speichern
await authenticatedPage.click('button:has-text("Speichern")')
// Success
await expect(authenticatedPage.locator('.v-snackbar')).toContainText('gespeichert')
})
})
Checkliste für manuelle Tests¶
Markdown Collab¶
- Workspace erstellen/löschen
- Dokumente erstellen/bearbeiten/löschen
- Ordner-Struktur
- Member hinzufügen/entfernen
- Multi-User Sync (2+ Browser)
- Cursor Awareness sichtbar
- Offline-Eingabe synct nach Reconnect
- Preview rendert korrekt
Collab-Farbe¶
- Farbe änderbar in Settings
- Farbe wird in Collab-Session angezeigt
- Avatar änderbar (max 3x/Tag)
Letzte Aktualisierung: 30. Dezember 2025