refactor: complete bootstrap of ARNES agent harness framework
- 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.
This commit is contained in:
171
spec/bdd/features/password/change-password.feature
Normal file
171
spec/bdd/features/password/change-password.feature
Normal file
@@ -0,0 +1,171 @@
|
||||
@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
|
||||
Reference in New Issue
Block a user