Apariencia
Verificación post-deploy
Smoke tests que debes correr en orden tras cada deploy a producción. Cada test valida una integración crítica. Si uno falla, no avances — diagnostica antes.
0 · Prerequisitos
- El deploy terminó sin errores.
- Las 12 casillas del checklist maestro están marcadas.
- Tienes acceso a:
- Un inbox real para recibir correos de prueba
- Tu tarjeta real (para refund inmediato) o Stripe test cards
- Acceso a los logs del servidor backend
- Acceso al dashboard de Stripe
Duración estimada del ciclo completo: 30–45 minutos.
1 · Health check del backend
bash
curl -i https://api.humae.com.mx/api/v1/healthEsperado:
HTTP/2 200
content-type: application/json
{
"success": true,
"message": "OK",
"data": {
"app": "ok",
"database": "ok",
"cache": "ok",
"queue": "ok"
}
}Si falla:
database: "error"→ revisarDB_*en.env+ conectividad al MySQL.cache: "error"→ revisarREDIS_*y que Redis esté corriendo.queue: "error"→ revisar que el worker esté activo (supervisorctl status).
2 · Frontend carga y conecta
Abrir en el browser: https://humae.com.mx
Esperado:
- Landing carga sin errores de JS en la consola.
- Network tab: las llamadas a
https://api.humae.com.mx/api/v1/*devuelven 200 (o 401 si requieren auth). - No errores de CORS.
Si hay errores de CORS:
- Revisar
FRONTEND_URLySANCTUM_STATEFUL_DOMAINSen el backend. - Revisar
config/cors.phpinclude el origen correcto. - Clear Laravel cache:
php artisan config:clear.
3 · Registro + verificación de email (flujo candidato)
3.1 Registrar cuenta de prueba
En el browser:
- Ir a
https://humae.com.mx/register. - Llenar: nombre
Test Usuario, email real tuyo (recibirás correos), passwordPassword123, checkbox de términos. - Enviar → debe redirigir a
/verify-email.
3.2 Recibir correo
Revisa tu inbox en ≤ 2 minutos:
- Sender:
HUMAE <hola@humae.com.mx> - Subject: "Verifica tu correo para activar tu cuenta HUMAE"
- Link: clic en "Verificar correo".
Si no llega:
- Revisa spam.
sudo tail -n 50 /var/log/mail.log→ buscar tu email; el estado debe serstatus=sent.mailq→ no debería estar acumulando mensajes.- Logs backend:
tail -f storage/logs/laravel-$(date +%F).log | grep -i mail.
3.3 Verificar
Clic en el link → debe redirigir a /login con toast de éxito.
En DB:
sql
SELECT email_verified_at, status FROM users WHERE email = 'tu_email@gmail.com';Debe tener email_verified_at con fecha reciente y status = 'active'.
4 · Login + sesión persistente
- Login con el usuario recién creado.
- Debe redirigir a
/dashboard. - Cerrar el browser.
- Volver a
https://humae.com.mx/dashboard→ debe seguir logueado (token persistido).
Si no persiste:
- Revisar
SESSION_DRIVER=redisySESSION_DOMAIN=.humae.com.mx. - Revisar que las cookies de Sanctum se setean con
Secure; SameSite=Lax.
5 · Stripe Checkout → activación de membresía
5.1 Iniciar checkout
En el dashboard del candidato → Membresía → Contratar membresía.
El backend debe:
- Crear un
Paymentconstatus = pending. - Llamar a Stripe y devolver la URL.
- El frontend redirige a
checkout.stripe.com.
5.2 Pagar
En Stripe Checkout:
- Tarjeta de prueba (si el dashboard está en test mode):
4242 4242 4242 4242, fecha futura, CVC cualquiera. - O tu tarjeta real si ya estás en live mode (montos bajos y con intención de refund).
5.3 Webhook llega al backend
Stripe debe disparar checkout.session.completed al endpoint del backend.
En Stripe Dashboard → Webhooks → tu endpoint → últimos eventos:
- Debe aparecer el evento con status
succeeded(200). - Si es
failed(4xx/5xx), clic para ver el error.
En logs del backend:
bash
tail -f storage/logs/laravel-$(date +%F).log | grep -i stripe
# Esperado:
# [StripeWebhook] checkout.session.completed processed. session=cs_...5.4 Membresía activa
Volver al dashboard del candidato:
- Tarjeta de membresía cambia a verde: "Activa hasta DD/MM/YYYY".
- Correo recibido: "Tu membresía HUMAE está activa 🎉".
En DB:
sql
SELECT status, expires_at FROM memberships
WHERE user_id = (SELECT id FROM users WHERE email = 'tu_email@gmail.com');Debe existir una fila con status=active y expires_at ≈ now() + 180 days.
Si el webhook no llega:
- Verificar que el endpoint Stripe apunta a
https://api.humae.com.mx/api/webhooks/stripe(no staging). - Verificar que el endpoint sea accesible desde internet (no detrás de firewall).
- Verificar
STRIPE_WEBHOOK_SECRETcoincide con el del dashboard.
6 · Upload de avatar (disco local)
Desde el dashboard candidato → Mi perfil → cambiar avatar.
Seleccionar una imagen JPG/PNG ≤ 4MB.
Esperado:
- Upload completa en < 3 segundos.
- La foto aparece inmediatamente en el perfil.
- Inspeccionar el
<img>→srcdebe ser{APP_URL}/storage/avatars/{user_id}/{hash}.webp. curl -Isobre esa URL devuelve 200 conContent-Type: image/webp.
En el servidor: ls storage/app/public/avatars/{user_id}/ debe mostrar el archivo recién subido. Dimensiones: 400×400.
Si falla con 404 en la URL:
- Falta
php artisan storage:link. - Nginx no está sirviendo
/storage/*— revisar que el bloque de config no rewrittea todo aindex.php.
Si falla con 500:
- Revisar permisos de
storage/(chown www-data:www-data storage && chmod -R 775 storage). - Revisar que la extensión GD esté instalada (
php -m | grep gd).
7 · Descargar CV PDF
Dashboard candidato → Mi perfil → Descargar CV PDF.
Esperado:
- Response
Content-Type: application/pdf. - Descarga un archivo
CV_Nombre_Apellido.pdf. - Abrir con un visor de PDF: debe renderizar correctamente con el logo HUMAE y los datos del perfil.
Si está en blanco o corrupto:
- Revisar que DomPDF esté instalado (
composer show dompdf/dompdf). - Revisar permisos de escritura en
storage/framework/cache.
8 · Agendar entrevista (flujo recruiter → candidato)
8.1 Crear un recruiter de prueba
Como admin en /admin/usuarios → crear usuario con rol recruiter.
8.2 Crear una empresa + vacante de prueba
/admin/empresas → nueva empresa → crear vacante → estado activa.
8.3 Asignar candidato
Como recruiter → directorio → tu candidato de prueba → asignar a la vacante.
8.4 Agendar entrevista
Pipeline → arrastrar a presented → agendar entrevista para now + 3 days.
Esperado:
- El candidato (tú) recibe correo: "Nueva entrevista agendada".
- El correo llega en ≤ 2 minutos.
- El enlace del correo redirige a la entrevista en el dashboard del candidato.
En DB:
sql
SELECT state, scheduled_at FROM interviews ORDER BY id DESC LIMIT 1;Debe existir con state='propuesta'.
9 · Búsqueda en directorio (funcionalidad clave del recruiter)
Como recruiter → /recruiter/directorio.
Esperado:
- Lista al menos tu candidato de prueba (si tiene membresía activa).
- Filtros funcionan: filtrar por ciudad, skills, etc.
- Paginación funciona.
10 · Reportes (admin)
Como admin → /admin/reportes.
Esperado:
- KPI cards cargan sin "Loading..." indefinido.
- Al menos las métricas de candidatos y membresías muestran valores > 0 (tu usuario de prueba).
- Charts renderizan sin errores.
11 · Scheduler + queue workers vivos
bash
# En el servidor backend
sudo supervisorctl status humae-queue:*
# Todos deben estar RUNNING
php artisan schedule:list
# Debe listar ExpireMembershipsJobEsperar hasta medianoche UTC (o ejecutar manualmente):
bash
php artisan schedule:run
# o el comando específico:
php artisan memberships:expireDebe loguear que revisó memberships (no debe haber expiradas si todo es reciente).
12 · Cobertura de errores (Sentry, si lo tienes)
Disparar un error intencional en prod (un endpoint temporal):
bash
curl -X POST https://api.humae.com.mx/api/v1/debug/trigger-error(Agregar temporal, remover después). Verificar que Sentry recibe el evento en ≤ 2 minutos.
Resultado final
Si los 12 pasos pasaron:
✓ Health endpoint verde
✓ Frontend conecta al backend
✓ Registro + verificación + login
✓ Stripe Checkout + webhook + membresía
✓ Upload a disco local + descarga autenticada de documentos
✓ CV PDF se genera
✓ Entrevista agendada + notificación
✓ Directorio funcional
✓ Reportes cargan
✓ Queue worker + scheduler activosEl deploy está listo. Comunica al equipo de negocio que la plataforma es accesible públicamente.
Limpieza post-prueba
Borrar los datos de prueba:
sql
-- Eliminar usuario test y sus datos
DELETE FROM users WHERE email = 'tu_email@gmail.com';
-- Cascade borra candidate_profile, memberships, payments, etc.Y en Stripe:
- Refund del pago de prueba si usaste tarjeta real.
Si algo falla
- NO hagas rollback inmediato. La mayoría de fallos son de configuración, no de código.
- Lee los logs — casi siempre dan la pista exacta.
- Revisa Preguntas frecuentes — cubre los escenarios comunes.
- Si es crítico y no resuelves en 15 min:
- Marcar la plataforma como "en mantenimiento" en el frontend (feature flag temporal).
- Investigar con calma.
- Si necesitas rollback, restaurar backup de DB + deploy anterior del código.

