Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fin #3

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -46,5 +46,5 @@ public abstract class BaseEntity {
@PodamExclude
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
protected Long id;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package co.edu.uniandes.dse.parcialprueba.entities;

import java.util.ArrayList;
import java.util.List;

import jakarta.persistence.Entity;
import jakarta.persistence.ManyToMany;
import lombok.Data;
import uk.co.jemos.podam.common.PodamExclude;

@Data
@Entity
public class EspecialidadEntity extends BaseEntity {

/*Cree la entidad EspecialidadEntity en la carpeta correspondiente.
Una especialidad tiene un nombre, una descripción
y un id de tipo Long que representa su llave primaria.
Tenga en cuenta que un médico puede tener varias especialiades y que una especialidad
puede ser ejercida por varios médicos.*/
private String nombre;
private String descripcion;

@PodamExclude
@ManyToMany(mappedBy = "especialidades") //Medico maneja la relación
private List<MedicoEntity> medicos = new ArrayList<>();

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package co.edu.uniandes.dse.parcialprueba.entities;

import java.util.ArrayList;
import java.util.List;

import jakarta.persistence.Entity;
import jakarta.persistence.JoinTable;
import jakarta.persistence.ManyToMany;
import lombok.Data;
import uk.co.jemos.podam.common.PodamExclude;

@Data
@Entity
public class MedicoEntity extends BaseEntity {

/* Un médico tiene un nombre, un apellido,
un registro médico y un id de tipo Long que
representa su llave primaria. Tenga en cuenta que un médico puede tener varias especialiades y que una especialidad puede ser ejercida por varios médicos. */

private String nombre;
private String apellido;
private String registroMedico;

@PodamExclude
@ManyToMany
@JoinTable(name = "medico_especialidad",
joinColumns = @jakarta.persistence.JoinColumn(name = "medico_id"), //Tabla intermedia
inverseJoinColumns = @jakarta.persistence.JoinColumn(name = "especialidad_id")) // FK de medico
private List<EspecialidadEntity> especialidades = new ArrayList<>(); // FK de especialidad


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package co.edu.uniandes.dse.parcialprueba.repositories;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import co.edu.uniandes.dse.parcialprueba.entities.EspecialidadEntity;

@Repository

public interface EspecialidadRepository extends JpaRepository<EspecialidadEntity, Long> {
List<EspecialidadEntity> findByNombre(String nombre);
List<EspecialidadEntity> findByDescripcion(String descripcion);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package co.edu.uniandes.dse.parcialprueba.repositories;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import co.edu.uniandes.dse.parcialprueba.entities.MedicoEntity;

@Repository

public interface MedicoRepository extends JpaRepository<MedicoEntity, Long> {
List<MedicoEntity> findByNombre(String nombre);
List<MedicoEntity> findByApellido(String apellido);
List<MedicoEntity> findByRegistroMedico(String registroMedico);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package co.edu.uniandes.dse.parcialprueba.services;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import co.edu.uniandes.dse.parcialprueba.entities.EspecialidadEntity;
import co.edu.uniandes.dse.parcialprueba.exceptions.IllegalOperationException;
import co.edu.uniandes.dse.parcialprueba.repositories.EspecialidadRepository;
import jakarta.transaction.Transactional;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
public class EspecialidadService {

@Autowired
private EspecialidadRepository especialidadRepository;

/*Cree la clase correspondiente para la lógica de especialidad.
Implemente unicamente el método createEspecialidad.
Valide que la descripción tenga como mínimo 10 caracteres. */
@Transactional
public EspecialidadEntity createEspecialidad(EspecialidadEntity especialidad) throws IllegalOperationException {
if (especialidad.getDescripcion().length() < 10) {
throw new IllegalOperationException ("La descripción debe tener al menos 10 caracteres.");
}
especialidad = especialidadRepository.save(especialidad);
return especialidad;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package co.edu.uniandes.dse.parcialprueba.services;

import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import co.edu.uniandes.dse.parcialprueba.exceptions.EntityNotFoundException;

import co.edu.uniandes.dse.parcialprueba.entities.EspecialidadEntity;
import co.edu.uniandes.dse.parcialprueba.entities.MedicoEntity;
import co.edu.uniandes.dse.parcialprueba.repositories.EspecialidadRepository;
import co.edu.uniandes.dse.parcialprueba.repositories.MedicoRepository;
import jakarta.transaction.Transactional;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
public class MedicoEspecialidadService {
@Autowired
private MedicoRepository medicoRepository;
@Autowired
private EspecialidadRepository especialidadRepository;

/* Cree la clase correspondiente para la lógica de la asociación
entre médico y especialidad. Implemente unicamente el método addEspecialidad.
Este método recibe como parámetro el id del médico, el id de la especidad y
le agrega la especialidad al médico.
Valide que tanto el médico como la especialidad existan.*/

@Transactional
public MedicoEntity addEspecialidad(Long idMedico, Long idEspecialidad) throws EntityNotFoundException {
log.info("Inicia proceso de agregar una especialidad con id {} al médico con id {}", idMedico, idEspecialidad);
Optional<MedicoEntity> medicoEntity = medicoRepository.findById(idMedico);
if (medicoEntity.isEmpty()) {
throw new EntityNotFoundException("No existe un médico con el id: " + idMedico);
}

Optional<EspecialidadEntity> especialidadEntity = especialidadRepository.findById(idEspecialidad);
if (especialidadEntity.isEmpty()) {
throw new EntityNotFoundException("No existe una especialidad con el id: " + idEspecialidad);
}

medicoEntity.get().getEspecialidades().add(especialidadEntity.get());
especialidadEntity.get().getMedicos().add(medicoEntity.get());
medicoRepository.save(medicoEntity.get());
especialidadRepository.save(especialidadEntity.get());

log.info("Termina proceso de agregar una especialidad con id {} al médico con id {}", idMedico, idEspecialidad);
return medicoEntity.get();

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package co.edu.uniandes.dse.parcialprueba.services;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import co.edu.uniandes.dse.parcialprueba.entities.MedicoEntity;
import co.edu.uniandes.dse.parcialprueba.exceptions.IllegalOperationException;
import co.edu.uniandes.dse.parcialprueba.repositories.MedicoRepository;
import jakarta.transaction.Transactional;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service

public class MedicoService {
/*Cree la clase correspondiente para la lógica de médico.
Implemente unicamente el método createMedicos. Valide que el registro
médico inicie solo con los caracteres "RM" (e.g., RM1745). */
@Autowired
private MedicoRepository medicoRepository;

/**
* Crea un nuevo médico en la base de datos.
* @param medico Entidad del médico a crear.
* @return El médico creado.
* @throws BusinessLogicException Si el registro médico no inicia con "RM".
*/
@Transactional
public MedicoEntity createMedico(MedicoEntity medico) throws IllegalOperationException {

if (!medico.getRegistroMedico().startsWith("RM")) {
throw new IllegalOperationException ("El registro médico debe iniciar con 'RM'.");
}
medico = medicoRepository.save(medico);
return medico;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package co.edu.uniandes.dse.parcialprueba.services;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager;
import org.springframework.context.annotation.Import;

import co.edu.uniandes.dse.parcialprueba.entities.EspecialidadEntity;
import co.edu.uniandes.dse.parcialprueba.exceptions.IllegalOperationException;
import jakarta.transaction.Transactional;
import uk.co.jemos.podam.api.PodamFactory;
import uk.co.jemos.podam.api.PodamFactoryImpl;

@DataJpaTest
@Transactional
@Import(EspecialidadService.class)
public class EspecialidadServiceTest {

@Autowired
private EspecialidadService especialidadService;

@Autowired
private TestEntityManager entityManager;

private PodamFactory factory = new PodamFactoryImpl();


@BeforeEach
void setUp() {
entityManager.getEntityManager().createQuery("DELETE FROM EspecialidadEntity").executeUpdate();
}


@Test
void createEspecialidadTest() throws IllegalOperationException {
EspecialidadEntity especialidad = factory.manufacturePojo(EspecialidadEntity.class);
especialidad.setDescripcion("Especialidad en cardiología"); // ✅ Descripción válida

EspecialidadEntity resultado = especialidadService.createEspecialidad(especialidad);

assertNotNull(resultado);
assertEquals("Especialidad en cardiología", resultado.getDescripcion());
assertNotNull(entityManager.find(EspecialidadEntity.class, resultado.getId()));
}


@Test
void createEspecialidadTestDescripcionInvalida() {
EspecialidadEntity especialidad = factory.manufacturePojo(EspecialidadEntity.class);
especialidad.setDescripcion("Corta"); // ❌ Descripción con menos de 10 caracteres

assertThrows(IllegalOperationException.class, () -> {
especialidadService.createEspecialidad(especialidad);
});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package co.edu.uniandes.dse.parcialprueba.services;
import static org.junit.jupiter.api.Assertions.*;

import java.util.ArrayList;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager;
import org.springframework.context.annotation.Import;

import co.edu.uniandes.dse.parcialprueba.entities.EspecialidadEntity;
import co.edu.uniandes.dse.parcialprueba.entities.MedicoEntity;
import co.edu.uniandes.dse.parcialprueba.exceptions.EntityNotFoundException;
import jakarta.transaction.Transactional;
import uk.co.jemos.podam.api.PodamFactory;
import uk.co.jemos.podam.api.PodamFactoryImpl;

@DataJpaTest
@Transactional
@Import({MedicoEspecialidadService.class})

public class MedicoEspecialidadServiceTest {
@Autowired
private MedicoEspecialidadService medicoEspecialidadService;

@Autowired
private TestEntityManager entityManager;
private PodamFactory factory = new PodamFactoryImpl();
private MedicoEntity medico;
private EspecialidadEntity especialidad;


@BeforeEach
void setUp() {
entityManager.getEntityManager().createQuery("delete from MedicoEntity").executeUpdate();
entityManager.getEntityManager().createQuery("delete from EspecialidadEntity").executeUpdate();

medico = factory.manufacturePojo(MedicoEntity.class);
medico.setEspecialidades(new ArrayList<>());
medico = entityManager.persist(medico);

especialidad = factory.manufacturePojo(EspecialidadEntity.class);
entityManager.persist(especialidad);
}
@Test
void addEspecialidadTest() throws EntityNotFoundException {
MedicoEntity resultado = medicoEspecialidadService.addEspecialidad(medico.getId(), especialidad.getId());

assertNotNull(resultado);
assertTrue(resultado.getEspecialidades().contains(especialidad));
}


@Test
void addEspecialidadConMedicoInvalidoTest() {
assertThrows(EntityNotFoundException.class, () -> {
medicoEspecialidadService.addEspecialidad(999L, especialidad.getId());
});
}


@Test
void addEspecialidadConEspecialidadInvalidaTest() {
assertThrows(EntityNotFoundException.class, () -> {
medicoEspecialidadService.addEspecialidad(medico.getId(), 999L);
});
}
}

Loading