Frontend Testanforderungen: Admin Dashboard
Version: 1.0 | Stand: 30. Dezember 2025
Übersicht
Dieses Dokument beschreibt alle Tests für das Admin Dashboard und seine Sektionen.
1. Admin Dashboard (/admin)
Komponente: AdminDashboard.vue
Priorität: P0
Permission: Admin-Rolle oder chatbot_manager
Zugriffs-Tests
| ID |
Test |
Erwartung |
Art |
| ADM-001 |
Admin sieht alle Tabs |
Alle Sektionen sichtbar |
E2E |
| ADM-002 |
Chatbot_Manager Tabs |
Nur Chatbot + RAG Tabs |
E2E |
| ADM-003 |
Researcher keinen Zugang |
Redirect oder 403 |
E2E |
| ADM-004 |
Evaluator keinen Zugang |
Redirect oder 403 |
E2E |
| ADM-005 |
Tab-Navigation |
Tabs wechseln korrekt |
E2E |
| ADM-006 |
URL Query-Param |
?tab= lädt korrekten Tab |
E2E |
| ADM-007 |
Staggered Loading |
Sections laden nacheinander |
E2E |
E2E Test-Code
// e2e/admin/dashboard.spec.ts
import { test, expect, testUsers, login } from '../fixtures/auth'
test.describe('Admin Dashboard Access', () => {
test('ADM-001: admin sees all tabs', async ({ page }) => {
await login(page, testUsers.admin)
await page.goto('/admin')
await expect(page.locator('[data-tab="overview"]')).toBeVisible()
await expect(page.locator('[data-tab="docker"]')).toBeVisible()
await expect(page.locator('[data-tab="db"]')).toBeVisible()
await expect(page.locator('[data-tab="users"]')).toBeVisible()
await expect(page.locator('[data-tab="permissions"]')).toBeVisible()
})
test('ADM-003: researcher cannot access', async ({ page }) => {
await login(page, testUsers.researcher)
await page.goto('/admin')
// Sollte nicht auf /admin bleiben
await expect(page).not.toHaveURL(/.*admin/)
})
test('ADM-004: evaluator cannot access', async ({ page }) => {
await login(page, testUsers.evaluator)
await page.goto('/admin')
await expect(page).not.toHaveURL(/.*admin/)
})
})
2. Docker Monitor
Komponente: AdminDockerMonitorSection.vue
Socket.IO Namespace: /admin
Permission: admin:system:configure
Container Status Tests
| ID |
Test |
Erwartung |
Art |
| DOCKER-001 |
Sektion lädt |
Container-Liste sichtbar |
E2E |
| DOCKER-002 |
Container Count |
Anzahl korrekt |
E2E |
| DOCKER-003 |
Status Badges |
running/exited/unhealthy |
E2E |
| DOCKER-004 |
CPU Usage |
Prozent angezeigt |
E2E |
| DOCKER-005 |
Memory Usage |
MB/GB angezeigt |
E2E |
| DOCKER-006 |
Network I/O |
RX/TX Bytes |
E2E |
| DOCKER-007 |
Refresh |
Stats aktualisieren |
E2E |
| DOCKER-008 |
Scope Filter |
Project/All Filter |
E2E |
Charts Tests
| ID |
Test |
Erwartung |
Art |
| DOCKER-C01 |
CPU Chart |
Live-Chart aktualisiert |
E2E |
| DOCKER-C02 |
Memory Chart |
Live-Chart aktualisiert |
E2E |
| DOCKER-C03 |
Chart History |
60 Datenpunkte |
E2E |
| DOCKER-C04 |
Chart Hover |
Tooltip mit Wert |
E2E |
Logs Tests
| ID |
Test |
Erwartung |
Art |
| DOCKER-L01 |
Logs Tab |
Log-Viewer sichtbar |
E2E |
| DOCKER-L02 |
Container auswählen |
Logs für Container |
E2E |
| DOCKER-L03 |
Log Streaming |
Neue Logs erscheinen |
E2E |
| DOCKER-L04 |
Tail Selector |
100/500/1000 Lines |
E2E |
| DOCKER-L05 |
Log Pause |
Streaming pausierbar |
E2E |
| DOCKER-L06 |
ANSI Colors |
Farben korrekt |
E2E |
| DOCKER-L07 |
Log Search |
Filter funktioniert |
E2E |
E2E Test-Code
// e2e/admin/docker-monitor.spec.ts
import { test, expect } from '../fixtures/auth'
test.describe('Docker Monitor', () => {
test('DOCKER-001: shows container list', async ({ adminPage }) => {
await adminPage.goto('/admin?tab=docker')
await expect(adminPage.locator('.container-table')).toBeVisible({ timeout: 10000 })
await expect(adminPage.locator('.container-row')).toHaveCount(1, { min: true })
})
test('DOCKER-003: status badges shown', async ({ adminPage }) => {
await adminPage.goto('/admin?tab=docker')
const statusBadge = adminPage.locator('.status-badge >> nth=0')
await expect(statusBadge).toBeVisible()
await expect(statusBadge).toHaveText(/running|exited|restarting/)
})
test('DOCKER-L03: log streaming works', async ({ adminPage }) => {
await adminPage.goto('/admin?tab=docker')
// Logs Tab öffnen
await adminPage.click('[data-tab="logs"]')
// Container wählen
await adminPage.selectOption('.container-select', { index: 0 })
// Warten auf erste Logs
await expect(adminPage.locator('.log-line')).toHaveCount(1, { min: true, timeout: 10000 })
})
})
3. Database Explorer
Komponente: AdminDatabaseSection.vue
Socket.IO Namespace: /admin
Permission: admin:system:configure
Table List Tests
| ID |
Test |
Erwartung |
Art |
| DB-001 |
Sektion lädt |
Table-Liste sichtbar |
E2E |
| DB-002 |
Table Count |
Anzahl Tabellen korrekt |
E2E |
| DB-003 |
Row Count |
Zeilen pro Tabelle |
E2E |
| DB-004 |
Table Search |
Filter funktioniert |
E2E |
| DB-005 |
Table wählen |
Daten werden geladen |
E2E |
Table Viewer Tests
| ID |
Test |
Erwartung |
Art |
| DB-V01 |
Columns angezeigt |
Spalten-Header |
E2E |
| DB-V02 |
Rows angezeigt |
Datenzeilen |
E2E |
| DB-V03 |
Row Limit |
1-200 Zeilen einstellbar |
E2E |
| DB-V04 |
Search in Table |
Filter über Zeilen |
E2E |
| DB-V05 |
Null Values |
"null" formatiert |
E2E |
| DB-V06 |
Boolean Values |
true/false formatiert |
E2E |
| DB-V07 |
JSON Objects |
Formatiert angezeigt |
E2E |
| DB-V08 |
Long Text |
Truncated (100 chars) |
E2E |
| DB-V09 |
Refresh |
Daten neu laden |
E2E |
| DB-V10 |
Polling |
Auto-Update alle 1.5s |
E2E |
E2E Test-Code
// e2e/admin/db-explorer.spec.ts
import { test, expect } from '../fixtures/auth'
test.describe('Database Explorer', () => {
test('DB-001: shows table list', async ({ adminPage }) => {
await adminPage.goto('/admin?tab=db')
await expect(adminPage.locator('.table-list')).toBeVisible({ timeout: 10000 })
await expect(adminPage.locator('.table-item')).toHaveCount(1, { min: true })
})
test('DB-005: selecting table loads data', async ({ adminPage }) => {
await adminPage.goto('/admin?tab=db')
// Erste Tabelle wählen
await adminPage.click('.table-item >> nth=0')
// Daten erscheinen
await expect(adminPage.locator('.data-table')).toBeVisible({ timeout: 10000 })
await expect(adminPage.locator('.data-row')).toHaveCount(1, { min: true })
})
})
4. System Health
Komponente: AdminSystemHealthSection.vue
Permission: admin:system:configure
Host Metrics Tests
| ID |
Test |
Erwartung |
Art |
| HEALTH-001 |
Tab lädt |
Metriken sichtbar |
E2E |
| HEALTH-002 |
CPU % |
CPU-Auslastung |
E2E |
| HEALTH-003 |
Memory % |
RAM-Auslastung |
E2E |
| HEALTH-004 |
Disk I/O |
Lese/Schreib-Raten |
E2E |
| HEALTH-005 |
Network |
Interface-Stats |
E2E |
| HEALTH-006 |
Process List |
Top-Prozesse |
E2E |
| HEALTH-007 |
Refresh |
Auto-Update 2s |
E2E |
| ID |
Test |
Erwartung |
Art |
| HEALTH-A01 |
API Tab |
Metriken sichtbar |
E2E |
| HEALTH-A02 |
Request Count |
Anzahl Requests |
E2E |
| HEALTH-A03 |
Response Times |
min/max/avg |
E2E |
| HEALTH-A04 |
Error Rates |
Status-Code Breakdown |
E2E |
| HEALTH-A05 |
Time Window |
1min/5min/15min/1h |
E2E |
WebSocket Stats Tests
| ID |
Test |
Erwartung |
Art |
| HEALTH-W01 |
WS Tab |
Stats sichtbar |
E2E |
| HEALTH-W02 |
Connections |
Pro Namespace |
E2E |
| HEALTH-W03 |
Messages |
Throughput |
E2E |
| HEALTH-W04 |
Connect/Disconnect |
Rates angezeigt |
E2E |
5. System Events
Komponente: AdminSystemMonitorSection.vue
Permission: admin:system:configure
Event Log Tests
| ID |
Test |
Erwartung |
Art |
| EVENT-001 |
Log lädt |
Event-Liste sichtbar |
E2E |
| EVENT-002 |
Event Details |
Type, User, Time |
E2E |
| EVENT-003 |
Severity |
Info/Warning/Error |
E2E |
| EVENT-004 |
Filter by Type |
Type-Filter funktioniert |
E2E |
| EVENT-005 |
Search |
Text-Suche |
E2E |
| EVENT-006 |
Pagination |
Mehr Events laden |
E2E |
6. System Settings
Komponente: AdminSystemSettingsSection.vue
Permission: admin:system:configure
Settings Tests
| ID |
Test |
Erwartung |
Art |
| SETTINGS-001 |
Form lädt |
Alle Felder sichtbar |
E2E |
| SETTINGS-002 |
Crawler Timeout |
60-86400s Range |
E2E |
| SETTINGS-003 |
Embedding Timeout |
60-86400s Range |
E2E |
| SETTINGS-004 |
Max Pages |
1-10000 Range |
E2E |
| SETTINGS-005 |
Max Depth |
1-10 Range |
E2E |
| SETTINGS-006 |
Chunk Size |
100-10000 Range |
E2E |
| SETTINGS-007 |
Chunk Overlap |
0-5000 Range |
E2E |
| SETTINGS-008 |
Speichern |
API-Call erfolgreich |
E2E |
| SETTINGS-009 |
Validation |
Out-of-Range Fehler |
E2E |
| SETTINGS-010 |
Event logged |
Änderung in Events |
E2E |
7. User Management
Komponente: AdminUsersSection.vue
Permission: admin:users:manage
User List Tests
| ID |
Test |
Erwartung |
Art |
| USER-001 |
Liste lädt |
User-Tabelle sichtbar |
E2E |
| USER-002 |
User Search |
Filter funktioniert |
E2E |
| USER-003 |
Role Filter |
Nach Rolle filtern |
E2E |
| USER-004 |
Status angezeigt |
Active/Locked/Deleted |
E2E |
| USER-005 |
Rollen angezeigt |
User-Rollen sichtbar |
E2E |
User CRUD Tests
| ID |
Test |
Erwartung |
Art |
| USER-C01 |
User erstellen |
Dialog öffnet |
E2E |
| USER-C02 |
Username eingeben |
Validierung |
E2E |
| USER-C03 |
Rollen zuweisen |
Multi-Select |
E2E |
| USER-C04 |
User speichern |
In DB angelegt |
E2E |
| USER-C05 |
User editieren |
Dialog mit Daten |
E2E |
| USER-C06 |
User sperren |
Status = locked |
E2E |
| USER-C07 |
User entsperren |
Status = active |
E2E |
| USER-C08 |
User löschen |
Soft-Delete |
E2E |
| USER-C09 |
Collab-Farbe |
Color Picker |
E2E |
| USER-C10 |
Avatar Seed |
Avatar ändert sich |
E2E |
E2E Test-Code
// e2e/admin/user-management.spec.ts
import { test, expect } from '../fixtures/auth'
test.describe('User Management', () => {
test('USER-001: shows user list', async ({ adminPage }) => {
await adminPage.goto('/admin?tab=users')
await expect(adminPage.locator('.user-table')).toBeVisible()
await expect(adminPage.locator('.user-row')).toHaveCount(1, { min: true })
})
test('USER-C06: lock user', async ({ adminPage }) => {
await adminPage.goto('/admin?tab=users')
// User-Zeile finden
await adminPage.click('.user-row:has-text("evaluator") .action-lock')
// Bestätigen
await adminPage.click('button:has-text("Sperren")')
// Status prüfen
await expect(adminPage.locator('.user-row:has-text("evaluator") .status-badge')).toContainText('gesperrt')
})
test('USER-C04: create user', async ({ adminPage }) => {
await adminPage.goto('/admin?tab=users')
await adminPage.click('button:has-text("Neuer User")')
await adminPage.fill('input[name="username"]', 'testuser_e2e')
await adminPage.selectOption('select[name="roles"]', 'evaluator')
await adminPage.click('button:has-text("Erstellen")')
await expect(adminPage.locator('.v-snackbar')).toContainText('erstellt')
})
})
8. Scenario Management
Komponente: AdminScenariosSection.vue
Permission: Admin-Rolle
Scenario List Tests
| ID |
Test |
Erwartung |
Art |
| SCEN-001 |
Liste lädt |
Scenario-Tabelle |
E2E |
| SCEN-002 |
Status-Filter |
aktiv/ausstehend/beendet |
E2E |
| SCEN-003 |
Typ angezeigt |
Rating/Ranking/Mail |
E2E |
| SCEN-004 |
Zeitraum |
Begin/End Datum |
E2E |
| SCEN-005 |
User Count |
Assigned Users |
E2E |
Scenario CRUD Tests
| ID |
Test |
Erwartung |
Art |
| SCEN-C01 |
Neues Szenario |
Dialog öffnet |
E2E |
| SCEN-C02 |
Name eingeben |
Validierung |
E2E |
| SCEN-C03 |
Typ wählen |
Dropdown |
E2E |
| SCEN-C04 |
Zeitraum wählen |
Date Picker |
E2E |
| SCEN-C05 |
Threads hinzufügen |
Multi-Select |
E2E |
| SCEN-C06 |
Users hinzufügen |
RATER/EVALUATOR |
E2E |
| SCEN-C07 |
Distribution Mode |
all/round_robin |
E2E |
| SCEN-C08 |
Order Mode |
none/shuffle |
E2E |
| SCEN-C09 |
Speichern |
In DB angelegt |
E2E |
| SCEN-C10 |
Editieren |
Änderungen speichern |
E2E |
| SCEN-C11 |
Löschen |
Szenario entfernt |
E2E |
E2E Test-Code
// e2e/admin/scenario-management.spec.ts
import { test, expect } from '../fixtures/auth'
test.describe('Scenario Management', () => {
test('SCEN-C09: create scenario', async ({ adminPage }) => {
await adminPage.goto('/admin?tab=scenarios')
await adminPage.click('button:has-text("Neues Szenario")')
await adminPage.fill('input[name="name"]', 'E2E Test Szenario')
await adminPage.selectOption('select[name="function_type"]', '1') // Ranking
await adminPage.fill('input[name="begin"]', '2025-01-01')
await adminPage.fill('input[name="end"]', '2025-12-31')
await adminPage.click('button:has-text("Erstellen")')
await expect(adminPage.locator('.v-snackbar')).toContainText('erstellt')
})
})
9. Chatbot Activity
Komponente: AdminChatbotActivitySection.vue
Permission: admin:system:configure
Activity Tests
| ID |
Test |
Erwartung |
Art |
| ACTIVITY-001 |
Panel lädt |
Activity-Liste |
E2E |
| ACTIVITY-002 |
User angezeigt |
Aktive User |
E2E |
| ACTIVITY-003 |
Chatbot angezeigt |
Genutzte Bots |
E2E |
| ACTIVITY-004 |
Message Count |
Nachrichten-Anzahl |
E2E |
| ACTIVITY-005 |
Real-time |
Live-Updates |
E2E |
10. Analytics Settings
Komponente: AdminAnalyticsSection.vue
Permission: admin:system:configure
Matomo Config Tests
| ID |
Test |
Erwartung |
Art |
| ANALYTICS-001 |
Form lädt |
Alle Felder |
E2E |
| ANALYTICS-002 |
Matomo URL |
URL-Input |
E2E |
| ANALYTICS-003 |
Site ID |
Nummer |
E2E |
| ANALYTICS-004 |
Enable/Disable |
Toggle |
E2E |
| ANALYTICS-005 |
Tracking Options |
Checkboxen |
E2E |
| ANALYTICS-006 |
Speichern |
API-Call |
E2E |
Checkliste für manuelle Tests
Admin Zugang
Docker Monitor
DB Explorer
System Health
System Events
System Settings
User Management
Szenarien
Letzte Aktualisierung: 30. Dezember 2025