- Add complete agent harness structure with 8 roles (leader, triager, architect, implementer, reviewer, security, qa, documenter) - Implement strict workflow with 9 stages and mandatory gates - Add comprehensive verification script and runtime status tracking - Create artifact-based evidence system with contracts and schemas - Add agent policy matrix with permissions and anti-cheat rules - Include test suite (44 tests passing) and CI-ready structure - Add documentation: README, HOWTO, CHECKPOINTS, templates - Configure model routing policies and token-aware task assignment - Add BDD/SDD specification guides and feature templates - Include starter pack for quick project onboarding All verification checks pass. Framework ready for production use.
171 lines
6.0 KiB
Gherkin
171 lines
6.0 KiB
Gherkin
@F-003 @password
|
|
Feature: Cambio de Contraseña
|
|
|
|
Como usuario autenticado
|
|
Quiero cambiar mi contraseña
|
|
Para mantener mi cuenta segura con credenciales actualizadas
|
|
|
|
# ====================
|
|
# HAPPY PATH
|
|
# ====================
|
|
|
|
@smoke @positive
|
|
Scenario: Cambiar contraseña exitosamente
|
|
Given un usuario autenticado con email "user@example.com"
|
|
And su contraseña actual es "OldPass123!"
|
|
When el usuario solicita cambiar contraseña
|
|
And ingresa contraseña actual "OldPass123!"
|
|
And ingresa nueva contraseña "NewPass456@"
|
|
And confirma nueva contraseña "NewPass456@"
|
|
Then el sistema valida la contraseña actual correctamente
|
|
And guarda la nueva contraseña hasheada
|
|
And invalida todas las sesiones existentes
|
|
And muestra mensaje de confirmación "Contraseña actualizada exitosamente"
|
|
|
|
@positive
|
|
Scenario: Contraseña con todos los caracteres especiales permitidos
|
|
Given un usuario autenticado
|
|
When cambia contraseña a "!@#$%^&*()_+-=[]{}|;':\",./<>?abc123ABC"
|
|
Then el sistema acepta la contraseña
|
|
And la guarda correctamente
|
|
|
|
# ====================
|
|
# PASSWORD VALIDATION
|
|
# ====================
|
|
|
|
@negative
|
|
Scenario: Nueva contraseña muy corta (menos de 8 caracteres)
|
|
Given un usuario autenticado
|
|
When intenta cambiar contraseña a "Ab1!"
|
|
Then el sistema muestra error "La contraseña debe tener al menos 8 caracteres"
|
|
And la contraseña no es cambiada
|
|
|
|
@negative
|
|
Scenario: Nueva contraseña muy larga (más de 128 caracteres)
|
|
Given un usuario autenticado
|
|
When intenta cambiar contraseña a "A" repetido 129 veces más "a1!"
|
|
Then el sistema muestra error "La contraseña debe tener máximo 128 caracteres"
|
|
And la contraseña no es cambiada
|
|
|
|
@negative
|
|
Scenario: Nueva contraseña sin mayúscula
|
|
Given un usuario autenticado
|
|
When intenta cambiar contraseña a "password123!"
|
|
Then el sistema muestra error "La contraseña debe contener al menos una mayúscula"
|
|
And la contraseña no es cambiada
|
|
|
|
@negative
|
|
Scenario: Nueva contraseña sin minúscula
|
|
Given un usuario autenticado
|
|
When intenta cambiar contraseña a "PASSWORD123!"
|
|
Then el sistema muestra error "La contraseña debe contener al menos una minúscula"
|
|
And la contraseña no es cambiada
|
|
|
|
@negative
|
|
Scenario: Nueva contraseña sin número
|
|
Given un usuario autenticado
|
|
When intenta cambiar contraseña a "PasswordABC!"
|
|
Then el sistema muestra error "La contraseña debe contener al menos un número"
|
|
And la contraseña no es cambiada
|
|
|
|
@negative
|
|
Scenario: Nueva contraseña sin carácter especial
|
|
Given un usuario autenticado
|
|
When intenta cambiar contraseña a "Password123"
|
|
Then el sistema muestra error "La contraseña debe contener al menos un carácter especial (!@#$%^&*...)"
|
|
And la contraseña no es cambiada
|
|
|
|
# ====================
|
|
# CURRENT PASSWORD
|
|
# ====================
|
|
|
|
@negative
|
|
Scenario: Contraseña actual incorrecta
|
|
Given un usuario autenticado con contraseña actual "CorrectPass123!"
|
|
When intenta cambiar contraseña con actual "WrongPass456!"
|
|
And nueva contraseña "NewPass789@"
|
|
Then el sistema muestra error "La contraseña actual es incorrecta"
|
|
And la contraseña no es cambiada
|
|
And no se invalidan sesiones
|
|
|
|
@negative
|
|
Scenario: Contraseña actual vacía
|
|
Given un usuario autenticado
|
|
When intenta cambiar contraseña con actual ""
|
|
And nueva contraseña "NewPass123@"
|
|
Then el sistema muestra error "La contraseña actual es requerida"
|
|
And la contraseña no es cambiada
|
|
|
|
# ====================
|
|
# PASSWORD MISMATCH
|
|
# ====================
|
|
|
|
@negative
|
|
Scenario: Nueva contraseña y confirmación no coinciden
|
|
Given un usuario autenticado
|
|
When ingresa contraseña actual correcta
|
|
And ingresa nueva contraseña "NewPass123@"
|
|
But confirma con "DifferentPass456!"
|
|
Then el sistema muestra error "Las contraseñas no coinciden"
|
|
And la contraseña no es cambiada
|
|
|
|
# ====================
|
|
# REUSE DETECTION
|
|
# ====================
|
|
|
|
@negative @security
|
|
Scenario: Reutilizar contraseña anterior
|
|
Given un usuario autenticado con contraseña actual "MyPass123!"
|
|
And historial de contraseñas incluye "MyPass123!"
|
|
When intenta cambiar contraseña a "MyPass123!"
|
|
Then el sistema muestra error "La nueva contraseña no puede ser igual a la anterior"
|
|
And la contraseña no es cambiada
|
|
|
|
# ====================
|
|
# AUTHORIZATION
|
|
# ====================
|
|
|
|
@negative @security
|
|
Scenario: Usuario no autenticado intenta cambiar contraseña
|
|
Given un usuario no autenticado
|
|
When intenta cambiar contraseña
|
|
Then el sistema retorna error 401 "No autorizado"
|
|
And la contraseña no es cambiada
|
|
|
|
@negative @security
|
|
Scenario: Token expirado al cambiar contraseña
|
|
Given un usuario con sesión expirada
|
|
When intenta cambiar contraseña
|
|
Then el sistema retorna error 401 "Sesión expirada"
|
|
And la contraseña no es cambiada
|
|
|
|
@negative @security
|
|
Scenario: Intentar cambiar contraseña de otro usuario
|
|
Given un usuario autenticado con ID "user-123"
|
|
When intenta cambiar contraseña del usuario "user-456"
|
|
Then el sistema retorna error 403 "No tienes permiso para modificar esta cuenta"
|
|
And la contraseña no es cambiada
|
|
|
|
# ====================
|
|
# RATE LIMITING
|
|
# ====================
|
|
|
|
@negative @security
|
|
Scenario: Superar límite de intentos (rate limit)
|
|
Given un usuario autenticado
|
|
And ya realizó 5 intentos fallidos en la última hora
|
|
When intenta cambiar contraseña una vez más
|
|
Then el sistema retorna error 429 "Demasiados intentos. Intenta de nuevo en 1 hora"
|
|
And todas las solicitudes son bloqueadas hasta que pase el tiempo
|
|
|
|
# ====================
|
|
# SUCCESSFUL REAUTHENTICATION
|
|
# ====================
|
|
|
|
@positive
|
|
Scenario: Cambio de contraseña seguido de login exitoso
|
|
Given un usuario con contraseña "OldPass123!"
|
|
When cambia su contraseña a "NewPass456@"
|
|
And luego intenta iniciar sesión con "NewPass456@"
|
|
Then el login es exitoso
|
|
And el usuario accede a su cuenta |