# e2e_checks proposal — metabase_registry # app_id: metabase_registry # lang: py # stack: Python + httpx + argparse (no venv propio, usa python/.venv del repo) # entry: apps/metabase_registry/main.py # date: 2026-05-19 # issue: 0121a wave 3 # # Notas de deteccion: # - lang=py, framework=httpx (requirements.txt: httpx>=0.27.0) # - Tres scripts ejecutables: main.py, create_registry_dashboard.py, # create_apps_dashboard.py. Sin pyproject.toml, sin tests/. # - NO es service (sin tag service, sin puerto HTTP propio). # - operations.db presente con schema completo (11 tablas + schema_migrations). # - Credenciales: en .env y env vars, NUNCA en checks. Todos los checks # son mock-only (import + syntax + dry-run sin conexion a Metabase real). # - Sin tests/ → check 'tests' OMITIDO (regla: no inventar tests inexistentes). # # REGLAS APLICADAS: # - Sin credenciales reales en ningun cmd. # - Todos los checks son idempotentes y terminan solos (sin &). # - python/.venv del repo padre (ruta absoluta para claridad; adaptar si se # crea venv propio en la app). # - ops_audit incluido porque operations.db existe y tiene 2 entities + assertions. e2e_checks_suggested: # --- Check 1: import --- # Verifica que el modulo main.py es importable y sus dependencias del registry # (python/functions/metabase/) estan disponibles sin errores de import. # No conecta a Metabase — solo resuelve imports. - id: import cmd: > cd $HOME/fn_registry/apps/metabase_registry && $HOME/fn_registry/python/.venv/bin/python3 -c "import sys, os; sys.path.insert(0, os.path.join(os.getcwd(), '..', '..', 'python', 'functions')); from metabase import MetabaseClient, metabase_create_card, metabase_create_dashboard, metabase_update_dashboard; from metabase.client import metabase_auth; from metabase.databases import metabase_add_database, metabase_list_databases; print('imports OK')" expect_stdout_contains: "imports OK" timeout_s: 15 severity: critical # por que: si los imports del registry fallan, ningun script funciona. # detecta: renombrado de funciones metabase_*, rotura de __init__.py, httpx no instalado. # --- Check 2: cli_help --- # Verifica que el parser CLI de main.py esta intacto. # argparse imprime usage sin necesitar credenciales ni conexion. - id: cli_help cmd: > cd $HOME/fn_registry/apps/metabase_registry && $HOME/fn_registry/python/.venv/bin/python3 main.py --help expect_stdout_contains: "metabase_registry" expect_exit: 0 timeout_s: 10 severity: critical # por que: si --help falla, el CLI esta roto (argparse error o import error previo). # --- Check 3: syntax_check (todos los scripts) --- # Compila los tres scripts con py_compile sin ejecutarlos. # Detecta SyntaxError y NameError de nivel modulo antes de cualquier deploy. - id: syntax_check cmd: > cd $HOME/fn_registry/apps/metabase_registry && $HOME/fn_registry/python/.venv/bin/python3 -m py_compile main.py create_registry_dashboard.py create_apps_dashboard.py create_script_navegador_dashboard.py && echo "syntax OK" expect_stdout_contains: "syntax OK" timeout_s: 10 severity: critical # por que: los 4 scripts no tienen tests unitarios; py_compile es el gate # mas ligero antes de un run real. Detecta typos, variables no definidas # a nivel modulo, imports ciclicos. # --- Check 4: dry_run_parser --- # Ejercita el parser con credenciales ficticias para verificar que # los defaults de env vars y la logica de build_parser() funcionan. # Falla INTENCIONALMENTE en autenticacion (no hay Metabase disponible) # pero debe mostrar el mensaje de error de auth, no un traceback de Python. # severity: warning porque el fallo esperado viene de red, no del codigo. - id: dry_run_parser cmd: > cd $HOME/fn_registry/apps/metabase_registry && METABASE_URL=http://127.0.0.1:19999 METABASE_ADMIN_EMAIL=test@example.com METABASE_ADMIN_PASSWORD=fake_password_for_e2e $HOME/fn_registry/python/.venv/bin/python3 main.py --url http://127.0.0.1:19999 --admin-email test@example.com --admin-password fake_password_for_e2e 2>&1 | head -5 expect_stdout_contains: "[metabase_registry]" expect_exit: 1 timeout_s: 15 severity: warning # por que: verifica que el flujo run() arranca (auth, log(), log_err()), # no que Metabase este activo. exit 1 es esperado (sin servidor en :19999). # Si sale exit 2 (argparse error) o traceback sin el prefijo → regresion. # --- Check 5: ops_audit --- # Invoca fn-recopilador sobre operations.db de esta app. # operations.db tiene schema completo (schema_migrations + 11 tablas), # 2 entities y assertions declaradas. - id: ops_audit ref: "fn-recopilador:apps/metabase_registry" severity: warning # por que: operations.db existe y tiene datos vivos. El recopilador valida # integridad referencial, snapshots al dia y assertions activas evaluadas. # warning porque la app no depende de operations.db para su funcion principal.