Saltar al contenido principal

LealtiApp Release Smoke Checklist

1. Preflight (antes de probar)

  • Verifica variables en entorno de produccion:
    • ROOT_DOMAIN
    • APP_URL
    • RESEND_API_KEY
    • PASSKIT_REST_KEY
    • PASSKIT_REST_SECRET
    • PASSKIT_WEBHOOK_SECRET
    • QSTASH_TOKEN
    • QSTASH_CURRENT_SIGNING_KEY
    • QSTASH_NEXT_SIGNING_KEY
  • Asegura que DNS de tenant resuelve a la app (ejemplo: tenant.tudominio.com).
  • Asegura que el webhook de PassKit apunta a:
    • https://{tenant}.{ROOT_DOMAIN}/api/admin/passkit/webhook
    • Header Authorization: Bearer {PASSKIT_WEBHOOK_SECRET}
  • Ir a https://{tenant}.{ROOT_DOMAIN}/admin-auth/login.
  • Capturar correo staff valido y enviar magic link.
  • Validar:
    • Llega correo con link al mismo subdominio del tenant.
    • Al abrir link, redirige a /admin o /admin/visits.
    • No rebota a Subdominio invalido.
  • Negativo:
    • Si intentas abrir panel sin sesion, redirige a /admin-auth/login.

3. Smoke de signup tenant

  • Ir a https://{ROOT_DOMAIN}/signup.
  • Crear tenant con slug en mayusculas (ejemplo: Mi-Tienda).
  • Validar:
    • Se crea sin error de formato.
    • Se normaliza a minusculas (mi-tienda).
    • Se envia magic link al owner.

4. Smoke de wallet/PassKit (cliente)

  • Como OWNER/ADMIN, ir a Admin > Wallet (PassKit).
  • Guardar:
    • programId valido
    • region (ejemplo pub1)
  • Ir a Admin > Asignacion de tiers y mapear niveles.
  • Con cliente OTP autenticado:
    • Ejecutar flujo "Agregar a Apple/Google Wallet".
  • Validar:
    • Endpoint /api/wallet/enroll responde ok con passUrl.
    • Se guarda en DB customer:
      • passkitMemberId
      • passkitPassUrl
      • passkitStatus = ENROLLED

5. Smoke de sync PassKit

  • Provocar cambio de datos cliente (ejemplo: canjear recompensa o actualizar perfil).
  • Validar que encola job a /api/wallet/sync-job.
  • Confirmar en logs:
    • PassKit sincronizado
    • no wallet-sync-job failed
  • Negativo:
    • sin passkitMemberId no debe romper, debe salir silencioso.

6. Smoke webhook PassKit

  • Simular webhook manual:
curl -i -X POST "https://{tenant}.{ROOT_DOMAIN}/api/admin/passkit/webhook" \
-H "Authorization: Bearer {PASSKIT_WEBHOOK_SECRET}" \
-H "Content-Type: application/json" \
-d '{"eventType":"pass_event_uninstalled","pass":{"id":"{passkitMemberId}"}}'
  • Validar:
    • HTTP 200 OK
    • customer passkitStatus cambia a UNINSTALLED.
  • Probar sin header auth:
    • Debe responder 401 Unauthorized.

7. Smoke de seguridad/regresion

  • Revisar logs de app:
    • No debe aparecer OTP en claro.
    • No debe aparecer token de magic link.
  • Validar multitenancy:
    • llamadas API desde tenant A no deben resolver tenant B.
    • x-tenant-subdomain debe estar disponible tambien en rutas /api.

8. Criterio de salida

  • Solo liberar si todo lo anterior pasa.
  • Si falla algo critico (auth, enroll, sync, webhook), rollback.