Test: spring-security-test + cobertura de JwtRequestFilter y controllers confidenciales
Qué
Cierra el P0 completo del hallazgo #2 (Alto) de la auditoría: agrega
spring-security-test y las primeras clases *ControllerTest del
proyecto, además de cobertura completa de JwtRequestFilter.
Por qué
Antes de esta MR, controller (0%) y security (1%) no tenían cobertura
real. Nada verificaba automáticamente que un JWT vencido o con firma
inválida fuera rechazado, ni que @PreAuthorize realmente bloqueara el
acceso a comentarios confidenciales de estudiantes por HTTP — la
"seguridad" del sistema solo se sabía que "funciona en manual".
Decisión de diseño importante: @SpringBootTest, no @WebMvcTest
En este proyecto la autorización fina (@PreAuthorize) vive en el
service, no en el controller. Un @WebMvcTest reemplaza el service por
un @MockBean — con lo cual @PreAuthorize nunca se ejecuta y el test
"pasaría" incluso si alguien borra el @PreAuthorize por accidente. Para
que el test realmente sirva de red de seguridad, se usa @SpringBootTest
(contexto completo, service real y proxied) + MockMvc, mockeando solo
los repositorios. Mismo patrón que ya usaba CategoriaCacheSeguridadOrderTest
(único precedente en el proyecto de @SpringBootTest a nivel service).
Cambios
-
pom.xml: agregaspring-security-test. -
JwtRequestFilterTest.java(9 casos, 100% instrucciones y ramas del
filtro): tokens reales firmados con JJWT, no mockeados. -
ComentarioConfidencialEstudianteControllerTest.java/
ComentarioConfidencialInstanciaControllerTest.java(6 casos c/u):
por endpoint de listar/crear — 401 sin token, 403 sin permiso, 200/201
con permiso, 400 con contenido en blanco.
Testing
- Suite completa: 537 tests, 0 failures (516 + 21 nuevos).
- Cobertura JaCoCo:
JwtRequestFilter0% → 100% instrucciones/ramas.
ComentarioConfidencialEstudianteController/...InstanciaController:
0% → ~43% instrucciones (2 de 5 endpoints cada uno — listar y crear).