From b074794e8246fd0917fc5713ab9255b16854ee4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isidoro=20Nevares=20Mart=C3=ADn?= Date: Wed, 27 May 2026 12:07:47 +0200 Subject: [PATCH] Commit inicial --- .gitignore | 7 + README.md | 4 + pom.xml | 68 ++++++++ .../lapaloma/examen/aaee/AppGobiernoSB.java | 14 ++ .../aaee/controller/MiembroController.java | 63 ++++++++ .../aaee/controller/MinisterioController.java | 49 ++++++ .../lapaloma/examen/aaee/dao/IMiembroDAO.java | 14 ++ .../examen/aaee/dao/IMinisterioDAO.java | 14 ++ .../examen/aaee/dao/impl/MiembroDaoJDBC.java | 129 +++++++++++++++ .../aaee/dao/impl/MinisterioDaoJDBC.java | 98 ++++++++++++ .../MiembroNoEncontradoException.java | 12 ++ .../MinisterioNoEncontradoException.java | 12 ++ .../examen/aaee/service/MiembroService.java | 76 +++++++++ .../aaee/service/MinisterioService.java | 60 +++++++ .../org/lapaloma/examen/aaee/vo/Miembro.java | 88 ++++++++++ .../lapaloma/examen/aaee/vo/Ministerio.java | 70 ++++++++ src/main/resources/application.properties | 13 ++ .../aaee/service/MiembroServiceTest.java | 151 ++++++++++++++++++ .../aaee/service/MinisterioServiceTest.java | 120 ++++++++++++++ 19 files changed, 1062 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 pom.xml create mode 100644 src/main/java/org/lapaloma/examen/aaee/AppGobiernoSB.java create mode 100644 src/main/java/org/lapaloma/examen/aaee/controller/MiembroController.java create mode 100644 src/main/java/org/lapaloma/examen/aaee/controller/MinisterioController.java create mode 100644 src/main/java/org/lapaloma/examen/aaee/dao/IMiembroDAO.java create mode 100644 src/main/java/org/lapaloma/examen/aaee/dao/IMinisterioDAO.java create mode 100644 src/main/java/org/lapaloma/examen/aaee/dao/impl/MiembroDaoJDBC.java create mode 100644 src/main/java/org/lapaloma/examen/aaee/dao/impl/MinisterioDaoJDBC.java create mode 100644 src/main/java/org/lapaloma/examen/aaee/excepcion/MiembroNoEncontradoException.java create mode 100644 src/main/java/org/lapaloma/examen/aaee/excepcion/MinisterioNoEncontradoException.java create mode 100644 src/main/java/org/lapaloma/examen/aaee/service/MiembroService.java create mode 100644 src/main/java/org/lapaloma/examen/aaee/service/MinisterioService.java create mode 100644 src/main/java/org/lapaloma/examen/aaee/vo/Miembro.java create mode 100644 src/main/java/org/lapaloma/examen/aaee/vo/Ministerio.java create mode 100644 src/main/resources/application.properties create mode 100644 src/test/java/org/lapaloma/examen/aaee/service/MiembroServiceTest.java create mode 100644 src/test/java/org/lapaloma/examen/aaee/service/MinisterioServiceTest.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0293886 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +/bin/ +*.class +/target/ +# Eclipse +.classpath +.project +.settings/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..5ebd19c --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# Repositorio para el examen de ORDINARIA de Ampliación de Entornos (RA3-RA4-RA5). + +¡Ánimo y a por ello! + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..8c4c639 --- /dev/null +++ b/pom.xml @@ -0,0 +1,68 @@ + + 4.0.0 + org.lapaloma.examen.aaee + aaee_gobierno + 0.0.2 + + Prueba de Springboot + Proyecto para poder probar el funcionamiento de SpringBoot + + + org.springframework.boot + spring-boot-starter-parent + 4.0.1 + + + + UTF-8 + 23 + 6.0.3 + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + com.mysql + mysql-connector-j + 9.7.0 + compile + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + + + + + diff --git a/src/main/java/org/lapaloma/examen/aaee/AppGobiernoSB.java b/src/main/java/org/lapaloma/examen/aaee/AppGobiernoSB.java new file mode 100644 index 0000000..c716991 --- /dev/null +++ b/src/main/java/org/lapaloma/examen/aaee/AppGobiernoSB.java @@ -0,0 +1,14 @@ +package org.lapaloma.examen.aaee; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class AppGobiernoSB { + + public static void main(String[] args) { + SpringApplication.run(AppGobiernoSB.class, args); + + } + +} \ No newline at end of file diff --git a/src/main/java/org/lapaloma/examen/aaee/controller/MiembroController.java b/src/main/java/org/lapaloma/examen/aaee/controller/MiembroController.java new file mode 100644 index 0000000..11967e7 --- /dev/null +++ b/src/main/java/org/lapaloma/examen/aaee/controller/MiembroController.java @@ -0,0 +1,63 @@ +package org.lapaloma.examen.aaee.controller; + +import java.util.List; + +import org.lapaloma.examen.aaee.service.MiembroService; +import org.lapaloma.examen.aaee.vo.Miembro; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * Controlador REST para gestionar miembros de ministerios + * + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @date 08 mayo 2026 + */ +@RestController +@RequestMapping("/gobierno_ord/miembros") +public class MiembroController { + private final MiembroService miembroService; + + // Spring inyecta automáticamente el service con su DAO + public MiembroController(MiembroService miembroService) { + this.miembroService = miembroService; + } + + /** + * GET /gobierno_ord/miembros - Obtiene la lista de todos los miembros + * + * @return List lista de todos los miembros en formato JSON + */ + @GetMapping + public List getAll() { + List listaMiembros = miembroService.obtenerListaMiembros(); + return listaMiembros; + } + + /** + * GET /gobierno_ord/miembros/nombre/{nombre} - Obtiene un miembro por su nombre + * + * @param nombre el nombre del miembro a buscar + * @return Miembro el miembro encontrado en formato JSON + */ + @GetMapping("/nombre/{nombre}") + public Miembro getByNombre(@PathVariable String nombre) { + Miembro miembro = miembroService.obtenerMiembroPorNombre(nombre); + return miembro; + } + + /** + * GET /gobierno_ord/miembros/alias/{alias} - Obtiene un miembro por su alias + * + * @param alias el alias del miembro a buscar + * @return Miembro el miembro encontrado en formato JSON + */ + @GetMapping("/alias/{alias}") + public Miembro getByAlias(@PathVariable String alias) { + Miembro miembro = miembroService.obtenerMiembroPorAlias(alias); + return miembro; + } + +} diff --git a/src/main/java/org/lapaloma/examen/aaee/controller/MinisterioController.java b/src/main/java/org/lapaloma/examen/aaee/controller/MinisterioController.java new file mode 100644 index 0000000..56af94f --- /dev/null +++ b/src/main/java/org/lapaloma/examen/aaee/controller/MinisterioController.java @@ -0,0 +1,49 @@ +/** + * + */ +package org.lapaloma.examen.aaee.controller; + +import java.util.List; + +import org.lapaloma.examen.aaee.service.MinisterioService; +import org.lapaloma.examen.aaee.vo.Ministerio; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * Isidoro Nevares Martín - Virgen de la Paloma Fecha creación: 13 mar 2026 + */ +@RestController +@RequestMapping("/gobierno_ord/ministerios") +public class MinisterioController { + private final MinisterioService ministerioService; + + // Spring inyecta automáticamente el service con su DAO + public MinisterioController(MinisterioService ministerioService) { + this.ministerioService = ministerioService; + } + + // GET /gobierno_ord/ministerios - listar todos los ministerios + @GetMapping + public List getAll() { + List listaMinisterios = ministerioService.obtenerListaMinisterios(); + return listaMinisterios; + } + + // GET /gobierno_ord/ministerios/nombre/{nombre} - obtener un ministerio por nombre + @GetMapping("/nombre/{nombre}") + public Ministerio getByNombre(@PathVariable String nombre) { + Ministerio ministerio = ministerioService.obtenerMinisterioPorNombre(nombre); + return ministerio; + } + + // GET /gobierno_ord/ministerios/id/{id} - obtener un ministerio por identificador + @GetMapping("/id/{id}") + public Ministerio getByIdentificador(@PathVariable int id) { + Ministerio ministerio = ministerioService.obtenerMinisterioPorIdentificador(id); + return ministerio; + } + +} diff --git a/src/main/java/org/lapaloma/examen/aaee/dao/IMiembroDAO.java b/src/main/java/org/lapaloma/examen/aaee/dao/IMiembroDAO.java new file mode 100644 index 0000000..f5f2753 --- /dev/null +++ b/src/main/java/org/lapaloma/examen/aaee/dao/IMiembroDAO.java @@ -0,0 +1,14 @@ +package org.lapaloma.examen.aaee.dao; + +import java.util.List; + +import org.lapaloma.examen.aaee.vo.Miembro; + +public interface IMiembroDAO { + + public List obtenerListaMiembros(); + + public Miembro obtenerMiembroPorNombre(String nombre); + + public Miembro obtenerMiembroPorAlias(String alias); +} diff --git a/src/main/java/org/lapaloma/examen/aaee/dao/IMinisterioDAO.java b/src/main/java/org/lapaloma/examen/aaee/dao/IMinisterioDAO.java new file mode 100644 index 0000000..2e2a697 --- /dev/null +++ b/src/main/java/org/lapaloma/examen/aaee/dao/IMinisterioDAO.java @@ -0,0 +1,14 @@ +package org.lapaloma.examen.aaee.dao; + +import java.util.List; + +import org.lapaloma.examen.aaee.vo.Ministerio; + +public interface IMinisterioDAO { + + public List obtenerListaMinisterios(); + + public Ministerio obtenerMinisterioPorNombre(String nombre); + + public Ministerio obtenerMinisterioPorIdentificador(int identificador); +} diff --git a/src/main/java/org/lapaloma/examen/aaee/dao/impl/MiembroDaoJDBC.java b/src/main/java/org/lapaloma/examen/aaee/dao/impl/MiembroDaoJDBC.java new file mode 100644 index 0000000..d02f6aa --- /dev/null +++ b/src/main/java/org/lapaloma/examen/aaee/dao/impl/MiembroDaoJDBC.java @@ -0,0 +1,129 @@ +package org.lapaloma.examen.aaee.dao.impl; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import javax.sql.DataSource; + +import org.lapaloma.examen.aaee.dao.IMiembroDAO; +import org.lapaloma.examen.aaee.vo.Miembro; +import org.lapaloma.examen.aaee.vo.Ministerio; +import org.springframework.stereotype.Repository; + +@Repository +public class MiembroDaoJDBC implements IMiembroDAO { + private final DataSource dataSource; + + // Spring inyecta el DataSource configurado automáticamente + public MiembroDaoJDBC(DataSource dataSource) { + this.dataSource = dataSource; + } + + @Override + public List obtenerListaMiembros() { + + List lista = new ArrayList<>(); + + String sentenciaSQL = """ + SELECT * FROM miembro + """; + + try (Connection conexion = dataSource.getConnection(); + PreparedStatement sentenciaJDBCPreparada = conexion.prepareStatement(sentenciaSQL);) { + + System.out.println(sentenciaJDBCPreparada); + + ResultSet resultadoSentencia = sentenciaJDBCPreparada.executeQuery(); + + while (resultadoSentencia.next()) { + lista.add(getLineaFromResultSet(resultadoSentencia)); + } + + } catch (Exception e) { + e.printStackTrace(); + } + + return lista; + } + + @Override + public Miembro obtenerMiembroPorNombre(String nombre) { + + String sentenciaSQL = """ + SELECT * FROM miembro WHERE nombre = ? + """; + + try (Connection conexion = dataSource.getConnection(); + PreparedStatement sentenciaJDBCPreparada = conexion.prepareStatement(sentenciaSQL);) { + + sentenciaJDBCPreparada.setString(1, nombre); + + System.out.println(sentenciaJDBCPreparada); + + ResultSet resultadoSentencia = sentenciaJDBCPreparada.executeQuery(); + + if (resultadoSentencia.next()) { + return getLineaFromResultSet(resultadoSentencia); + } + + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + + @Override + public Miembro obtenerMiembroPorAlias(String alias) { + + String sentenciaSQL = """ + SELECT * FROM miembro WHERE alias = ? + """; + + try (Connection conexion = dataSource.getConnection(); + PreparedStatement sentenciaJDBCPreparada = conexion.prepareStatement(sentenciaSQL);) { + + sentenciaJDBCPreparada.setString(1, alias); + + System.out.println(sentenciaJDBCPreparada); + + ResultSet resultadoSentencia = sentenciaJDBCPreparada.executeQuery(); + + if (resultadoSentencia.next()) { + return getLineaFromResultSet(resultadoSentencia); + } + + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + + private Miembro getLineaFromResultSet(ResultSet resultadoSentencia) throws SQLException { + + Miembro miembro = new Miembro(); + + miembro.setIdentificador(resultadoSentencia.getInt("codMiembro")); + miembro.setNif(resultadoSentencia.getString("nif")); + miembro.setNombre(resultadoSentencia.getString("nombre")); + miembro.setApellido1(resultadoSentencia.getString("apellido1")); + miembro.setAlias(resultadoSentencia.getString("alias")); + + // Obtener el código del ministerio + int codigoMinisterio = resultadoSentencia.getInt("codigoMinisterio"); + + // Si codigoMinisterio es válido (no es 0), crear objeto Ministerio + if (codigoMinisterio != 0) { + Ministerio ministerio = new Ministerio(); + ministerio.setIdentificador(codigoMinisterio); + miembro.setMinisterio(ministerio); + } + + return miembro; + } +} diff --git a/src/main/java/org/lapaloma/examen/aaee/dao/impl/MinisterioDaoJDBC.java b/src/main/java/org/lapaloma/examen/aaee/dao/impl/MinisterioDaoJDBC.java new file mode 100644 index 0000000..7b6100e --- /dev/null +++ b/src/main/java/org/lapaloma/examen/aaee/dao/impl/MinisterioDaoJDBC.java @@ -0,0 +1,98 @@ +package org.lapaloma.examen.aaee.dao.impl; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import javax.sql.DataSource; + +import org.lapaloma.examen.aaee.dao.IMinisterioDAO; +import org.lapaloma.examen.aaee.vo.Ministerio; +import org.springframework.stereotype.Repository; + +@Repository +public class MinisterioDaoJDBC implements IMinisterioDAO { + private final DataSource dataSource; + + // Spring inyecta el DataSource configurado automáticamente + public MinisterioDaoJDBC(DataSource dataSource) { + this.dataSource = dataSource; + } + + + @Override + public List obtenerListaMinisterios() { + + List lista = new ArrayList<>(); + + String sentenciaSQL = """ + SELECT * FROM ministerio + """; + + try (Connection conexion = dataSource.getConnection(); + PreparedStatement sentenciaJDBCPreparada = conexion.prepareStatement(sentenciaSQL);) { + + System.out.println(sentenciaJDBCPreparada); + + ResultSet resultadoSentencia = sentenciaJDBCPreparada.executeQuery(); + + while (resultadoSentencia.next()) { + lista.add(getLineaFromResultSet(resultadoSentencia)); + } + + } catch (Exception e) { + e.printStackTrace(); + } + + return lista; + } + + + + private Ministerio getLineaFromResultSet(ResultSet resultadoSentencia) throws SQLException { + + Ministerio ministerio = new Ministerio(); + + ministerio.setIdentificador(resultadoSentencia.getInt("codMinisterio")); + ministerio.setNombre(resultadoSentencia.getString("nombre")); + ministerio.setPresupuesto(resultadoSentencia.getDouble("presupuesto")); + ministerio.setGastos(resultadoSentencia.getDouble("gastos")); + + return ministerio; + } + + private Ministerio obtenerMinisterio(String sentenciaSQL, Object parametro) { + try (Connection conexion = dataSource.getConnection(); + PreparedStatement sentenciaJDBCPreparada = conexion.prepareStatement(sentenciaSQL);) { + + sentenciaJDBCPreparada.setObject(1, parametro); + System.out.println(sentenciaJDBCPreparada); + + try (ResultSet resultadoSentencia = sentenciaJDBCPreparada.executeQuery()) { + if (resultadoSentencia.next()) { + return getLineaFromResultSet(resultadoSentencia); + } + } + + } catch (SQLException e) { + e.printStackTrace(); + } + + return null; + } + + @Override + public Ministerio obtenerMinisterioPorNombre(String nombre) { + String sentenciaSQL = "SELECT * FROM ministerio WHERE nombre = ?"; + return obtenerMinisterio(sentenciaSQL, nombre); + } + + @Override + public Ministerio obtenerMinisterioPorIdentificador(int identificador) { + String sentenciaSQL = "SELECT * FROM ministerio WHERE codMinisterio = ?"; + return obtenerMinisterio(sentenciaSQL, identificador); + } +} diff --git a/src/main/java/org/lapaloma/examen/aaee/excepcion/MiembroNoEncontradoException.java b/src/main/java/org/lapaloma/examen/aaee/excepcion/MiembroNoEncontradoException.java new file mode 100644 index 0000000..f4d0254 --- /dev/null +++ b/src/main/java/org/lapaloma/examen/aaee/excepcion/MiembroNoEncontradoException.java @@ -0,0 +1,12 @@ +package org.lapaloma.examen.aaee.excepcion; + +public class MiembroNoEncontradoException extends RuntimeException { + /** + * + */ + private static final long serialVersionUID = -3344627619585104665L; + + public MiembroNoEncontradoException(String mensaje) { + super(mensaje); + } +} diff --git a/src/main/java/org/lapaloma/examen/aaee/excepcion/MinisterioNoEncontradoException.java b/src/main/java/org/lapaloma/examen/aaee/excepcion/MinisterioNoEncontradoException.java new file mode 100644 index 0000000..d0bca6b --- /dev/null +++ b/src/main/java/org/lapaloma/examen/aaee/excepcion/MinisterioNoEncontradoException.java @@ -0,0 +1,12 @@ +package org.lapaloma.examen.aaee.excepcion; + +public class MinisterioNoEncontradoException extends RuntimeException { + /** + * + */ + private static final long serialVersionUID = -3344627619585104664L; + + public MinisterioNoEncontradoException(String mensaje) { + super(mensaje); + } +} diff --git a/src/main/java/org/lapaloma/examen/aaee/service/MiembroService.java b/src/main/java/org/lapaloma/examen/aaee/service/MiembroService.java new file mode 100644 index 0000000..23a92e1 --- /dev/null +++ b/src/main/java/org/lapaloma/examen/aaee/service/MiembroService.java @@ -0,0 +1,76 @@ +package org.lapaloma.examen.aaee.service; + +import java.util.List; + +import org.lapaloma.examen.aaee.dao.IMiembroDAO; +import org.lapaloma.examen.aaee.excepcion.MiembroNoEncontradoException; +import org.lapaloma.examen.aaee.vo.Miembro; +import org.springframework.stereotype.Service; + +@Service +public class MiembroService { + + private final IMiembroDAO miembroDAO; + + // Spring inyecta el DAO automáticamente + public MiembroService(IMiembroDAO miembroDAO) { + this.miembroDAO = miembroDAO; + } + + /** + * Obtiene la lista completa de miembros + * + * @return List lista de todos los miembros + * @throws RuntimeException si la lista está vacía + */ + public List obtenerListaMiembros() { + + List lista = miembroDAO.obtenerListaMiembros(); + + // Simulamos el caso de lista vacía para probar la excepción + lista=null; + + if (lista == null || lista.isEmpty()) { + throw new RuntimeException("No hay miembros disponibles"); + } + + return lista; + } + + /** + * Obtiene un miembro por su nombre + * + * @param nombre el nombre del miembro a buscar + * @return Miembro el miembro encontrado + * @throws MiembroNoEncontradoException si no se encuentra el miembro + */ + public Miembro obtenerMiembroPorNombre(String nombre) { + + Miembro miembro = miembroDAO.obtenerMiembroPorNombre(nombre); + + if (miembro == null) { + throw new MiembroNoEncontradoException("Miembro con nombre '" + nombre + "' no encontrado"); + } + + return miembro; + } + + /** + * Obtiene un miembro por su alias + * + * @param alias el alias del miembro a buscar + * @return Miembro el miembro encontrado + * @throws MiembroNoEncontradoException si no se encuentra el miembro + */ + public Miembro obtenerMiembroPorAlias(String alias) { + + Miembro miembro = miembroDAO.obtenerMiembroPorAlias(alias); + + if (miembro == null) { + throw new MiembroNoEncontradoException("Miembro con alias '" + alias + "' no encontrado"); + } + + return miembro; + } + +} diff --git a/src/main/java/org/lapaloma/examen/aaee/service/MinisterioService.java b/src/main/java/org/lapaloma/examen/aaee/service/MinisterioService.java new file mode 100644 index 0000000..fbcbbed --- /dev/null +++ b/src/main/java/org/lapaloma/examen/aaee/service/MinisterioService.java @@ -0,0 +1,60 @@ +/** + * + */ +package org.lapaloma.examen.aaee.service; + +import java.util.List; + +import org.lapaloma.examen.aaee.dao.IMinisterioDAO; +import org.lapaloma.examen.aaee.excepcion.MinisterioNoEncontradoException; +import org.lapaloma.examen.aaee.vo.Ministerio; +import org.springframework.stereotype.Service; + +@Service +public class MinisterioService { + + private final IMinisterioDAO ministerioDAO; + + // Spring inyecta el DAO automáticamente + public MinisterioService(IMinisterioDAO ministerioDAO) { + this.ministerioDAO = ministerioDAO; + } + + public List obtenerListaMinisterios() { + + List lista = ministerioDAO.obtenerListaMinisterios(); + + // Simulamos el caso de lista vacía para probar la excepción + lista=null; + + if (lista == null || lista.isEmpty()) { + throw new RuntimeException("No hay ministerios disponibles"); + } + + return lista; + } + + public Ministerio obtenerMinisterioPorNombre(String nombre) { + Ministerio ministerio = ministerioDAO.obtenerMinisterioPorNombre(nombre); + + if (ministerio == null) { + throw new MinisterioNoEncontradoException("Ministerio con nombre '" + nombre + "' no encontrado"); + } + + return ministerio; + } + + public Ministerio obtenerMinisterioPorIdentificador(int identificador) { + Ministerio ministerio = ministerioDAO.obtenerMinisterioPorIdentificador(identificador); + + // Simulamos el caso de lista vacía para probar la excepción + ministerio=null; + + if (ministerio == null) { + throw new MinisterioNoEncontradoException("Ministerio con identificador '" + identificador + "' no encontrado"); + } + + return ministerio; + } + +} \ No newline at end of file diff --git a/src/main/java/org/lapaloma/examen/aaee/vo/Miembro.java b/src/main/java/org/lapaloma/examen/aaee/vo/Miembro.java new file mode 100644 index 0000000..90d6326 --- /dev/null +++ b/src/main/java/org/lapaloma/examen/aaee/vo/Miembro.java @@ -0,0 +1,88 @@ +package org.lapaloma.examen.aaee.vo; + +/** + * + * Casa: Clase de persistencia que representa un Miembro de un Ministerio. + * + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @date 03 marzo 2026 + * + * + */ +public class Miembro { + private int identificador; + private String nif; + private String nombre; + private String apellido1; + private String alias; + private Ministerio ministerio; + + public Miembro() { + super(); + } + + public Miembro(int identificador, String nif, String nombre, String apellido1, String alias, + Ministerio ministerio) { + super(); + this.identificador = identificador; + this.nif = nif; + this.nombre = nombre; + this.apellido1 = apellido1; + this.alias = alias; + this.ministerio = ministerio; + } + + public int getIdentificador() { + return identificador; + } + + public void setIdentificador(int identificador) { + this.identificador = identificador; + } + + public String getNif() { + return nif; + } + + public void setNif(String nif) { + this.nif = nif; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public String getApellido1() { + return apellido1; + } + + public void setApellido1(String apellido1) { + this.apellido1 = apellido1; + } + + public String getAlias() { + return alias; + } + + public void setAlias(String alias) { + this.alias = alias; + } + + public Ministerio getMinisterio() { + return ministerio; + } + + public void setMinisterio(Ministerio ministerio) { + this.ministerio = ministerio; + } + + @Override + public String toString() { + return "Miembro [identificador=" + identificador + ", nif=" + nif + ", nombre=" + nombre + ", apellido1=" + + apellido1 + ", alias=" + alias + ", ministerio=" + ministerio + "]"; + } +} diff --git a/src/main/java/org/lapaloma/examen/aaee/vo/Ministerio.java b/src/main/java/org/lapaloma/examen/aaee/vo/Ministerio.java new file mode 100644 index 0000000..f1272f8 --- /dev/null +++ b/src/main/java/org/lapaloma/examen/aaee/vo/Ministerio.java @@ -0,0 +1,70 @@ +package org.lapaloma.examen.aaee.vo; + +/** + * + * Casa: Clase de persistencia que representa una Ministerio de Gobierno. + * + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @date 03 marzo 2026 + * + * + */ +public class Ministerio { + private int identificador; + private String nombre; + private double presupuesto; + private double gastos; + + /** + * @param identificador + * @param nombre + */ + public Ministerio(int identificador, String nombre, double presupuesto, double gastos) { + super(); + this.identificador = identificador; + this.nombre = nombre; + this.presupuesto = presupuesto; + this.gastos = gastos; + } + + public double getPresupuesto() { + return presupuesto; + } + + public void setPresupuesto(double presupuesto) { + this.presupuesto = presupuesto; + } + + public double getGastos() { + return gastos; + } + + public void setGastos(double gastos) { + this.gastos = gastos; + } + + public Ministerio() { + } + + public int getIdentificador() { + return identificador; + } + + public void setIdentificador(int identificador) { + this.identificador = identificador; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + @Override + public String toString() { + return "Casa [identificador=" + identificador + ", nombre=" + nombre + "]"; + } + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..21b9dc1 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,13 @@ +# Puerto en que escucha Spring Boot +server.port=8080 + +# Servicio de la base de datos. +# Ejemplo url base dator: +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.url=jdbc:mysql://${DB_HOST:192.168.1.36}:${DB_PORT:3306}/${DB_NAME:Gobierno} +spring.datasource.username=${DB_USER:root} +spring.datasource.password=${DB_PASSWORD:mysql_123} + +# Parámetros del Pool de conexiones HikariCP +spring.datasource.hikari.maximum-pool-size=10 +spring.datasource.hikari.minimum-idle=2 \ No newline at end of file diff --git a/src/test/java/org/lapaloma/examen/aaee/service/MiembroServiceTest.java b/src/test/java/org/lapaloma/examen/aaee/service/MiembroServiceTest.java new file mode 100644 index 0000000..4da2c81 --- /dev/null +++ b/src/test/java/org/lapaloma/examen/aaee/service/MiembroServiceTest.java @@ -0,0 +1,151 @@ +package org.lapaloma.examen.aaee.service; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.lapaloma.examen.aaee.dao.IMiembroDAO; +import org.lapaloma.examen.aaee.excepcion.MiembroNoEncontradoException; +import org.lapaloma.examen.aaee.vo.Miembro; +import org.lapaloma.examen.aaee.vo.Ministerio; + +class MiembroServiceTest { + + private MiembroService miembroService; + private FakeMiembroDAO fakeDAO; + + @BeforeEach + void setUp() { + fakeDAO = new FakeMiembroDAO(); + miembroService = new MiembroService(fakeDAO); + } + + // ========================= + // obtenerListaMiembros + // ========================= + + @Test + void obtenerListaMiembros_cuandoListaEstaVacia_lanzaExcepcion() { + assertThrows(RuntimeException.class, () -> { + miembroService.obtenerListaMiembros(); + }); + } + + @Test + void obtenerListaMiembros_cuandoHayDatos_retornaLista() { + Ministerio ministerio = new Ministerio(1, "Ministerio de Defensa", 120000, 6000); + Miembro miembro1 = new Miembro(1, "23451596F", "James", "Logan", "Lobezno", ministerio); + + fakeDAO.data.add(miembro1); + + List resultado = miembroService.obtenerListaMiembros(); + + assertNotNull(resultado); + assertEquals(1, resultado.size()); + assertEquals("James", resultado.get(0).getNombre()); + } + + // ========================= + // obtenerMiembroPorNombre + // ========================= + + @Test + void obtenerMiembroPorNombre_cuandoNoExiste_lanzaExcepcion() { + assertThrows(MiembroNoEncontradoException.class, () -> { + miembroService.obtenerMiembroPorNombre("NoExiste"); + }); + } + + @Test + void obtenerMiembroPorNombre_cuandoExiste_retornaMiembro() { + Ministerio ministerio = new Ministerio(1, "Ministerio de Defensa", 120000, 6000); + Miembro miembro1 = new Miembro(1, "23451596F", "James", "Logan", "Lobezno", ministerio); + + fakeDAO.data.add(miembro1); + + Miembro resultado = miembroService.obtenerMiembroPorNombre("James"); + + assertNotNull(resultado); + assertEquals("James", resultado.getNombre()); + assertEquals("Logan", resultado.getApellido1()); + assertEquals("Lobezno", resultado.getAlias()); + } + + // ========================= + // obtenerMiembroPorAlias + // ========================= + + @Test + void obtenerMiembroPorAlias_cuandoNoExiste_lanzaExcepcion() { + assertThrows(MiembroNoEncontradoException.class, () -> { + miembroService.obtenerMiembroPorAlias("AliasNoExiste"); + }); + } + + @Test + void obtenerMiembroPorAlias_cuandoExiste_retornaMiembro() { + Ministerio ministerio = new Ministerio(1, "Ministerio de Defensa", 120000, 6000); + Miembro miembro1 = new Miembro(1, "23451596F", "James", "Logan", "Lobezno", ministerio); + + fakeDAO.data.add(miembro1); + + Miembro resultado = miembroService.obtenerMiembroPorAlias("Lobezno"); + + assertNotNull(resultado); + assertEquals("James", resultado.getNombre()); + assertEquals("Lobezno", resultado.getAlias()); + } + + @Test + void obtenerMiembroPorAlias_cuandoAliasEsNull_manejaCorrectamente() { + Ministerio ministerio = new Ministerio(2, "Ministerio de Economía", 375000, 38000); + Miembro miembro1 = new Miembro(3, "36974641B", "Tío", "Gilito", null, ministerio); + + fakeDAO.data.add(miembro1); + + // Buscar un alias null debería lanzar excepción + assertThrows(MiembroNoEncontradoException.class, () -> { + miembroService.obtenerMiembroPorAlias(null); + }); + } + + // ========================= + // FakeMiembroDAO + // ========================= + + static class FakeMiembroDAO implements IMiembroDAO { + + private List data = new ArrayList<>(); + + @Override + public List obtenerListaMiembros() { + return new ArrayList<>(data); + } + + @Override + public Miembro obtenerMiembroPorNombre(String nombre) { + return data.stream() + .filter(m -> m.getNombre().equals(nombre)) + .findFirst() + .orElse(null); + } + + @Override + public Miembro obtenerMiembroPorAlias(String alias) { + return data.stream() + .filter(m -> { + String miembroAlias = m.getAlias(); + return miembroAlias != null && miembroAlias.equals(alias); + }) + .findFirst() + .orElse(null); + } + + } + +} diff --git a/src/test/java/org/lapaloma/examen/aaee/service/MinisterioServiceTest.java b/src/test/java/org/lapaloma/examen/aaee/service/MinisterioServiceTest.java new file mode 100644 index 0000000..e55a77c --- /dev/null +++ b/src/test/java/org/lapaloma/examen/aaee/service/MinisterioServiceTest.java @@ -0,0 +1,120 @@ +package org.lapaloma.examen.aaee.service; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.lapaloma.examen.aaee.dao.IMinisterioDAO; +import org.lapaloma.examen.aaee.excepcion.MinisterioNoEncontradoException; +import org.lapaloma.examen.aaee.service.MinisterioService; +import org.lapaloma.examen.aaee.vo.Ministerio; + +class MinisterioServiceTest { + + private MinisterioService ministerioService; + private FakeMinisterioDAO fakeDAO; + + @BeforeEach + void setUp() { + fakeDAO = new FakeMinisterioDAO(); + ministerioService = new MinisterioService(fakeDAO); + } + + // ========================= + // obtenerListaMinisterios + // ========================= + + @Test + void obtenerListaMinisterios_cuandoListaEstaVacio_lanzaExcepcion() { + assertThrows(RuntimeException.class, () -> { + ministerioService.obtenerListaMinisterios(); + }); + } + + @Test + void obtenerListaMinisterio_cuandoHayDatos_retornaLista() { + fakeDAO.data.add(new Ministerio(1, "Ministerio de Defensa", 120000, 100000)); + + List resultado = ministerioService.obtenerListaMinisterios(); + + assertNotNull(resultado); + assertEquals(1, resultado.size()); + } + + // ========================= + // obtenerMinisterioPorNombre + // ========================= + + @Test + void obtenerMinisterioPorNombre_cuandoNoExiste_lanzaExcepcion() { + assertThrows(MinisterioNoEncontradoException.class, () -> { + ministerioService.obtenerMinisterioPorNombre("NoExiste"); + }); + } + + @Test + void obtenerMinisterioPorNombre_cuandoExiste_retornaMinisterio() { + fakeDAO.data.add(new Ministerio(1, "Ministerio de Defensa", 120000, 100000)); + + Ministerio resultado = ministerioService.obtenerMinisterioPorNombre("Ministerio de Defensa"); + + assertNotNull(resultado); + assertEquals(1, resultado.getIdentificador()); + assertEquals("Ministerio de Defensa", resultado.getNombre()); + } + + // ========================= + // obtenerMinisterioPorIdentificador + // ========================= + + @Test + void obtenerMinisterioPorIdentificador_cuandoNoExiste_lanzaExcepcion() { + assertThrows(MinisterioNoEncontradoException.class, () -> { + ministerioService.obtenerMinisterioPorIdentificador(99); + }); + } + + @Test + void obtenerMinisterioPorIdentificador_cuandoExiste_retornaMinisterio() { + fakeDAO.data.add(new Ministerio(2, "Ministerio de Economía", 375000, 38000)); + + Ministerio resultado = ministerioService.obtenerMinisterioPorIdentificador(2); + + assertNotNull(resultado); + assertEquals(2, resultado.getIdentificador()); + assertEquals("Ministerio de Economía", resultado.getNombre()); + } + + static class FakeMinisterioDAO implements IMinisterioDAO { + + private List data = new ArrayList<>(); + + @Override + public List obtenerListaMinisterios() { + return new ArrayList<>(data); + } + + @Override + public Ministerio obtenerMinisterioPorNombre(String nombre) { + return data.stream() + .filter(m -> m.getNombre().equals(nombre)) + .findFirst() + .orElse(null); + } + + @Override + public Ministerio obtenerMinisterioPorIdentificador(int identificador) { + return data.stream() + .filter(m -> m.getIdentificador() == identificador) + .findFirst() + .orElse(null); + } + + } + +} \ No newline at end of file