feat: fix SienepApplicationTests, notificación RF15 y validación tamaño RF09
Este MR cierra tres puntos pendientes identificados en la revisión de Sprint 5, en la rama feature/completar-flujos-parciales.
¿Qué se hizo y por qué?
- SienepApplicationTests — fix de contexto de Spring El test fallaba porque application-test.properties no sobreescribía todas las propiedades que colisionaban con application.properties. En particular spring.jpa.hibernate.ddl-auto=validate del properties principal intentaba validar el schema contra H2, que no tiene las tablas de PostgreSQL. Se reescribió application-test.properties para ser explícito y autosuficiente: cubre datasource H2, JPA con ddl-auto=none, resolución de todas las variables ${...} del properties principal, y configuración dummy de mail para que el contexto de Spring Mail cargue sin credenciales reales. La clase SienepApplicationTests no se modifica — el problema era íntegramente de configuración.
- EmailService / InstanciaComunService — notificación de ID de instancia (RF15) RF15 requiere comunicar el ID de negocio generado al creador y participantes. El ID ya se retornaba en el ResponseDTO (mostrar en pantalla). Se cierra el gap del envío por email al funcionario creador. Se agregó enviarNotificacionInstancia en EmailService. A diferencia de los flujos de contraseña, este método no relanza la excepción si el envío falla: la instancia ya fue persistida correctamente y un fallo de SMTP no debe hacer rollback de la operación. El método registra el fallo como warn y continúa. En InstanciaComunService.crear se agrega la llamada al email después de persistir, con un try-catch externo como segunda capa de defensa para garantizar que ninguna excepción inesperada revierta la transacción de @Transactional.
- InformeAdjuntoService — validación de longitud de URL (RF09) RF09 especifica tamaño máximo de archivo. El sistema gestiona archivos por URL/ruta, no por carga directa con MultipartFile. Se agrega validación de longitud de URL con una constante documentada (MAX_URL_LENGTH = 500) y un comentario técnico explícito que explica la limitación actual y cómo evolucionaría si el sistema migra a carga directa.
Tests Todos unitarios con Mockito, sin contexto de Spring. InstanciaComunServiceTest — tests nuevos:
crear_EnviaNotificacionAlFuncionario — verifica que enviarNotificacionInstancia se llama con los argumentos correctos tras persistir crear_FalloDeEmail_NoRollback — verifica que si el email lanza excepción, la instancia igual se persiste y el método retorna sin error. Este test valida la decisión de diseño más importante del punto 8
InformeAdjuntoServiceTest — tests nuevos:
adjuntar_Exito_ExtensionMayuscula — verifica que extensiones en mayúsculas (.JPG) son aceptadas correctamente por el .toLowerCase() previo a la validación. Cubre un edge case que el código soportaba pero no tenía test adjuntar_LanzaExcepcion_UrlDemasiadoLarga — verifica que una URL que supera los 500 caracteres es rechazada con 400
Nota sobre RF15 El RF dice "mostrar y/o enviar según preferencias". El "mostrar" estaba cubierto desde el sprint anterior vía ResponseDTO. Este MR agrega el "enviar" al funcionario creador. Los participantes (involucrados) quedan fuera del alcance de este sprint — no existe aún un InvolucradoService que exponga email de participantes externos.