Pruebas Maven aprobadas, sin fallos, errores ni omisiones.
Resultado verificado
Instrucciones cubiertas por JaCoCo.
Ramas cubiertas por JaCoCo.
Aserciones Bruno aprobadas contra PostgreSQL real.
La revisión se hizo sobre el estado actual del repositorio. El comando final ./mvnw -B clean verify terminó con BUILD SUCCESS y cumplió los umbrales obligatorios de cobertura.
Arquitectura actual
Los controladores dependen de interfaces de servicio. Las implementaciones coordinan las reglas del dominio y acceden a repositorios Spring Data JPA. Las entidades de persistencia permanecen en infraestructura; los modelos del dominio no importan Spring ni Jakarta Persistence.
Solicitud HTTP
│
▼
@RestController ──► interfaz Service ──► ServiceImpl
│
┌──────────────────┴──────────────────┐
▼ ▼
dominio puro JpaRepository
invariantes y transiciones entidades JPA + PostgreSQL
| Capa | Responsabilidad | Evidencia |
|---|---|---|
| Dominio | Modelos, cotización, validaciones y estados. | Sin anotaciones JPA ni dependencias de framework. |
| Aplicación | Interfaces e implementaciones de casos de uso. | Servicios de catálogo, cotización y reservas. |
| Infraestructura web | Controladores, DTOs, OpenAPI y manejo global de errores. | Rutas versionadas bajo /api/v1. |
| Infraestructura JPA | Entidades y cuatro repositorios Spring Data. | JpaRepository<Entity, ID>. |
Pilar 1 · API REST y errores semánticos
El servicio publica consultas de catálogo, cotización y ciclo de vida de reservas. Emplea GET para lectura, POST para creación/cotización y PATCH para transiciones.
| Operación | Ruta | Resultado principal |
|---|---|---|
| Consultar catálogo | /api/v1/locations, /characters, /episodes | 200 OK |
| Calcular cotización | POST /api/v1/quotes | 200 OK |
| Crear reserva | POST /api/v1/reservations | 201 Created |
| Iniciar, completar o cancelar | PATCH /api/v1/reservations/{id}/… | 200 OK o 409 Conflict |
Perímetro de errores
Un @RestControllerAdvice centraliza los errores en un sobre uniforme con estado, mensaje, datos y marca de tiempo. La semántica comprobada es 400 para entrada HTTP inválida, 404 para recursos ausentes, 409 para transiciones de estado inválidas, 422 para reglas del dominio y 500 genérico para fallos inesperados.
También se corrigió una omisión: una lista de acompañantes ya no descarta silenciosamente IDs inexistentes. Cada ID solicitado debe resolverse o la creación termina en 404. Los errores 500 se registran en servidor, pero no filtran excepciones, trazas, rutas ni datos sensibles al cliente.
Pilar 2 · PostgreSQL, JPA y Docker
compose.yml levanta PostgreSQL 17 Alpine con volumen persistente, comprobación de salud y semillas SQL. La configuración acepta DB_NAME, DB_USER, DB_PASSWORD y DB_PORT, conservando valores locales por defecto.
ubicaciones persistidas
personajes persistidos
episodios persistidos
reservas reales tras las pruebas de humo
Las entidades LocationEntity, CharacterEntity, EpisodeEntity y ReservationEntity viven únicamente en infraestructura. Cuatro interfaces JPA resuelven el acceso CRUD y las consultas derivadas.
Pilar 3 · OpenAPI seguro por perfiles
Los controladores incluyen @Tag, @Operation y respuestas documentadas. Los once DTOs web incluyen descripciones, ejemplos, rangos y valores permitidos con @Schema o @ArraySchema. El contrato de desarrollo usa OpenAPI 3.0 para evitar una regresión de serialización de Springdoc 3.1.
| Perfil | Swagger UI | OpenAPI JSON | JPA |
|---|---|---|---|
dev | /swagger-ui.html habilitado | /api-docs habilitado | ddl-auto: update |
test | habilitado para pruebas de contrato | habilitado y verificado | H2 aislado |
prod | 404 | 404 | ddl-auto: validate |
La prueba real del perfil productivo inició el servicio contra PostgreSQL, obtuvo 200 en /health y 404 en los dos endpoints de documentación.
Calidad, contratos y publicación
JaCoCo genera informes HTML y de consola durante test; verify bloquea el build si instrucciones o ramas bajan de 100%.
| Contador | Cubierto | Resultado |
|---|---|---|
| Instrucciones | 2390 / 2390 | 100% |
| Ramas | 92 / 92 | 100% |
| Líneas | 500 / 500 | 100% |
| Métodos | 157 / 157 | 100% |
GitHub Actions verifica pull requests y pushes a main, conserva artefactos Surefire y JaCoCo durante 14 días, y solo despliega Pages cuando el build de main finaliza correctamente.
Abrir el informe JaCoCo publicado · Abrir el repositorio
Colección Bruno
La colección versionada ejecuta ocho solicitudes secuenciales: salud, ubicaciones, cotización, creación, consulta, inicio, finalización y rechazo de cancelación de una reserva terminada. La ejecución real aprobó 8/8 solicitudes y 20/20 aserciones.
Ejecución local
# Base de datos persistente docker compose up -d # Aplicación en desarrollo ./mvnw spring-boot:run # Pruebas, reporte y umbral de cobertura ./mvnw clean verify # Contratos REST con Bruno cd bruno bru run --env-file environments/local.bru --bail
En desarrollo: Swagger UI en http://localhost:8080/swagger-ui.html, contrato JSON en http://localhost:8080/api-docs y salud en http://localhost:8080/health.