major restructure

This commit is contained in:
buenosairesam
2026-01-20 05:31:26 -03:00
parent 27b32deba4
commit e4052374db
328 changed files with 1018 additions and 10018 deletions

View File

@@ -0,0 +1,91 @@
# Fuente: album/book/ops-templates/pet-owner/01-registro.md
# Drive: 08. IT y Producto/Funcionalidades Plataforma Veterinario
# Tests Backend: pytest tests/contracts/common/test_users.py
# Tests Frontend: npx playwright test auth.spec.ts
Feature: Registro de usuario
Como visitante de la plataforma
Quiero poder crear una cuenta
Para gestionar mis mascotas y reservar turnos
# ============================================
# CAMINO FELIZ
# ============================================
Scenario: Registro exitoso con datos validos
Given que estoy en la pagina de registro
When ingreso email "nuevo@ejemplo.com"
And ingreso contraseña "Password123"
And confirmo contraseña "Password123"
And acepto los terminos y condiciones
And hago click en "Crear cuenta"
Then deberia ver mensaje "Te enviamos un email de verificacion"
And deberia recibir email de verificacion
Scenario: Verificar email y activar cuenta
Given que me registre con email "nuevo@ejemplo.com"
And recibi el email de verificacion
When hago click en el link de verificacion
Then mi cuenta deberia estar activa
And deberia ser redirigido al dashboard
# ============================================
# VALIDACIONES
# ============================================
Scenario Outline: Registro con datos invalidos
Given que estoy en la pagina de registro
When ingreso email "<email>"
And ingreso contraseña "<password>"
And confirmo contraseña "<confirmacion>"
And hago click en "Crear cuenta"
Then deberia ver error "<mensaje_error>"
Examples:
| email | password | confirmacion | mensaje_error |
| invalido | Password123 | Password123 | Email invalido |
| test@test.com | 123 | 123 | Contraseña muy corta |
| test@test.com | password | password | Debe contener al menos un numero |
| test@test.com | Password123 | Diferente123 | Las contraseñas no coinciden |
Scenario: Registro con email ya existente
Given que existe un usuario con email "existente@ejemplo.com"
And estoy en la pagina de registro
When ingreso email "existente@ejemplo.com"
And completo el resto del formulario correctamente
And hago click en "Crear cuenta"
Then deberia ver error "Este email ya esta registrado"
And deberia ver link "Recuperar contraseña"
# ============================================
# CASOS ESPECIALES
# ============================================
Scenario: Registro linkea con cuenta invitado existente
# Usuario que reservo turno como invitado y ahora quiere registrarse
Given que existe un usuario invitado con email "invitado@ejemplo.com"
And ese usuario tiene una mascota "Luna" registrada
And estoy en la pagina de registro
When me registro con email "invitado@ejemplo.com"
And verifico mi cuenta
Then deberia ver mi mascota "Luna" en el dashboard
And deberia ver mis turnos anteriores
Scenario: Registro desde flujo de turnero
# Usuario empezo a reservar turno y decide crear cuenta
Given que estoy en el paso final del turnero
And ingrese mis datos de contacto
When hago click en "Crear cuenta para guardar mis datos"
Then deberia ver formulario simplificado
And mi email ya deberia estar pre-llenado
And solo deberia ingresar contraseña
Scenario: Reenviar email de verificacion
Given que me registre pero no verifique mi cuenta
And estoy en la pagina de login
When intento iniciar sesion
Then deberia ver "Tu cuenta no esta verificada"
And deberia ver boton "Reenviar email"
When hago click en "Reenviar email"
Then deberia recibir nuevo email de verificacion

View File

@@ -0,0 +1,140 @@
# Fuente: album/book/ops-templates/pet-owner/02-reservar-turno.md
# Drive: 08. IT y Producto/Funcionalidades Plataforma Veterinario
# Tests Backend: pytest tests/contracts/workflows/test_turnero_general.py
# Tests Frontend: npx playwright test turnero.spec.ts
# Relacionado: def/work_plan/10-flow-turnero.md
Feature: Reservar turno veterinario (Turnero)
Como dueno de mascota
Quiero reservar un turno veterinario a domicilio
Para que atiendan a mi mascota sin salir de casa
Background:
Given que estoy en la pagina del turnero
# ============================================
# VERIFICACION DE COBERTURA
# ============================================
Scenario: Verificar cobertura en zona disponible
When ingreso direccion "Av Santa Fe 1234, CABA"
Then deberia ver mensaje "Tenemos cobertura en tu zona"
And deberia poder continuar al siguiente paso
Scenario: Zona sin cobertura
When ingreso direccion "Calle Principal 100, Ushuaia"
Then deberia ver mensaje "Aun no tenemos cobertura en tu zona"
And deberia ver formulario "Avisame cuando lleguen"
# ============================================
# FLUJO COMPLETO POR TIPO DE USUARIO
# ============================================
Scenario Outline: Reservar turno como <tipo_usuario>
Given que soy un usuario <tipo_usuario>
And tengo cobertura en mi zona
When completo los datos de mi mascota:
| campo | valor |
| nombre | Luna |
| tipo | Gato |
| edad | 2 años |
| castrada | Si |
And selecciono servicios:
| servicio |
| Vacunacion |
And selecciono fechas preferidas:
| fecha | franja |
| 2024-01-15 | Mañana |
| 2024-01-16 | Tarde |
And completo datos de contacto con email "<email>"
And envio la solicitud
Then deberia crearse una solicitud en estado "Pendiente"
And el dueno deberia ser <estado_dueno>
And deberia recibir email de confirmacion
Examples:
| tipo_usuario | email | estado_dueno |
| invitado | nuevo@test.com | creado como invitado |
| registrado | user@test.com | mi cuenta existente |
| recurrente | conocido@test.com | identificado por email |
# ============================================
# SELECCION DE SERVICIOS
# ============================================
Scenario: Servicios filtrados por tipo de mascota
Given que agregue una mascota tipo "Gato"
When veo los servicios disponibles
Then deberia ver "Vacuna triple felina"
And deberia ver "Vacuna antirabica"
But no deberia ver "Vacuna sextuple canina"
Scenario: Consulta clinica se agrega automaticamente con vacunacion
Given que estoy seleccionando servicios
When selecciono "Vacunacion"
Then "Consulta clinica" deberia agregarse automaticamente
And deberia ver nota "Incluye revision general"
And no deberia poder quitar "Consulta clinica"
Scenario: Servicios combo con descuento
Given que estoy seleccionando servicios
When agrego los siguientes servicios:
| servicio |
| Vacunacion |
| Desparasitacion |
| Antipulgas |
Then deberia ver "Plan preventivo completo"
And el total deberia incluir descuento de combo
Scenario: Castracion no disponible para mascota castrada
Given que mi mascota esta marcada como castrada
When veo los servicios disponibles
Then no deberia ver "Castracion"
# ============================================
# DATOS DE CONTACTO Y CUENTA
# ============================================
Scenario: Pre-llenado de datos para usuario logueado
Given que estoy logueado como "maria@ejemplo.com"
And tengo registrada mascota "Firulais"
When inicio el flujo de turnero
Then mi direccion deberia estar pre-llenada
And deberia poder seleccionar "Firulais" de mis mascotas
And mis datos de contacto ya deberian estar completos
Scenario: Detectar usuario existente por email
Given que soy usuario invitado
And existe una cuenta con email "existente@ejemplo.com"
When ingreso email "existente@ejemplo.com" en datos de contacto
Then deberia ver "Ya tenes cuenta con este email"
And deberia ver opciones:
| opcion |
| Iniciar sesion |
| Continuar como invitado |
# ============================================
# EDGE CASES
# ============================================
Scenario: Usuario abandona flujo a mitad
Given que complete los datos de mascota
And cerre el navegador sin enviar
When vuelvo a la pagina del turnero
Then deberia poder recuperar mi progreso
# Nota: datos guardados en localStorage o session
Scenario: Multiples mascotas en una solicitud
Given que quiero atender a 2 mascotas
When agrego mascota "Luna" tipo "Gato"
And agrego mascota "Rocky" tipo "Perro"
And selecciono servicios para cada una
Then deberia crearse una solicitud con 2 mascotas
And el precio deberia reflejar ambas
Scenario: Franja horaria especifica
Given que solo puedo por la mañana
When selecciono franja "Mañana (9-12hs)"
Then la solicitud deberia registrar esa preferencia
# Nota: Es preferencia, no garantia

View File

@@ -0,0 +1,153 @@
# Fuente: album/book/ops-templates/pet-owner/03-gestion-mascotas.md
# Drive: 08. IT y Producto/Funcionalidades Plataforma Veterinario
# Tests Backend: pytest tests/contracts/mascotas/test_pets.py
# Tests Frontend: npx playwright test pets.spec.ts
Feature: Gestion de mascotas
Como dueno de mascota registrado
Quiero gestionar la informacion de mis mascotas
Para tenerla actualizada y acceder a su historial medico
Background:
Given que estoy logueado como dueno de mascota
And estoy en la seccion "Mis mascotas"
# ============================================
# AGREGAR MASCOTA
# ============================================
Scenario: Agregar mascota con datos minimos
When hago click en "Agregar mascota"
And completo el formulario:
| campo | valor |
| nombre | Luna |
| tipo | Gato |
And hago click en "Guardar"
Then deberia ver "Luna" en mi lista de mascotas
And Luna deberia aparecer disponible en el turnero
Scenario: Agregar mascota con datos completos
When hago click en "Agregar mascota"
And completo el formulario:
| campo | valor |
| nombre | Rocky |
| tipo | Perro |
| raza | Labrador |
| fecha_nacimiento | 2020-03-15 |
| peso | 25 |
| sexo | Macho |
| castrado | Si |
And subo una foto de Rocky
And hago click en "Guardar"
Then deberia ver "Rocky" con su foto en mi lista
And deberia ver badge "Castrado"
Scenario Outline: Validacion de datos de mascota
When intento agregar mascota con <campo> igual a "<valor>"
Then deberia ver error "<mensaje>"
Examples:
| campo | valor | mensaje |
| nombre | | El nombre es obligatorio |
| nombre | A | Nombre muy corto |
| tipo | | Selecciona el tipo |
| peso | -5 | El peso debe ser positivo |
| peso | 500 | Peso fuera de rango |
# ============================================
# EDITAR MASCOTA
# ============================================
Scenario: Editar peso de mascota
Given que tengo una mascota "Luna" con peso 4kg
When edito a Luna
And cambio el peso a 5kg
And guardo los cambios
Then Luna deberia mostrar peso "5 kg"
Scenario: Marcar mascota como castrada
Given que tengo una mascota "Rocky" no castrado
When edito a Rocky
And marco "Esta castrado"
And guardo los cambios
Then Rocky deberia mostrar badge "Castrado"
And el servicio "Castracion" no deberia aparecer para Rocky en el turnero
Scenario: Actualizar foto de mascota
Given que tengo una mascota "Luna" sin foto
When edito a Luna
And subo una nueva foto
And guardo los cambios
Then deberia ver la foto de Luna en su tarjeta
# ============================================
# ELIMINAR MASCOTA
# ============================================
Scenario: Eliminar mascota sin historial
Given que tengo una mascota "Nuevo" sin visitas
When hago click en "Eliminar" para Nuevo
And confirmo la eliminacion
Then Nuevo no deberia aparecer en mi lista
# Nota: Es soft delete
Scenario: Eliminar mascota con historial medico
Given que tengo una mascota "Luna" con visitas anteriores
When hago click en "Eliminar" para Luna
Then deberia ver advertencia "Luna tiene historial medico"
And deberia ver "El historial se conservara pero no podras verlo"
When confirmo la eliminacion
Then Luna no deberia aparecer en mi lista
Scenario: No puedo eliminar mascota con turno pendiente
Given que tengo una mascota "Rocky" con turno pendiente
When intento eliminar a Rocky
Then deberia ver error "Rocky tiene turnos pendientes"
And deberia ver sugerencia "Cancela los turnos primero"
# ============================================
# VER HISTORIAL MEDICO
# ============================================
Scenario: Ver historial de visitas de mascota
Given que tengo una mascota "Luna" con 3 visitas completadas
When hago click en Luna
And voy a la seccion "Historial"
Then deberia ver 3 visitas listadas
And deberian estar ordenadas por fecha descendente
Scenario: Ver detalle de visita
Given que tengo una mascota "Luna" con visitas
When veo el historial de Luna
And hago click en la primera visita
Then deberia ver:
| campo |
| Fecha |
| Veterinario |
| Diagnostico |
| Tratamiento |
| Medicamentos |
Scenario: Mascota sin historial
Given que tengo una mascota "Nuevo" recien agregada
When veo el perfil de Nuevo
Then la seccion "Historial" deberia estar vacia
And deberia ver mensaje "Aun no hay visitas registradas"
And deberia ver boton "Reservar primer turno"
# ============================================
# CASOS ESPECIALES
# ============================================
Scenario: Mascota heredada de cuenta invitado
Given que me registre con email "juan@test.com"
And previamente reserve turno como invitado para "Firulais"
When voy a "Mis mascotas"
Then deberia ver "Firulais" en mi lista
And deberia ver su historial de visitas previas
Scenario: Razas filtradas por tipo
When agrego una mascota tipo "Gato"
Then las razas disponibles deberian ser razas de gato
And no deberia ver razas de perro como "Labrador"

View File

@@ -0,0 +1,140 @@
# Fuente: album/book/ops-templates/pet-owner/04-pago-turno.md
# Drive: 07. Finanzas y contabilidad/Mercado Pago
# Tests Backend: pytest tests/contracts/payments/test_mercadopago.py
# Tests Frontend: npx playwright test payment.spec.ts
Feature: Pago de turno
Como dueno de mascota con turno coordinado
Quiero pagar mi turno online
Para confirmar la visita del veterinario
Background:
Given que tengo un turno en estado "Coordinado"
And el turno tiene asignado veterinario "Dra. Garcia"
And la fecha asignada es "15 de enero a las 10:00"
# ============================================
# FLUJO DE PAGO EXITOSO
# ============================================
Scenario: Pagar turno con tarjeta de credito
Given que estoy en el detalle de mi turno coordinado
When hago click en "Pagar"
Then deberia ser redirigido a Mercado Pago
And deberia ver el monto correcto
When selecciono "Tarjeta de credito"
And completo los datos de la tarjeta
And confirmo el pago
Then deberia volver a la plataforma
And deberia ver "Pago exitoso"
And el turno deberia estar en estado "Pagado"
Scenario: Recibir confirmacion de pago
Given que complete el pago exitosamente
Then deberia recibir email de confirmacion
And el email deberia contener:
| campo |
| Fecha del turno |
| Direccion |
| Veterinario asignado |
| Monto pagado |
| Numero de operacion |
# ============================================
# METODOS DE PAGO
# ============================================
Scenario Outline: Pagar con diferentes metodos
Given que estoy en Mercado Pago
When selecciono metodo "<metodo>"
And completo el pago
Then el pago deberia ser <resultado>
And el estado de acreditacion deberia ser "<acreditacion>"
Examples:
| metodo | resultado | acreditacion |
| Tarjeta credito | exitoso | inmediata |
| Tarjeta debito | exitoso | inmediata |
| Dinero en cuenta | exitoso | inmediata |
| Transferencia | pendiente | 1-2 dias |
| Rapipago | pendiente | hasta 24hs |
# ============================================
# MANEJO DE ERRORES
# ============================================
Scenario: Pago rechazado por fondos insuficientes
Given que estoy en Mercado Pago
When intento pagar con tarjeta sin fondos
Then deberia ver error "Fondos insuficientes"
And deberia poder reintentar con otra tarjeta
And el turno deberia seguir en estado "Coordinado"
Scenario: Usuario cancela el pago
Given que estoy en Mercado Pago
When hago click en "Volver al sitio"
Then deberia volver a la plataforma
And deberia ver mensaje "El pago fue cancelado"
And deberia ver boton "Reintentar pago"
And el turno deberia seguir en estado "Coordinado"
Scenario: Cierre de browser durante pago
Given que estoy en Mercado Pago
And cierro el navegador accidentalmente
When vuelvo a la plataforma
And voy a "Mis turnos"
Then deberia poder ver el estado real del pago
# Si se proceso: Pagado. Si no: Coordinado con opcion de pagar
# ============================================
# CASOS ESPECIALES
# ============================================
Scenario: Link de pago expirado
Given que recibi el link de pago hace mas de 24 horas
When hago click en el link
Then deberia ver "Este link ha expirado"
And deberia ver "Contacta a soporte para generar uno nuevo"
Scenario: Intento pagar turno ya pagado
Given que mi turno ya esta en estado "Pagado"
When accedo al link de pago
Then deberia ver "Este turno ya fue pagado"
And deberia ver boton "Ver detalle del turno"
Scenario: Precio cambio desde la coordinacion
# Caso muy raro pero posible
Given que el precio del servicio aumento desde que se coordino
When voy a pagar
Then deberia ver el precio original acordado
# El precio se congela al momento de coordinacion
# ============================================
# INTEGRACION CON WEBHOOK
# ============================================
Rule: El estado del turno se actualiza via webhook de Mercado Pago
Scenario: Webhook confirma pago aprobado
Given que el usuario completo el pago en Mercado Pago
When Mercado Pago envia webhook con status "approved"
Then el turno deberia cambiar a estado "Pagado"
And el veterinario deberia recibir notificacion
And el usuario deberia recibir email de confirmacion
Scenario: Webhook informa pago pendiente
Given que el usuario pago con transferencia bancaria
When Mercado Pago envia webhook con status "pending"
Then el turno deberia quedarse en "Coordinado"
And deberia registrarse el pago pendiente
And el usuario deberia recibir email "Esperando acreditacion"
Scenario: Webhook falla pero pago se proceso
# Caso de error que requiere intervencion manual
Given que el usuario pago exitosamente
But el webhook fallo por error de red
Then el turno seguira en "Coordinado"
And el equipo de ops deberia recibir alerta
And deberian poder actualizar manualmente

View File

@@ -0,0 +1,147 @@
# Fuente: album/book/ops-templates/pet-owner/05-historial-medico.md
# Drive: 08. IT y Producto/Funcionalidades Plataforma Veterinario
# Tests Backend: pytest tests/contracts/mascotas/test_vet_visits.py
# Tests Frontend: npx playwright test medical-history.spec.ts
Feature: Ver historial medico
Como dueno de mascota
Quiero ver el historial medico de mis mascotas
Para tener registro de sus visitas y tratamientos
Background:
Given que estoy logueado como dueno de mascota
And tengo una mascota "Luna" con visitas completadas
# ============================================
# ACCESO AL HISTORIAL
# ============================================
Scenario: Acceder al historial desde mascotas
Given que estoy en "Mis mascotas"
When hago click en "Luna"
And voy a la seccion "Historial de visitas"
Then deberia ver lista de visitas de Luna
Scenario: Acceder al historial desde turnos
Given que estoy en "Mis turnos"
And filtro por "Completados"
When hago click en un turno de Luna
And hago click en "Ver informe medico"
Then deberia ver el informe de esa visita
# ============================================
# VISUALIZACION DE VISITAS
# ============================================
Scenario: Ver lista de visitas ordenadas
Given que Luna tiene visitas en las siguientes fechas:
| fecha |
| 2024-01-15 |
| 2023-11-20 |
| 2023-06-10 |
When veo el historial de Luna
Then deberia ver las visitas ordenadas de mas reciente a mas antigua
And la primera deberia ser del "15 de enero 2024"
Scenario: Ver detalle completo de informe
When hago click en una visita completada
Then deberia ver los siguientes datos:
| seccion | contenido |
| Informacion | Fecha, veterinario, servicios |
| Examen fisico | Peso, temperatura, FC, obs |
| Diagnostico | Descripcion del diagnostico |
| Tratamiento | Plan de tratamiento |
| Medicamentos | Lista con dosis y frecuencia |
| Estudios | Estudios solicitados y estado |
| Seguimiento | Recomendaciones, proximo control |
Scenario: Ver informe con medicamentos recetados
Given que la visita incluye medicamentos:
"""
1. Amoxicilina 250mg - 1 comprimido cada 12hs por 7 dias
2. Meloxicam 1.5mg - 1 comprimido por dia por 3 dias
"""
When veo el informe
Then deberia ver la lista de medicamentos
And cada medicamento deberia mostrar:
| campo |
| Nombre |
| Dosis |
| Frecuencia |
| Duracion |
# ============================================
# DESCARGA Y COMPARTIR
# ============================================
Scenario: Descargar informe como PDF
Given que estoy viendo un informe medico
When hago click en "Descargar PDF"
Then deberia descargarse un archivo PDF
And el PDF deberia contener toda la informacion del informe
And deberia tener el logo de Amar Mascotas
Scenario: Imprimir informe
Given que estoy viendo un informe medico
When hago click en "Imprimir"
Then deberia abrirse el dialogo de impresion
And el formato deberia ser optimizado para impresion
# ============================================
# CASOS ESPECIALES
# ============================================
Scenario: Visita completada sin informe cargado
# El vet no cargo el informe todavia
Given que Luna tiene una visita marcada como "Completada"
But el veterinario no cargo el informe aun
When intento ver el informe
Then deberia ver mensaje "Informe pendiente"
And deberia ver "El veterinario esta completando el informe"
Scenario: Informe con estudios pendientes
Given que el informe solicita estudios de laboratorio
And los resultados aun no estan disponibles
When veo el informe
Then deberia ver seccion "Estudios solicitados"
And deberia ver estado "Pendiente de resultados"
And deberia ver nota "Se notificara cuando esten listos"
Scenario: Mascota con multiples visitas el mismo dia
# Raro pero posible: consulta de urgencia + seguimiento
Given que Luna tuvo 2 visitas el 15 de enero
When veo el historial
Then deberia ver ambas visitas listadas
And deberian estar diferenciadas por hora
# ============================================
# PERMISOS Y PRIVACIDAD
# ============================================
Rule: Solo el dueno puede ver el historial de su mascota
Scenario: Dueno ve historial de su mascota
Given que soy dueno de Luna
When accedo al historial de Luna
Then deberia poder verlo completo
Scenario: No puedo ver historial de mascota ajena
Given que existe mascota "Rocky" de otro dueno
When intento acceder al historial de Rocky
Then deberia ver error "No tienes acceso"
# 403 Forbidden
# ============================================
# BUSQUEDA Y FILTROS
# ============================================
Scenario: Filtrar historial por tipo de servicio
Given que Luna tiene visitas de vacunacion y consulta
When filtro por "Vacunacion"
Then solo deberia ver visitas de vacunacion
Scenario: Buscar en historial por fecha
When busco visitas del "2023"
Then solo deberia ver visitas del 2023
And no deberia ver visitas del 2024