# Teststrategie für TipTap Markdown-Migration
## Zusammenfassung der Analyse
Die TipTap-Migration umfasst folgende Kernkomponenten:
| Komponente | Beschreibung | Komplexität |
|------------|--------------|-------------|
| `lib/src/Components/TipTap/utils/preprocessMarkdown.ts` | 6-stufige Preprocessing-Pipeline | Hoch |
| `lib/src/Components/TipTap/utils/simpleMarkdownToHtml.tsx` | Statische HTML-Konvertierung | Mittel |
| `lib/src/Components/TipTap/extensions/Hashtag.tsx` | Custom Extension mit Tokenizer | Mittel |
| `lib/src/Components/TipTap/extensions/ItemMention.tsx` | Custom Extension mit Tokenizer | Mittel |
| `lib/src/Components/TipTap/extensions/VideoEmbed.tsx` | Block-Element für Videos | Mittel |
| `lib/src/Components/Input/RichTextEditor.tsx` | Haupt-Editor-Komponente | Hoch |
| `lib/src/Components/Map/Subcomponents/ItemPopupComponents/TextView.tsx` | Read-Only Editor | Mittel |
| `lib/src/Components/Map/Subcomponents/ItemPopupComponents/TextViewStatic.tsx` | Lightweight Static Renderer | Niedrig |
---
## Empfohlene Teststrategie: Testing Pyramid
```
┌─────────────────┐
│ E2E Tests │ ← Wenige, kritische User Journeys
│ (Cypress) │
└────────┬────────┘
│
┌────────┴────────┐
│ Integration │ ← TipTap + Extensions zusammen
│ Tests (Vitest) │
└────────┬────────┘
│
┌───────────────────┴───────────────────┐
│ Unit Tests (Vitest) │ ← Utility-Funktionen isoliert
│ preprocessMarkdown, simpleMarkdownToHtml │
└────────────────────────────────────────┘
```
### Begründung der Strategie
1. **Unit Tests für Utility-Funktionen (Hauptfokus)**
- `preprocessMarkdown.ts` und `simpleMarkdownToHtml.tsx` sind **pure Funktionen** ohne Abhängigkeiten
- Extrem schnelle Ausführung, hohe Coverage möglich
- Einfach zu warten und zu debuggen
- Hier liegt die meiste **Geschäftslogik** der Markdown-Verarbeitung
2. **Integration Tests für TipTap Extensions**
- Extensions benötigen einen Editor-Kontext
- Testen der Markdown ↔ JSON ↔ HTML Roundtrips
- Mäßiger Aufwand, gute Fehlererkennung
3. **E2E Tests nur für kritische User Journeys**
- Hoher Wartungsaufwand
- Langsame Ausführung
- Für Smoke Tests und Regressionsschutz
---
## Detaillierte Testfälle
### 1. Unit Tests für `preprocessMarkdown.ts`
#### A) `convertNakedUrls`
| Testfall | Input | Expected Output |
|----------|-------|-----------------|
| **Happy Path** | `Check https://example.com out` | `Check [example.com](https://example.com) out` |
| **www entfernen** | `https://www.example.com` | `[example.com](https://example.com)` |
| **URL in Markdown-Link (Skip)** | `[link](https://example.com)` | Unverändert |
| **URL in Autolink (Skip)** | `Title
` |
| **Header H2-H6** | `## ... ######` | Entsprechende h-Tags |
| **Inline Code** | `` `code` `` | `code` |
| **Blockquote** | `> quote` | `quote
` |
| **Video Embed** | `
` Trennung | --- ### 3. Integration Tests für TipTap Extensions Diese Tests benötigen einen TipTap Editor-Kontext. Setup via `@tiptap/core`: ```typescript // Test-Setup Beispiel import { Editor } from '@tiptap/core' import StarterKit from '@tiptap/starter-kit' import { Markdown } from '@tiptap/markdown' import { Hashtag } from './Hashtag' ``` #### A) Hashtag Extension | Testfall | Beschreibung | |----------|--------------| | **Markdown → JSON** | `#tag` wird zu `{ type: 'hashtag', attrs: { label: 'tag' } }` | | **JSON → Markdown** | Hashtag-Node wird zu `#tag` serialisiert | | **HTML Parse** | `#x` wird erkannt | | **HTML Render** | Node rendert korrekte HTML-Struktur | | **Tokenizer Start** | `/(? { it('should create and save content with hashtags and mentions', () => { // 1. Neues Item erstellen // 2. Text eingeben mit #tag und @mention // 3. Speichern // 4. Popup öffnen und Rendering prüfen }) it('should handle video embeds', () => { // YouTube URL einfügen → Video-Embed sichtbar }) }) ``` #### B) Display Flow ```typescript describe('Text Display', () => { it('should render hashtags clickable in popup', () => { // Item mit Hashtag öffnen // Hashtag klicken // Filter wird aktiviert }) it('should navigate to mentioned items', () => { // Item mit @mention öffnen // Mention klicken // Navigation zum verlinkten Item }) }) ``` --- ## Priorisierung der Implementierung ### Phase 1: Unit Tests (Höchste Priorität) | Datei | Geschätzte Tests | Grund | |-------|------------------|-------| | `preprocessMarkdown.spec.ts` | ~40 Tests | Pure Functions, schnell, hohe Coverage | | `simpleMarkdownToHtml.spec.ts` | ~25 Tests | Pure Function, XSS-kritisch | ### Phase 2: Integration Tests | Datei | Geschätzte Tests | Grund | |-------|------------------|-------| | `Hashtag.spec.ts` | ~15 Tests | Custom Extension mit Tokenizer | | `ItemMention.spec.ts` | ~15 Tests | Custom Extension mit Tokenizer | | `VideoEmbed.spec.ts` | ~10 Tests | Block-Element | ### Phase 3: Component Tests | Datei | Geschätzte Tests | Grund | |-------|------------------|-------| | `RichTextEditor.spec.tsx` | ~15 Tests | Haupt-Editor | | `TextView.spec.tsx` | ~10 Tests | Read-Only Variante | | `TextViewStatic.spec.tsx` | ~8 Tests | Lightweight Renderer | ### Phase 4: E2E Tests (Niedrigste Priorität) | Datei | Geschätzte Tests | Grund | |-------|------------------|-------| | `editor-flow.cy.ts` | 3-5 Tests | Kritische User Journey | --- ## Edge Cases und Error Handling ### Besonders wichtige Grenzfälle 1. **Leerer Input** - Alle Funktionen sollten mit `''`, `null`, `undefined` umgehen 2. **Sehr langer Text** - Performance bei >10.000 Zeichen 3. **Verschachtelte Syntax** - `**#bold-hashtag**`, `[[@mention](/item/x)](url)` 4. **Unicode** - Emojis, RTL-Text, Sonderzeichen 5. **Malformed Markdown** - Ungeschlossene Tags: `**bold`, `[link(` 6. **XSS Vectors** - `