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