# 0023 — Seccion de tests en el dashboard ## Objetivo Añadir una opcion "Tests" al menu principal del dashboard TUI que permita ejecutar tests de Go (`go test`) y tests E2E (Playwright) de forma independiente, con salida en tiempo real y resumen de resultados. ## Contexto - El dashboard actual (`cmd/dashboard/`) tiene un "Run Tests" en el menu Server que solo ejecuta `go test -tags goolm ./...` - Los tests E2E existen en `e2e/` y se ejecutan con `./dev-scripts/e2e/run.sh` - No hay forma de ejecutar E2E desde el dashboard ni de elegir que tipo de tests correr - El dashboard sigue el patron pure core (`pkg/tui/`) + impure shell (`shell/tui/adapter.go`) ## Arquitectura ``` pkg/tui/model.go — nuevo ScreenTests, TestKind, campos de estado pkg/tui/update.go — logica pura para pantalla Tests (navegacion, seleccion) pkg/tui/view.go — render de la pantalla Tests (menu + output) pkg/tui/messages.go — nuevos mensajes: MsgTestsRunning, MsgTestOutput (streaming) shell/tui/adapter.go — nuevos intents: IntentRunGoTests, IntentRunE2ETests, IntentRunAllTests ``` ### Patron pure core / impure shell - `pkg/tui/` — tipos de pantalla, opciones de menu, logica de navegacion, formateo de output. Todo puro. - `shell/tui/` — ejecucion real de `go test` y `./dev-scripts/e2e/run.sh`. Impuro. - No se necesitan cambios en `agents/`, `tools/`, ni `shell/` fuera de `shell/tui/`. ## Tareas ### Fase 1: Menu principal — nueva opcion "Tests" - [ ] **1.1** Añadir `ScreenTests` al enum de screens en `pkg/tui/model.go` - [ ] **1.2** Añadir opcion "Tests" al `MainMenuOptions()` (entre "Server" y "Quit") - [ ] **1.3** Manejar seleccion de "Tests" en `updateMainScreen` — navegar a `ScreenTests` ### Fase 2: Pantalla de tests — menu de seleccion - [ ] **2.1** Crear `TestMenuOptions()` en `model.go` con las opciones: - "Go Tests" — `go test -tags goolm -count=1 ./...` - "E2E Tests" — `./dev-scripts/e2e/run.sh` - "E2E Tests (headed)" — `./dev-scripts/e2e/run.sh --headed` - "All Tests" — Go tests + E2E secuencial - [ ] **2.2** Crear `updateTestsScreen` en `update.go` — navegacion y seleccion de tipo de test - [ ] **2.3** Crear `viewTests` en `view.go` — menu con las opciones y ultimo resultado (PASSED/FAILED/no ejecutado) ### Fase 3: Ejecucion y output - [ ] **3.1** Añadir intents nuevos: `IntentRunGoTests`, `IntentRunE2ETests`, `IntentRunAllTests` - [ ] **3.2** Refactorizar el `runTests()` actual del adapter para que sea `runGoTests()`, reutilizable - [ ] **3.3** Implementar `runE2ETests(headed bool)` en el adapter — ejecuta `./dev-scripts/e2e/run.sh [--headed]` - [ ] **3.4** Implementar `runAllTests()` — ejecuta Go tests primero, luego E2E, combina output - [ ] **3.5** Reutilizar `ScreenTestOutput` existente para mostrar resultados (ya tiene scroll y re-run) - [ ] **3.6** Adaptar `updateTestOutput` para que "r" re-ejecute el mismo tipo de test (no siempre Go) ### Fase 4: Estado y UX - [ ] **4.1** Añadir campo `LastTestKind` al Model para saber que re-ejecutar con "r" - [ ] **4.2** Mostrar indicador "Running..." mientras se ejecutan los tests - [ ] **4.3** El boton "0" desde test output vuelve a `ScreenTests` (no a Server) ### Fase 5: Limpiar intent antiguo - [ ] **5.1** Eliminar `IntentRunTests` del menu Server y reemplazar por navegacion a `ScreenTests` - [ ] **5.2** Mantener retrocompatibilidad: "Run Tests" en Server menu ahora navega a la pantalla Tests ### Fase 6: Tests - [ ] **6.1** Tests unitarios para `TestMenuOptions()` — verifica opciones correctas - [ ] **6.2** Tests unitarios para `updateTestsScreen` — navegacion, seleccion, generacion de intents - [ ] **6.3** Tests unitarios para `viewTests` — render correcto con distintos estados - [ ] **6.4** Verificar que `go build -tags goolm ./...` compila ### Fase 7: Cleanup - [ ] **7.1** Actualizar seccion del dashboard en `CLAUDE.md` si es necesario --- ## Ejemplo de uso ``` Bot Server Dashboard ──────────────────────────────────── 2 agents (2 running, 0 stopped, 0 disabled) Agents Gestionar agentes Server Gestionar launcher unificado > Tests Ejecutar tests Quit Salir [enter] Tests ──────────────────────────────────── > Go Tests go test ./... E2E Tests Playwright headless E2E Tests (headed) Playwright con browser All Tests Go + E2E secuencial Last run: Go Tests — PASSED ↑↓ navegar enter ejecutar 0 volver [enter en "E2E Tests"] Test Results — E2E Tests ──────────────────────────────────────────────────────── Running tests... (output va apareciendo) ↑↓ scroll r re-ejecutar 0 volver ``` ## Decisiones de diseno - **Menu separado en vez de submenu de Server**: los tests son una actividad frecuente e independiente del estado del servidor. Merecen acceso directo desde el menu principal. - **Reutilizar ScreenTestOutput**: ya existe toda la logica de scroll, re-run y visualizacion. Solo hay que parametrizar el tipo de test. - **E2E headed como opcion separada**: util para debugging, pero no es el caso comun. Opcion explicita evita flags ocultos. - **"All Tests" secuencial**: Go tests son rapidos, E2E lentos. Ejecutar Go primero permite fail-fast. ## Prerequisitos - Dashboard funcional (ya existe) - E2E tests configurados (`e2e/.env` con credenciales) — si no estan configurados, el E2E fallara con mensaje claro ## Riesgos - **E2E sin configurar**: si `e2e/.env` no existe, el script fallara. Mitigacion: capturar el error y mostrar mensaje descriptivo en el output ("E2E not configured — run ./dev-scripts/e2e/install.sh"). - **E2E headed sin display**: en servidores sin X/Wayland, `--headed` fallara. Mitigacion: el error de Playwright es claro, se muestra en el output.