Files
fn_registry/dev/proposals_e2e_checks_0121/auto_metabase.yaml
T
egutierrez 53a3cdbda9 chore: auto-commit (8 archivos)
- .claude/rules/registry_calls.md
- apps/dag_engine/README.md
- apps/dag_engine/app.md
- docs/capabilities/INDEX.md
- docs/capabilities/systemd.md
- docs/execution_standard.md
- dev/proposals_e2e_checks_0121/
- docs/capabilities/backends.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 00:31:30 +02:00

134 lines
6.3 KiB
YAML

# Propuesta e2e_checks para apps/auto_metabase
#
# Generado por fn-recopilador en modo design-e2e
# App: auto_metabase (lang: py, framework: httpx, entry_point: main.py)
# Detectado:
# - CLI con argparse, subcomandos (projects, login, pull, push, validate, ...)
# - NO service (no tag 'service', no puerto propio)
# - Deps: yaml, httpx en python/.venv (registry venv compartido)
# - Test: dashboard_split_test.py — pytest puro, imports relativos a apps/auto_metabase/
# - NO operations.db propia (no bucle reactivo propio)
# - Toca Metabase REAL en todos los comandos de red (login, pull, push, ...)
# -> todos los checks e2e deben ser OFF-LINE: import, CLI help, tests puros
#
# Justificacion por check:
#
# | check | razon |
# |--------------------|---------------------------------------------------------------------------|
# | import | Valida que el entry point y sus modulos cargan sin errores de import, |
# | | que sys.path al registry de funciones esta bien y que yaml/httpx estan |
# | | disponibles en el venv compartido. |
# | cli_help | Valida que argparse esta correctamente configurado y que el CLI no |
# | | crashea en el arranque (antes de que necesite project o red). Confirma |
# | | que todos los submodulos (sync_push, sync_pull, payload, ...) se cargan. |
# | mbql_validate_pure | Valida la funcion PURA metabase_mbql_validate del registry sin tocar |
# | | red. Es la unica funcion del modulo que puede correr offline sin |
# | | credenciales. Detecta regresiones en el validador MBQL local. |
# | tests_dashboard_split | Corre dashboard_split_test.py — tests puros del helper de split/merge |
# | | de dashboards por tab. No requieren red ni credenciales. |
# Los checks que SI requieren red (login, pull, push, validate --check-sql)
# no se incluyen porque tocan Metabase real o credenciales. Se dejan para
# un entorno de smoke con Metabase en Docker (ver nota abajo).
#
# NOTA — smoke con Docker (severity: warning, no incluido por default):
# Si se quiere gate de smoke real, levantar Metabase en Docker local y usar:
# docker run -d -p 3100:3000 --name mb_e2e metabase/metabase
# python/.venv/bin/python3 apps/auto_metabase/main.py init-project e2e_test --base-url http://localhost:3100 \
# --email test@test.com --password Test1234!
# python/.venv/bin/python3 apps/auto_metabase/main.py -p e2e_test login
# python/.venv/bin/python3 apps/auto_metabase/main.py -p e2e_test status
# Ese bloque queda fuera de e2e_checks hasta tener un entorno Docker reproducible.
app_id: auto_metabase
dir_path: apps/auto_metabase
lang: py
generated_by: fn-recopilador
generated_at: "2026-05-19"
e2e_checks:
- id: import
# Carga completa del entry point: sys.path al registry, yaml, httpx,
# metabase.client, payload, sync_pull, sync_push, etc.
# Si cualquier modulo tiene un import roto, falla aqui.
cmd: >-
python/.venv/bin/python3 -c
'import sys; sys.path.insert(0, "apps/auto_metabase");
import importlib.util, pathlib;
spec = importlib.util.spec_from_file_location("main", "apps/auto_metabase/main.py");
m = importlib.util.module_from_spec(spec);
spec.loader.exec_module(m);
print("import OK")'
expect_stdout_contains: "import OK"
timeout_s: 30
severity: critical
# por que: valida que el entry point carga sin ImportError (yaml, httpx,
# metabase.client, payload, sync_push, ...) usando el venv del registro.
- id: cli_help
# Valida que argparse esta bien formado y todos los submodulos cargan.
# 'projects --help' dispara solo el parser, no requiere red ni proyecto.
cmd: "python/.venv/bin/python3 apps/auto_metabase/main.py --help"
expect_stdout_contains: "usage:"
timeout_s: 15
severity: critical
# por que: el CLI tiene ~30 subcomandos; si cualquier modulo falla al
# importarse (payload.py, sync_push.py, etc.) esto lo captura.
- id: mbql_validate_pure
# Corre la funcion PURA metabase_mbql_validate del registry de forma offline.
# Prueba un dataset_query MBQL minimo valido (debe devolver lista vacia de errores)
# y uno con UUID duplicado (debe detectar el error).
cmd: >-
python/.venv/bin/python3 - <<'PYEOF'
import sys
sys.path.insert(0, "python/functions")
from metabase import metabase_mbql_validate
import uuid
# Caso valido: query nativo minimo sin errores
u1, u2 = str(uuid.uuid4()), str(uuid.uuid4())
valid_q = {
"lib/type": "mbql/query",
"database": 1,
"stages": [{"lib/type": "mbql.stage/native",
"native": "SELECT 1",
"lib/uuid": u1}],
"lib/uuid": u2,
}
errs = metabase_mbql_validate(valid_q)
assert errs == [], f"Esperaba 0 errores, got: {errs}"
# Caso invalido: UUID duplicado
dup = str(uuid.uuid4())
bad_q = {
"lib/type": "mbql/query",
"database": 1,
"stages": [{"lib/type": "mbql.stage/native",
"native": "SELECT 1",
"lib/uuid": dup}],
"lib/uuid": dup,
}
errs2 = metabase_mbql_validate(bad_q)
assert len(errs2) > 0, "Esperaba error de UUID duplicado"
print("mbql_validate_pure OK")
PYEOF
expect_stdout_contains: "mbql_validate_pure OK"
timeout_s: 30
severity: critical
# por que: metabase_mbql_validate es la unica funcion del modulo metabase
# ejecutable offline. Detecta regresiones en el validador MBQL puro.
- id: tests_dashboard_split
# Corre el unico test file puro de la app: dashboard_split_test.py.
# No requiere red, no toca Metabase. Pytest con confdir en la app dir.
cmd: >-
python/.venv/bin/python3 -m pytest -x -q
--rootdir=apps/auto_metabase
apps/auto_metabase/dashboard_split_test.py
timeout_s: 60
severity: critical
# por que: dashboard_split.py tiene logica de split/merge de dashboards
# multi-tab y el test file tiene casos exhaustivos. Es el unico gate
# automatico de esa logica que no requiere Metabase.