KI-Konzil/_bmad-output/implementation-artifacts/qa-e2e-tests.md
copilot-swe-agent[bot] 3be3cb73b6 Add all BMAD skill artifacts: epics, stories, sprint-status, QA tests, project-context, readiness report
Co-authored-by: Kenearos <86194771+Kenearos@users.noreply.github.com>
2026-03-12 14:26:40 +00:00

159 lines
4.9 KiB
Markdown

---
inputDocuments:
- _bmad-output/planning-artifacts/epics.md
- _bmad-output/planning-artifacts/architecture.md
- backend/tests/
bmadSkill: 'QA Agent (Quinn) — /bmad-agent-bmm-qa → [QE] Generate E2E Tests'
bmadWorkflow: '_bmad/bmm/workflows/qa-generate-e2e-tests/workflow.yaml'
---
<!-- 🧪 Generated by BMAD QA Skill — Agent: Quinn (QA Engineer) -->
<!-- Skill Command: /bmad-agent-bmm-qa → Generate E2E Tests -->
<!-- Workflow: _bmad/bmm/workflows/qa-generate-e2e-tests/workflow.yaml -->
# QA E2E Test-Manifest — CouncilOS
**Autor:** Quinn (🧪 BMAD QA Agent)
**Datum:** 2026-03-12
---
## 1. Bestehende Unit-Tests (Backend)
| Datei | Beschreibung | Status |
|-------|-------------|--------|
| `backend/tests/test_state.py` | CouncilState-Reducer, operator.add | ✅ |
| `backend/tests/test_routing.py` | Routing-Logik (score < 8, 8, safety valve) | |
| `backend/tests/test_api.py` | Health-Check, Run-Endpunkte (httpx AsyncClient) | |
| `backend/tests/test_blueprint_api.py` | Blueprint CRUD REST-API | |
| `backend/tests/test_blueprint_service.py` | Blueprint-Service-Layer | |
| `backend/tests/test_dynamic_graph_builder.py` | Dynamischer Graph-Builder | |
| `backend/tests/test_god_mode.py` | Human-in-the-Loop (approve/reject/modify) | |
| `backend/tests/test_run_service.py` | Run-History-Service | |
| `backend/tests/test_run_store.py` | In-Memory-Run-Store | |
| `backend/tests/test_tools.py` | Web-Search und PDF-Reader (gemockt) | |
## 2. Frontend-Unit-Tests
| Datei | Beschreibung | Status |
|-------|-------------|--------|
| `frontend/app/__tests__/` | Vitest-Tests für React-Komponenten | |
---
## 3. E2E-Test-Szenarien (für Playwright / Cypress — Post-MVP)
### TC-E2E-001: Council erstellen und ausführen (Happy Path)
**Voraussetzung:** Backend läuft auf Port 8000, Frontend auf 3000
**Schritte:**
1. Öffne `http://localhost:3000`
2. Wechsel zum Tab Rat-Architekt"
3. Ziehe einen Agent-Node auf den Canvas
4. Setze Name: Test Master", System-Prompt: Du bist ein Test-Agent"
5. Ziehe einen zweiten Node (Critic)
6. Verbinde die Nodes mit einer linearen Edge
7. Klicke Speichern" Bestätigungsmeldung erscheint
8. Wechsel zum Tab Konferenzzimmer"
9. Gib Prompt: Schreibe einen kurzen Test-Text" ein
10. Wähle Auto-Pilot"
11. Klicke Starten"
12. Beobachte: Erster Node pulsiert gelb
13. Nach Abschluss: Finaler Text erscheint im Output-Bereich
**Erwartetes Ergebnis:** Run erreicht `status=completed`, `final_draft` nicht leer
---
### TC-E2E-002: God Mode — Approve
**Schritte:**
1. Wähle God Mode" im Toggle
2. Starte Run mit beliebigem Prompt
3. Nach erstem Node: Overlay erscheint
4. Klicke Genehmigen"
5. Nächster Node startet (pulsiert)
6. Bis Abschluss: alle Nodes genehmigen
**Erwartetes Ergebnis:** Run erreicht `status=completed`
---
### TC-E2E-003: God Mode — Reject
**Schritte:**
1. Starte Run in God Mode
2. Overlay erscheint
3. Klicke Ablehnen"
**Erwartetes Ergebnis:** Run `status=failed`, Fehlermeldung Rejected by user" sichtbar
---
### TC-E2E-004: PDF-Upload und Verwendung
**Schritte:**
1. Öffne `POST /api/councils/upload-pdf` mit Test-PDF
2. Response enthält `chunks_ingested > 0`
3. Erstelle Council mit Agent, der `pdf_reader=true` hat
4. Starte Run mit Thema aus dem PDF
5. Agent-Output referenziert PDF-Inhalte
**Erwartetes Ergebnis:** Chunks werden korrekt eingelesen und sind abrufbar
---
### TC-E2E-005: WebSocket-Events in korrekter Reihenfolge
**Schritte:**
1. Verbinde mit `WS /ws/council/{run_id}`
2. Starte Run
3. Zeichne alle empfangenen Events auf
**Erwartetes Ergebnis:**
```
{"node": "master_agent", "status": "running"}
{"node": "master_agent", "status": "completed"}
{"node": "critic_agent", "status": "running"}
{"node": "critic_agent", "status": "completed"}
... (ggf. Schleife)
{"node": "writer_agent", "status": "running"}
{"node": "writer_agent", "status": "completed"}
{"status": "done"}
```
---
## 4. Test-Mocking-Konventionen
```python
# Standard-Mock-Pattern für alle Agent-Tests (CLAUDE.md-Anforderung)
from unittest.mock import patch, MagicMock
@patch("agents.master_agent.ChatAnthropic")
def test_master_agent_node_appends_to_messages(mock_llm):
mock_llm.return_value.invoke.return_value = MagicMock(content="Draft v2")
state = {...}
result = master_agent_node(state)
assert result["current_draft"] == "Draft v2"
```
**Regeln (aus CLAUDE.md):**
- Niemals echte LLM-API-Aufrufe in Tests
- Kein shared Test-Datenbankzustand (Transactions rollback)
- Kein Snapshot-Test für React Flow Canvas
- Immer beide Seiten der Threshold-Grenze testen (7.9 und 8.0)
---
## 5. Coverage-Ziele
| Modul | Ziel-Coverage |
|-------|--------------|
| `backend/state.py` | 90 % |
| `backend/services/graph_builder.py` | 90 % |
| `backend/services/dynamic_graph_builder.py` | 85 % |
| `backend/agents/` | 80 % |
| `backend/api/` | 75 % |
| `backend/tools/` | 75 % |