# 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.