Test Plan: Autenticacion de Usuarios
Proposito
Plan de pruebas completo para la feature de autenticacion. Cubre registro, login, verificacion de email, refresh tokens, y bloqueo por intentos fallidos.
| Campo |
Valor |
| Feature |
Autenticacion de Usuarios (FEAT-001) |
| Spec |
feature-user-auth.spec.md |
| Autor |
Maria Lopez |
| Fecha |
2025-03-22 |
| Estado |
Approved |
1. Alcance del Testing
En scope
- Registro de pacientes
- Verificacion de email
- Login con email + password
- Refresh de access token
- Recuperacion de password
- Bloqueo por intentos fallidos
- Validacion de password (politica de complejidad y reutilizacion)
Fuera de scope
- Registro de medicos (flujo admin, se testea en la feature de admin)
- UI/Frontend tests (responsabilidad del equipo frontend)
- Performance bajo carga (se testea en fase de load testing general)
2. Niveles de Testing
Unit Tests
| Test |
Que valida |
Prioridad |
PasswordValidator.validate() con password valido |
Acepta password con 8+ chars, 1 mayuscula, 1 numero |
Alta |
PasswordValidator.validate() con password corto |
Rechaza password < 8 chars |
Alta |
PasswordValidator.validate() sin mayuscula |
Rechaza password sin mayuscula |
Alta |
PasswordValidator.validate() sin numero |
Rechaza password sin numero |
Alta |
PasswordHistoryChecker.isReused() con password repetido |
Detecta password igual a los ultimos 3 |
Alta |
PasswordHistoryChecker.isReused() con password nuevo |
Acepta password no repetido |
Media |
LoginAttemptTracker.shouldLock() con 4 intentos |
No bloquea |
Media |
LoginAttemptTracker.shouldLock() con 5 intentos |
Bloquea por 15 min |
Alta |
LoginAttemptTracker.shouldLock() despues de 15 min |
Desbloquea |
Alta |
JwtService.generateAccessToken() |
Genera token con claims correctos (userId, role, exp) |
Alta |
JwtService.verifyAccessToken() con token expirado |
Retorna error de expiracion |
Alta |
Integration Tests
| Test |
Que valida |
Prioridad |
| POST /auth/register con datos validos |
Crea user en BD, password hasheado, is_verified=false |
Alta |
| POST /auth/register con email duplicado |
Retorna 409 EMAIL_ALREADY_EXISTS |
Alta |
| POST /auth/verify-email con token valido |
Actualiza is_verified=true en BD |
Alta |
| POST /auth/login con credenciales correctas |
Retorna access + refresh token, crea refresh en BD |
Alta |
| POST /auth/login con cuenta no verificada |
Retorna 403 EMAIL_NOT_VERIFIED |
Alta |
| POST /auth/login con cuenta bloqueada |
Retorna 423 ACCOUNT_LOCKED |
Alta |
| POST /auth/login incrementa failed_login_attempts |
Contador incrementa en BD, se resetea en login exitoso |
Alta |
| POST /auth/refresh con token valido |
Retorna nuevo access token |
Alta |
| POST /auth/refresh con token revocado |
Retorna 401 |
Alta |
| POST /auth/reset-password con password repetido |
Retorna 400 PASSWORD_RECENTLY_USED |
Media |
| GET /users/me con token valido |
Retorna datos del usuario |
Media |
| GET /users/me con token expirado |
Retorna 401 |
Media |
E2E Tests
| Test |
Que valida |
Prioridad |
| Flujo completo: registro -> verificacion -> login -> acceso a recurso protegido |
El happy path funciona de punta a punta |
Alta |
| Flujo de recuperacion: forgot-password -> reset-password -> login con nuevo password |
Reset funciona correctamente |
Alta |
| Flujo de bloqueo: 5 logins fallidos -> esperar 15 min -> login exitoso |
Bloqueo temporal funciona |
Media |
3. Datos de Prueba
Fixtures / Seeds
- Usuario verificado:
test-patient@example.com, password TestPass123, is_verified=true
- Usuario no verificado:
unverified@example.com, password TestPass123, is_verified=false
- Usuario bloqueado:
locked@example.com, failed_login_attempts=5, locked_until=futuro
Mocks / Stubs
- Servicio de email: Mock que captura los emails enviados sin enviarlos realmente. Permite verificar que se envio el email correcto con el token correcto.
- Clock/Time: Mock para controlar el tiempo en tests de expiracion de tokens y bloqueo temporal.
4. Edge Cases y Negativos
| Scenario |
Input |
Expected |
| Registro con email en mayusculas |
JUAN@EMAIL.COM |
Se normaliza a juan@email.com, funciona |
| Login con espacios en email |
juan@email.com |
Se hace trim, funciona |
| Password con caracteres especiales |
P@ss#w0rd! |
Acepta (cumple requisitos) |
| Password con emojis |
Password1 |
Acepta (cumple requisitos basicos) |
| Token JWT manipulado (firma invalida) |
Token con payload editado |
401, no se autentica |
| Refresh token usado despues de logout |
Token valido pero revocado |
401 |
| Registro con email malformado |
no-es-un-email |
400 VALIDATION_ERROR |
| Registro con body vacio |
{} |
400 VALIDATION_ERROR con detalle de campos faltantes |
| Multiples sesiones simultaneas |
Login desde 2 dispositivos |
Ambas sesiones funcionan (refresh tokens independientes) |
| Cambio de password invalida sesiones? |
Cambiar password |
Refresh tokens previos deben ser revocados |
| Test |
Metrica |
Target |
| Login endpoint latencia |
p95 response time |
< 500ms |
| bcrypt hash time |
Tiempo de hash con cost 12 |
< 300ms |
| JWT verification |
Tiempo de verificacion RS256 |
< 10ms |
Checklist de Completitud
Archivos relacionados