Test que verifica la creación de wikipedia-bot y exchange-bot por
father bot, incluyendo health checks y respuestas a preguntas.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Valida que el script notify-developer.sh crea DM rooms con
encriptacion habilitada: initial_state con m.room.encryption,
algoritmo m.megolm.v1.aes-sha2, preset trusted_private_chat,
is_direct e invite presentes.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Test de integracion real que:
1. Crea DM con father-bot via Matrix SDK
2. Pide crear un robot simple (e2e-father-test)
3. Espera respuesta de father-bot (timeout 9min, claude-code)
4. Verifica: config.yaml (type: robot), agent.go, compilacion, blank import
5. Cleanup automatico: borra agente, import y env vars
Validado: father-bot creo el robot en ~3min con reporte estructurado.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
11 tests que verifican:
- agent.go puro (sin imports I/O, registra Rules con ActionKindLLM)
- config.yaml: claude-code provider, bypassPermissions, E2EE, sanitize, audit
- system prompt: guia de creacion, decision tree, convenciones, seguridad
- launcher: import de _specials/father-bot, discovery de _specials/
- security: father-bot en grupo privileged, solo admins en permissions.yaml,
NO en grupo general (evita ACL union)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Tests funcionales (test-personality.spec.ts):
- Saludo con personalidad pirata espacial (keywords flexibles)
- Personalidad consistente en respuestas serias (fotosintesis + pirata)
- !help y !ping funcionan (assertions estrictas)
- Sin errores E2EE
Tests de pipeline (create-agent-pipeline.spec.ts):
- Valida agent.go con Rules() y ActionKindLLM
- Config sin type: robot (es agent por defecto)
- System prompt con personalidad + seccion de seguridad
- LLM configurado (openai/gpt-4o)
- Encryption habilitada, import en launcher
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Importa closeThreadPanel y lo llama en beforeEach tras goToRoom.
Si el thread panel queda abierto de sesiones previas, sus sender elements
contaminarían los locators de waitForBotReply en tests posteriores.
Tres cambios principales en matrix-room.ts:
1. closeThreadPanel: nueva funcion exportada que cierra el panel de thread
si esta abierto. Necesario para evitar que sender elements del panel
contaminen locators de waitForBotReply.
2. waitForBotReply reescrito: usa Matrix SDK (mxMatrixClientPeg) en lugar
de locators DOM para detectar respuestas. Captura startEventId antes de
esperar para solo detectar mensajes NUEVOS. Ignora thread replies
(rel_type=m.thread) y filtra por sender via room.getMember().
Elimina la deteccion de sender por DOM que fallaba cuando thread summaries
inyectaban elementos adicionales en el main timeline.
3. startThreadOnLastMessage reescrito: intenta primero via UI (right-click
en el ultimo EventTile → 'Reply in Thread' en context menu → escribir
en el composer del thread panel). Si el context menu no aparece (modo
headless), cae al fallback SDK que envia el mensaje con m.relates_to
correcto. El test de thread ya pasa con el fallback.
Corrige dos bugs en los fixtures de Playwright:
1. startThreadOnLastMessage usaba client.getRooms()[0] (el primer room unido) en lugar del room activo, causando que el mensaje threaded se enviara al room equivocado. Ahora lee el room ID de window.location.hash (#/room/!xxx:server), con resolucion de alias si la URL contiene un alias en lugar de un ID.
2. waitForThreadReplyViaSdk iteraba todos los rooms unidos, lo que podia devolver falsos positivos de otros rooms. Ahora esta acotado al room de la URL actual, con logica de fallback para aliases canonicos y alternativos.
asistente-2.spec.ts: usa waitForThreadReplyViaSdk en lugar de sendThreadMessage + waitForThreadReply (que dependian del panel UI). Elimina la importacion de sendThreadMessage. Agrega test.setTimeout(120_000) al test de threads para dar tiempo suficiente al ciclo completo.
login.spec.ts: ampliar locators de room tiles con .mx_RoomTile para mayor compatibilidad con Element Web moderno que no siempre usa role=treeitem.
element-auth.ts: ampliar locator de roomsTree con .mx_RoomList, .mx_LeftPanel_roomListContainer, .mx_RoomTile para detectar sesion existente de forma mas robusta, tanto en loginToElement como en waitForLoginResult.
goToRoom: implementa estrategia doble — primero intenta click directo en el sidebar (mas robusto), luego usa Ctrl+K como fallback. Evita el click en el boton Search que a veces es bloqueado por toasts.
startThreadOnLastMessage: en headless Chromium la hover action bar de Element no se renderiza (es React onMouseEnter, no CSS :hover). Ahora usa el Matrix SDK expuesto en window.mxMatrixClientPeg para enviar el mensaje threaded directamente via API, evitando la dependencia del panel UI.
Nueva funcion waitForThreadReplyViaSdk: consulta el timeline del SDK en lugar de depender del panel de thread UI. Busca eventos con m.relates_to.rel_type === 'm.thread' y filtra por sender si se especifica.
Nueva funcion interna waitForRoomLoaded: espera header del room o el composer como fallback, desacoplando la verificacion de la navegacion.
Mueve la logica de cierre de toasts a un modulo compartido (element-utils.ts) para evitar duplicacion. persistent-context.ts importa dismissAllToasts desde ahi y la invoca despues de verificar el sidebar. Se mejora tambien la deteccion del sidebar usando multiples locators alternativos (mx_RoomList, mx_LeftPanel_roomListContainer, mx_RoomTile) para mayor compatibilidad con distintas versiones de Element Web.
global-setup.ts:
- Usa launchPersistentContext en vez de browser.newContext()
- Reemplaza storageState por marker file para cache de sesion
- Captura logs de consola del browser para debug
- Screenshots y HTML dump en caso de error
playwright.config.ts:
- Elimina storageState (ahora via persistent context fixture)
- Screenshots siempre activas, video y trace en failures
Tests (login, assistant-bot, asistente-2):
- Importan test/expect desde persistent-context fixture
- Usan handleElementDialogs() en vez de espera manual de rooms
- Nuevo test de threads en asistente-2: verifica que el bot
responde dentro del thread cuando se le habla por thread
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
element-auth.ts:
- Reintentos con backoff para M_LIMIT_EXCEEDED (max 3 intentos)
- Screenshots de debug en cada paso del login
- Deteccion de sesion activa (skip login si ya logueado)
- Manejo robusto de cross-signing con fallback si no hay Done button
- waitForLoginResult() detecta errores, rate limits y exito
matrix-room.ts:
- Logging detallado en goToRoom, sendMessage, waitForBotReply
- Screenshots automaticas en errores y timeouts
- Dump del timeline en timeout para diagnóstico
- Nuevos helpers: startThreadOnLastMessage, sendThreadMessage,
waitForThreadReply, assertBotDidNotReplyInMainTimeline
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Nuevo fixture que crea un worker-scoped persistent browser context
compartido entre tests. A diferencia de storageState, preserva IndexedDB
donde Element Web guarda las crypto keys de E2EE.
Incluye handleElementDialogs() que maneja:
- "Element is open in another window" → click Continue
- "Missing session data" → error informativo
- Espera rooms sidebar como señal de sesion cargada
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- e2e/README.md: guia completa de instalacion, configuracion,
ejecucion y debug de tests E2E
- .gitignore: agrega e2e/playwright-report/
- CLAUDE.md: agrega seccion E2E tests y dev-scripts/e2e en estructura
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Tests de cada agente via Element Web + Playwright:
- assistant-bot: saludo DM, pregunta, !help, !ping, E2EE check
- asistente-2: saludo, !tools, tool use (que hora es?), !help, E2EE check
Assertions flexibles para respuestas LLM (no-deterministicas),
estrictas para commands deterministicos (!help, !ping).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Implementa el issue 0022b — fixtures de Playwright para
autenticacion en Element Web y helpers de interaccion con rooms.
- element-auth.ts: flujo completo de login + cross-signing con
recovery key, preparado para cachear sesion via storageState
- global-setup.ts: ejecuta login una vez antes de todos los tests,
reutiliza sesion cacheada si tiene menos de 12 horas
- matrix-room.ts: helpers goToRoom, sendMessage, waitForBotReply,
getLastMessage, assertNoDecryptionErrors (detecta "Unable to decrypt")
- login.spec.ts: 3 smoke tests validando sesion, E2EE y navegacion
- playwright.config.ts: configurado storageState para inyectar sesion
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Proyecto Node.js independiente en e2e/ con Playwright + Chromium headless.
Incluye setup-element.sh para descargar y servir Element Web localmente
(puerto 8090 por defecto, 8080 ocupado por Docker).
Scripts de instalacion y placeholder para ejecucion de tests.
Cierra issue 0022a.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>