From 5d2d82159619a8e0e73859073248b5de54904d27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Machaj?= Date: Mon, 17 Mar 2025 11:46:29 +0100 Subject: [PATCH 01/12] add business logic --- pom.xml | 13 ++ .../ConflictedAppointmentException.java | 10 ++ .../common/to/AppointmentBookingEto.java | 10 ++ .../common/to/AppointmentCto.java | 8 + .../common/to/AppointmentEto.java | 11 ++ .../common/to/ClientCto.java | 8 + .../common/to/ClientEto.java | 8 + .../common/to/SpecialistCto.java | 8 + .../common/to/SpecialistEto.java | 9 + .../common/to/TreatmentCreationEto.java | 8 + .../common/to/TreatmentCto.java | 8 + .../common/to/TreatmentEto.java | 8 + .../appointmentbooking/common/to/UserEto.java | 8 + .../logic/FindAppointmentUc.java | 21 +++ .../logic/FindTreatmentUc.java | 17 ++ .../logic/ManageAppointmentUc.java | 15 ++ .../logic/ManageTreatmentUc.java | 10 ++ .../logic/impl/FindAppointmentUcImpl.java | 51 ++++++ .../logic/impl/FindTreatmentUcImpl.java | 43 +++++ .../logic/impl/ManageAppointmentUcImpl.java | 100 +++++++++++ .../logic/impl/ManageTreatmentUcImpl.java | 51 ++++++ .../logic/mapper/AppointmentMapper.java | 33 ++++ .../logic/mapper/ClientMapper.java | 20 +++ .../logic/mapper/SpecialistMapper.java | 19 +++ .../logic/mapper/TreatmentMapper.java | 31 ++++ .../logic/mapper/UserMapper.java | 21 +++ .../logic/FindAppointmentUcTestIT.java | 81 +++++++++ .../logic/ManageAppointmentUcTestIT.java | 90 ++++++++++ .../logic/impl/FindAppointmentUcImplTest.java | 121 ++++++++++++++ .../impl/ManageAppointmentUcImplTest.java | 158 ++++++++++++++++++ 30 files changed, 999 insertions(+) create mode 100644 src/main/java/com/capgemini/training/appointmentbooking/common/exception/ConflictedAppointmentException.java create mode 100644 src/main/java/com/capgemini/training/appointmentbooking/common/to/AppointmentBookingEto.java create mode 100644 src/main/java/com/capgemini/training/appointmentbooking/common/to/AppointmentCto.java create mode 100644 src/main/java/com/capgemini/training/appointmentbooking/common/to/AppointmentEto.java create mode 100644 src/main/java/com/capgemini/training/appointmentbooking/common/to/ClientCto.java create mode 100644 src/main/java/com/capgemini/training/appointmentbooking/common/to/ClientEto.java create mode 100644 src/main/java/com/capgemini/training/appointmentbooking/common/to/SpecialistCto.java create mode 100644 src/main/java/com/capgemini/training/appointmentbooking/common/to/SpecialistEto.java create mode 100644 src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentCreationEto.java create mode 100644 src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentCto.java create mode 100644 src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentEto.java create mode 100644 src/main/java/com/capgemini/training/appointmentbooking/common/to/UserEto.java create mode 100644 src/main/java/com/capgemini/training/appointmentbooking/logic/FindAppointmentUc.java create mode 100644 src/main/java/com/capgemini/training/appointmentbooking/logic/FindTreatmentUc.java create mode 100644 src/main/java/com/capgemini/training/appointmentbooking/logic/ManageAppointmentUc.java create mode 100644 src/main/java/com/capgemini/training/appointmentbooking/logic/ManageTreatmentUc.java create mode 100644 src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImpl.java create mode 100644 src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindTreatmentUcImpl.java create mode 100644 src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImpl.java create mode 100644 src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageTreatmentUcImpl.java create mode 100644 src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/AppointmentMapper.java create mode 100644 src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/ClientMapper.java create mode 100644 src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/SpecialistMapper.java create mode 100644 src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/TreatmentMapper.java create mode 100644 src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/UserMapper.java create mode 100644 src/test/java/com/capgemini/training/appointmentbooking/logic/FindAppointmentUcTestIT.java create mode 100644 src/test/java/com/capgemini/training/appointmentbooking/logic/ManageAppointmentUcTestIT.java create mode 100644 src/test/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImplTest.java create mode 100644 src/test/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImplTest.java diff --git a/pom.xml b/pom.xml index 2cade74..73f2405 100644 --- a/pom.xml +++ b/pom.xml @@ -28,6 +28,7 @@ 21 + 1.5.5.Final @@ -55,6 +56,7 @@ org.projectlombok lombok + 1.18.30 provided @@ -75,6 +77,17 @@ jakarta 5.0.0 + + org.mapstruct + mapstruct + ${org.mapstruct.version} + + + org.mapstruct + mapstruct-processor + ${org.mapstruct.version} + provided + diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/exception/ConflictedAppointmentException.java b/src/main/java/com/capgemini/training/appointmentbooking/common/exception/ConflictedAppointmentException.java new file mode 100644 index 0000000..757abd6 --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/exception/ConflictedAppointmentException.java @@ -0,0 +1,10 @@ +package com.capgemini.training.appointmentbooking.common.exception; + + +public class ConflictedAppointmentException extends RuntimeException { + + public ConflictedAppointmentException() { + super("The appointment conflicts with another scheduled appointment."); + } + +} \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/to/AppointmentBookingEto.java b/src/main/java/com/capgemini/training/appointmentbooking/common/to/AppointmentBookingEto.java new file mode 100644 index 0000000..2ba4be8 --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/to/AppointmentBookingEto.java @@ -0,0 +1,10 @@ +package com.capgemini.training.appointmentbooking.common.to; + +import lombok.Builder; + +import java.time.Instant; + + +@Builder +public record AppointmentBookingEto(Long clientId, Long treatmentId, Long specialistId, Instant dateTime) { +} \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/to/AppointmentCto.java b/src/main/java/com/capgemini/training/appointmentbooking/common/to/AppointmentCto.java new file mode 100644 index 0000000..658249e --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/to/AppointmentCto.java @@ -0,0 +1,8 @@ +package com.capgemini.training.appointmentbooking.common.to; + +import lombok.Builder; + + +@Builder +public record AppointmentCto(AppointmentEto appointmentEto, ClientEto clientEto, TreatmentCto treatmentCto) { +} \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/to/AppointmentEto.java b/src/main/java/com/capgemini/training/appointmentbooking/common/to/AppointmentEto.java new file mode 100644 index 0000000..cb0b1b6 --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/to/AppointmentEto.java @@ -0,0 +1,11 @@ +package com.capgemini.training.appointmentbooking.common.to; + +import com.capgemini.training.appointmentbooking.common.datatype.AppointmentStatus; +import lombok.Builder; + +import java.time.Instant; + + +@Builder +public record AppointmentEto(Long id, Instant dateTime, AppointmentStatus status) { +} \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/to/ClientCto.java b/src/main/java/com/capgemini/training/appointmentbooking/common/to/ClientCto.java new file mode 100644 index 0000000..dd0f608 --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/to/ClientCto.java @@ -0,0 +1,8 @@ +package com.capgemini.training.appointmentbooking.common.to; + +import lombok.Builder; + + +@Builder +public record ClientCto(ClientEto clientEto, UserEto userEto) { +} \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/to/ClientEto.java b/src/main/java/com/capgemini/training/appointmentbooking/common/to/ClientEto.java new file mode 100644 index 0000000..949e5eb --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/to/ClientEto.java @@ -0,0 +1,8 @@ +package com.capgemini.training.appointmentbooking.common.to; + +import lombok.Builder; + + +@Builder +public record ClientEto(Long id) { +} \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/to/SpecialistCto.java b/src/main/java/com/capgemini/training/appointmentbooking/common/to/SpecialistCto.java new file mode 100644 index 0000000..7019073 --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/to/SpecialistCto.java @@ -0,0 +1,8 @@ +package com.capgemini.training.appointmentbooking.common.to; + +import lombok.Builder; + + +@Builder +public record SpecialistCto(SpecialistEto specialistEto, UserEto userEto) { +} \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/to/SpecialistEto.java b/src/main/java/com/capgemini/training/appointmentbooking/common/to/SpecialistEto.java new file mode 100644 index 0000000..6e82ad5 --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/to/SpecialistEto.java @@ -0,0 +1,9 @@ +package com.capgemini.training.appointmentbooking.common.to; + +import com.capgemini.training.appointmentbooking.common.datatype.Specialization; +import lombok.Builder; + + +@Builder +public record SpecialistEto(Long id, Specialization specialization) { +} \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentCreationEto.java b/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentCreationEto.java new file mode 100644 index 0000000..32f3229 --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentCreationEto.java @@ -0,0 +1,8 @@ +package com.capgemini.training.appointmentbooking.common.to; + +import lombok.Builder; + + +@Builder +public record TreatmentCreationEto(String name, String description, int durationMinutes, Long specialistId) { +} \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentCto.java b/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentCto.java new file mode 100644 index 0000000..999c404 --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentCto.java @@ -0,0 +1,8 @@ +package com.capgemini.training.appointmentbooking.common.to; + +import lombok.Builder; + + +@Builder +public record TreatmentCto(TreatmentEto treatmentEto, SpecialistEto specialistEto) { +} \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentEto.java b/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentEto.java new file mode 100644 index 0000000..62140df --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentEto.java @@ -0,0 +1,8 @@ +package com.capgemini.training.appointmentbooking.common.to; + +import lombok.Builder; + + +@Builder +public record TreatmentEto(Long id, String name, String description, int durationMinutes) { +} \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/to/UserEto.java b/src/main/java/com/capgemini/training/appointmentbooking/common/to/UserEto.java new file mode 100644 index 0000000..d9204ed --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/to/UserEto.java @@ -0,0 +1,8 @@ +package com.capgemini.training.appointmentbooking.common.to; + +import lombok.Builder; + + +@Builder +public record UserEto(Long id, String email, String passwordHash, String firstName, String lastName) { +} \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/FindAppointmentUc.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/FindAppointmentUc.java new file mode 100644 index 0000000..caa7715 --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/FindAppointmentUc.java @@ -0,0 +1,21 @@ +package com.capgemini.training.appointmentbooking.logic; + +import com.capgemini.training.appointmentbooking.common.to.AppointmentCto; +import com.capgemini.training.appointmentbooking.dataaccess.repository.criteria.AppointmentCriteria; + +import java.time.Instant; +import java.util.List; +import java.util.Optional; + + +public interface FindAppointmentUc { + + Optional findAppointment(Long id); + + List findByCriteria(AppointmentCriteria criteria); + + List findAll(); + + boolean hasConflictingAppointment(Long specialistId, Instant dateTime); + +} \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/FindTreatmentUc.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/FindTreatmentUc.java new file mode 100644 index 0000000..ce0e672 --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/FindTreatmentUc.java @@ -0,0 +1,17 @@ +package com.capgemini.training.appointmentbooking.logic; + +import com.capgemini.training.appointmentbooking.common.to.TreatmentCto; +import com.capgemini.training.appointmentbooking.dataaccess.repository.criteria.TreatmentCriteria; + +import java.util.List; +import java.util.Optional; + + +public interface FindTreatmentUc { + + Optional findTreatment(Long id); + + List findAllTreatments(); + + List findTreatmentsByCriteria(TreatmentCriteria criteria); +} \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/ManageAppointmentUc.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/ManageAppointmentUc.java new file mode 100644 index 0000000..48104a1 --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/ManageAppointmentUc.java @@ -0,0 +1,15 @@ +package com.capgemini.training.appointmentbooking.logic; + +import com.capgemini.training.appointmentbooking.common.datatype.AppointmentStatus; +import com.capgemini.training.appointmentbooking.common.to.AppointmentBookingEto; +import com.capgemini.training.appointmentbooking.common.to.AppointmentCto; +import com.capgemini.training.appointmentbooking.common.to.AppointmentEto; + + +public interface ManageAppointmentUc { + + AppointmentCto bookAppointment(AppointmentBookingEto appointmentBookingEto); + + AppointmentEto updateAppointmentStatus(Long appointmentId, AppointmentStatus appointmentStatus); + +} \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/ManageTreatmentUc.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/ManageTreatmentUc.java new file mode 100644 index 0000000..aed7173 --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/ManageTreatmentUc.java @@ -0,0 +1,10 @@ +package com.capgemini.training.appointmentbooking.logic; + +import com.capgemini.training.appointmentbooking.common.to.TreatmentCreationEto; +import com.capgemini.training.appointmentbooking.common.to.TreatmentCto; + +public interface ManageTreatmentUc { + + TreatmentCto createTreatment(TreatmentCreationEto treatmentCreationEto); + +} \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImpl.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImpl.java new file mode 100644 index 0000000..9c1e5d3 --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImpl.java @@ -0,0 +1,51 @@ +package com.capgemini.training.appointmentbooking.logic.impl; + +import com.capgemini.training.appointmentbooking.common.to.AppointmentCto; +import com.capgemini.training.appointmentbooking.dataaccess.entity.AppointmentEntity; +import com.capgemini.training.appointmentbooking.dataaccess.repository.AppointmentRepository; +import com.capgemini.training.appointmentbooking.dataaccess.repository.criteria.AppointmentCriteria; +import com.capgemini.training.appointmentbooking.logic.FindAppointmentUc; +import com.capgemini.training.appointmentbooking.logic.mapper.AppointmentMapper; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.Instant; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + + +@Service +@Transactional(readOnly = true) +public class FindAppointmentUcImpl implements FindAppointmentUc { + + private final AppointmentRepository appointmentRepository; + + private final AppointmentMapper appointmentMapper; + + public FindAppointmentUcImpl(AppointmentRepository appointmentRepository, AppointmentMapper appointmentMapper) { + this.appointmentRepository = appointmentRepository; + this.appointmentMapper = appointmentMapper; + } + + @Override + public Optional findAppointment(Long id) { + return appointmentRepository.findById(id).map(appointmentMapper::toCto); + } + + @Override + public List findAll() { + return appointmentRepository.findAll().stream().map(appointmentMapper::toCto).collect(Collectors.toList()); + } + + @Override + public List findByCriteria(AppointmentCriteria criteria) { + return appointmentRepository.findByCriteria(criteria).stream().map(appointmentMapper::toCto).collect(Collectors.toList()); + } + + @Override + public boolean hasConflictingAppointment(Long specialistId, Instant dateTime) { + return appointmentRepository.hasConflictingAppointmentBySpecialistIdAndDateTime(specialistId, dateTime); + } + +} \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindTreatmentUcImpl.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindTreatmentUcImpl.java new file mode 100644 index 0000000..2aaeb0d --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindTreatmentUcImpl.java @@ -0,0 +1,43 @@ +package com.capgemini.training.appointmentbooking.logic.impl; + +import com.capgemini.training.appointmentbooking.common.to.TreatmentCto; +import com.capgemini.training.appointmentbooking.dataaccess.repository.TreatmentRepository; +import com.capgemini.training.appointmentbooking.dataaccess.repository.criteria.TreatmentCriteria; +import com.capgemini.training.appointmentbooking.logic.FindTreatmentUc; +import com.capgemini.training.appointmentbooking.logic.mapper.TreatmentMapper; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + + +@Service +@Transactional(readOnly = true) +public class FindTreatmentUcImpl implements FindTreatmentUc { + + private final TreatmentRepository treatmentRepository; + + private final TreatmentMapper treatmentMapper; + + public FindTreatmentUcImpl(TreatmentRepository treatmentRepository, TreatmentMapper treatmentMapper) { + this.treatmentRepository = treatmentRepository; + this.treatmentMapper = treatmentMapper; + } + + @Override + public Optional findTreatment(Long id) { + return treatmentRepository.findById(id).map(treatmentMapper::toCto); + } + + @Override + public List findTreatmentsByCriteria(TreatmentCriteria criteria) { + return treatmentRepository.findByCriteria(criteria).stream().map(treatmentMapper::toCto).collect(Collectors.toList()); + } + + @Override + public List findAllTreatments() { + return treatmentRepository.findAll().stream().map(treatmentMapper::toCto).toList(); + } +} \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImpl.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImpl.java new file mode 100644 index 0000000..71d592f --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImpl.java @@ -0,0 +1,100 @@ +package com.capgemini.training.appointmentbooking.logic.impl; + +import com.capgemini.training.appointmentbooking.common.datatype.AppointmentStatus; +import com.capgemini.training.appointmentbooking.common.exception.ConflictedAppointmentException; +import com.capgemini.training.appointmentbooking.common.to.*; +import com.capgemini.training.appointmentbooking.dataaccess.entity.AppointmentEntity; +import com.capgemini.training.appointmentbooking.dataaccess.entity.ClientEntity; +import com.capgemini.training.appointmentbooking.dataaccess.entity.TreatmentEntity; +import com.capgemini.training.appointmentbooking.dataaccess.repository.AppointmentRepository; +import com.capgemini.training.appointmentbooking.dataaccess.repository.ClientRepository; +import com.capgemini.training.appointmentbooking.dataaccess.repository.TreatmentRepository; +import com.capgemini.training.appointmentbooking.logic.FindAppointmentUc; +import com.capgemini.training.appointmentbooking.logic.ManageAppointmentUc; +import com.capgemini.training.appointmentbooking.logic.mapper.*; +import jakarta.persistence.EntityNotFoundException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + + +@Service +@Transactional +public class ManageAppointmentUcImpl implements ManageAppointmentUc { + + private final AppointmentRepository appointmentRepository; + private final TreatmentRepository treatmentRepository; + private final ClientRepository clientRepository; + + private final FindAppointmentUc findAppointmentUc; + + private final AppointmentMapper appointmentMapper; + private final TreatmentMapper treatmentMapper; + private final ClientMapper clientMapper; + private final SpecialistMapper specialistMapper; + + public ManageAppointmentUcImpl(AppointmentRepository appointmentRepository, TreatmentRepository treatmentRepository, ClientRepository clientRepository, + FindAppointmentUc findAppointmentUc, + AppointmentMapper appointmentMapper, TreatmentMapper treatmentMapper, ClientMapper clientMapper, SpecialistMapper specialistMapper) { + this.appointmentRepository = appointmentRepository; + this.treatmentRepository = treatmentRepository; + this.clientRepository = clientRepository; + this.findAppointmentUc = findAppointmentUc; + this.appointmentMapper = appointmentMapper; + this.treatmentMapper = treatmentMapper; + this.clientMapper = clientMapper; + this.specialistMapper = specialistMapper; + } + + @Override + public AppointmentCto bookAppointment(AppointmentBookingEto appointmentBookingEto) { + boolean hasConflict = findAppointmentUc.hasConflictingAppointment(appointmentBookingEto.specialistId(), appointmentBookingEto.dateTime()); + + if (hasConflict) { + throw new ConflictedAppointmentException(); + } + + AppointmentEntity appointmentEntity = buildAppointmentEntity(appointmentBookingEto); + appointmentEntity = appointmentRepository.saveAndFlush(appointmentEntity); + + TreatmentCto treatmentCto = TreatmentCto.builder() + .treatmentEto(treatmentMapper.toEto(appointmentEntity.getTreatment())) + .specialistEto(specialistMapper.toEto(appointmentEntity.getTreatment().getSpecialist())) + .build(); + + return AppointmentCto.builder() + .appointmentEto(appointmentMapper.toEto(appointmentEntity)) + .clientEto(clientMapper.toEto(appointmentEntity.getClient())) + .treatmentCto(treatmentCto) + .build(); + } + + @Override + public AppointmentEto updateAppointmentStatus(Long appointmentId, AppointmentStatus appointmentStatus) { + AppointmentEntity appointmentEntity = findAppointmentUc.findAppointment(appointmentId) + .map(appointmentMapper::toEntity) + .orElseThrow(() -> new EntityNotFoundException("Appointment not found for ID: " + appointmentId)); + + appointmentEntity.setStatus(appointmentStatus); + appointmentEntity = appointmentRepository.saveAndFlush(appointmentEntity); + + return appointmentMapper.toEto(appointmentEntity); + } + + private AppointmentEntity buildAppointmentEntity(AppointmentBookingEto appointmentBookingEto) { + AppointmentEntity entity = new AppointmentEntity(); + + ClientEntity clientEntity = clientRepository.findById(appointmentBookingEto.clientId()) + .orElseThrow(() -> new EntityNotFoundException("Client not found")); + + TreatmentEntity treatmentEntity = treatmentRepository.findById(appointmentBookingEto.treatmentId()) + .orElseThrow(() -> new EntityNotFoundException("Treatment not found")); + + entity.setClient(clientEntity); + entity.setTreatment(treatmentEntity); + entity.setDateTime(appointmentBookingEto.dateTime()); + entity.setStatus(AppointmentStatus.SCHEDULED); + + return entity; + } + +} \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageTreatmentUcImpl.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageTreatmentUcImpl.java new file mode 100644 index 0000000..22582a0 --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageTreatmentUcImpl.java @@ -0,0 +1,51 @@ +package com.capgemini.training.appointmentbooking.logic.impl; + +import com.capgemini.training.appointmentbooking.common.to.TreatmentCreationEto; +import com.capgemini.training.appointmentbooking.common.to.TreatmentCto; +import com.capgemini.training.appointmentbooking.dataaccess.entity.SpecialistEntity; +import com.capgemini.training.appointmentbooking.dataaccess.entity.TreatmentEntity; +import com.capgemini.training.appointmentbooking.dataaccess.repository.SpecialistRepository; +import com.capgemini.training.appointmentbooking.dataaccess.repository.TreatmentRepository; +import com.capgemini.training.appointmentbooking.logic.ManageTreatmentUc; +import com.capgemini.training.appointmentbooking.logic.mapper.TreatmentMapper; +import jakarta.persistence.EntityNotFoundException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + + +@Service +@Transactional +public class ManageTreatmentUcImpl implements ManageTreatmentUc { + + private final TreatmentRepository treatmentRepository; + private final SpecialistRepository specialistRepository; + private final TreatmentMapper treatmentMapper; + + public ManageTreatmentUcImpl(TreatmentRepository treatmentRepository, SpecialistRepository specialistRepository, TreatmentMapper treatmentMapper) { + this.specialistRepository = specialistRepository; + this.treatmentRepository = treatmentRepository; + this.treatmentMapper = treatmentMapper; + } + + @Override + public TreatmentCto createTreatment(TreatmentCreationEto treatmentCreationEto) { + TreatmentEntity treatmentEntity = buildTreatmentEntity(treatmentCreationEto); + treatmentEntity = treatmentRepository.saveAndFlush(treatmentEntity); + return treatmentMapper.toCto(treatmentEntity); + } + + private TreatmentEntity buildTreatmentEntity(TreatmentCreationEto treatmentCreationEto) { + TreatmentEntity entity = new TreatmentEntity(); + + SpecialistEntity specialistEntity = specialistRepository.findById(treatmentCreationEto.specialistId()) + .orElseThrow(() -> new EntityNotFoundException("Treatment not found")); + + entity.setName(treatmentCreationEto.name()); + entity.setDescription(treatmentCreationEto.description()); + entity.setDurationMinutes(treatmentCreationEto.durationMinutes()); + entity.setSpecialist(specialistEntity); + + return entity; + } + +} \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/AppointmentMapper.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/AppointmentMapper.java new file mode 100644 index 0000000..930cd49 --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/AppointmentMapper.java @@ -0,0 +1,33 @@ +package com.capgemini.training.appointmentbooking.logic.mapper; + + +import com.capgemini.training.appointmentbooking.common.to.AppointmentCto; +import com.capgemini.training.appointmentbooking.common.to.AppointmentEto; +import com.capgemini.training.appointmentbooking.dataaccess.entity.AppointmentEntity; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + + +@Mapper(componentModel = "spring", uses = {ClientMapper.class, TreatmentMapper.class}) +public interface AppointmentMapper { + + @Mapping(target = "client", ignore = true) + @Mapping(target = "version", ignore = true) + @Mapping(target = "treatment", ignore = true) + AppointmentEntity toEntity(AppointmentEto eto); + + @Mapping(source = "appointmentEto.id", target = "id") + @Mapping(source = "appointmentEto.dateTime", target = "dateTime") + @Mapping(source = "appointmentEto.status", target = "status") + @Mapping(source = "clientEto", target = "client") + @Mapping(source = "treatmentCto", target = "treatment") + @Mapping(target = "version", ignore = true) + AppointmentEntity toEntity(AppointmentCto eto); + + AppointmentEto toEto(AppointmentEntity entity); + + @Mapping(source = "entity", target = "appointmentEto") + @Mapping(source = "entity.client", target = "clientEto") + @Mapping(source = "entity.treatment", target = "treatmentCto") + AppointmentCto toCto(AppointmentEntity entity); +} \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/ClientMapper.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/ClientMapper.java new file mode 100644 index 0000000..407371e --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/ClientMapper.java @@ -0,0 +1,20 @@ +package com.capgemini.training.appointmentbooking.logic.mapper; + + +import com.capgemini.training.appointmentbooking.common.to.ClientEto; +import com.capgemini.training.appointmentbooking.dataaccess.entity.ClientEntity; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + + +@Mapper(componentModel = "spring") +public interface ClientMapper { + + @Mapping(target = "appointments", ignore = true) + @Mapping(target = "user", ignore = true) + @Mapping(target = "version", ignore = true) + ClientEntity toEntity(ClientEto clientEto); + + ClientEto toEto(ClientEntity clientEntity); + +} \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/SpecialistMapper.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/SpecialistMapper.java new file mode 100644 index 0000000..3e6a55d --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/SpecialistMapper.java @@ -0,0 +1,19 @@ +package com.capgemini.training.appointmentbooking.logic.mapper; + + +import com.capgemini.training.appointmentbooking.common.to.SpecialistEto; +import com.capgemini.training.appointmentbooking.dataaccess.entity.SpecialistEntity; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + + +@Mapper(componentModel = "spring") +public interface SpecialistMapper { + + @Mapping(target = "version", ignore = true) + @Mapping(target = "user", ignore = true) + @Mapping(target = "treatments", ignore = true) + SpecialistEntity toEntity(SpecialistEto eto); + + SpecialistEto toEto(SpecialistEntity entity); +} \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/TreatmentMapper.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/TreatmentMapper.java new file mode 100644 index 0000000..6a5d1aa --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/TreatmentMapper.java @@ -0,0 +1,31 @@ +package com.capgemini.training.appointmentbooking.logic.mapper; + + +import com.capgemini.training.appointmentbooking.common.to.TreatmentCto; +import com.capgemini.training.appointmentbooking.common.to.TreatmentEto; +import com.capgemini.training.appointmentbooking.dataaccess.entity.TreatmentEntity; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + + +@Mapper(componentModel = "spring", uses = {SpecialistMapper.class}) +public interface TreatmentMapper { + + @Mapping(target = "specialist", ignore = true) + @Mapping(target = "version", ignore = true) + TreatmentEntity toEntity(TreatmentEto eto); + + @Mapping(source = "treatmentEto.id", target = "id") + @Mapping(source = "treatmentEto.name", target = "name") + @Mapping(source = "treatmentEto.description", target = "description") + @Mapping(source = "treatmentEto.durationMinutes", target = "durationMinutes") + @Mapping(source = "specialistEto", target = "specialist") + @Mapping(target = "version", ignore = true) + TreatmentEntity toEntity(TreatmentCto entity); + + TreatmentEto toEto(TreatmentEntity entity); + + @Mapping(source = "entity", target = "treatmentEto") + @Mapping(source = "entity.specialist", target = "specialistEto") + TreatmentCto toCto(TreatmentEntity entity); +} \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/UserMapper.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/UserMapper.java new file mode 100644 index 0000000..85548a3 --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/UserMapper.java @@ -0,0 +1,21 @@ +package com.capgemini.training.appointmentbooking.logic.mapper; + + +import com.capgemini.training.appointmentbooking.common.to.UserEto; +import com.capgemini.training.appointmentbooking.dataaccess.entity.UserEntity; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + + +@Mapper(componentModel = "spring") +public interface UserMapper { + + @Mapping(target = "firstname", source = "firstName") + @Mapping(target = "lastname", source = "lastName") + @Mapping(target = "version", ignore = true) + UserEntity toEntity(UserEto eto); + + @Mapping(target = "firstName", source = "firstname") + @Mapping(target = "lastName", source = "lastname") + UserEto toEto(UserEntity entity); +} \ No newline at end of file diff --git a/src/test/java/com/capgemini/training/appointmentbooking/logic/FindAppointmentUcTestIT.java b/src/test/java/com/capgemini/training/appointmentbooking/logic/FindAppointmentUcTestIT.java new file mode 100644 index 0000000..eb04a29 --- /dev/null +++ b/src/test/java/com/capgemini/training/appointmentbooking/logic/FindAppointmentUcTestIT.java @@ -0,0 +1,81 @@ +package com.capgemini.training.appointmentbooking.logic; + +import com.capgemini.training.appointmentbooking.common.BaseTest; +import com.capgemini.training.appointmentbooking.common.datatype.AppointmentStatus; +import com.capgemini.training.appointmentbooking.common.to.AppointmentCto; +import com.capgemini.training.appointmentbooking.dataaccess.repository.AppointmentRepository; +import com.capgemini.training.appointmentbooking.dataaccess.repository.criteria.AppointmentCriteria; +import jakarta.inject.Inject; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import java.time.Instant; +import java.util.List; +import java.util.Optional; + + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) +class FindAppointmentUcTestIT extends BaseTest { + + @Inject + private FindAppointmentUc findAppointmentUc; + + @Inject + private AppointmentRepository appointmentRepository; + + @Test + void shouldFindAppointment() { + // given + Long appointmentId = -10L; + + // when + Optional appointment = findAppointmentUc.findAppointment(appointmentId); + + // then + assertThat(appointment).isPresent(); + appointment.ifPresent(a -> { + assertThat(a.appointmentEto().id()).isEqualTo(appointmentId); + assertThat(a.appointmentEto().dateTime()).isEqualTo(toInstant("2024-03-10 12:30:00")); + assertThat(a.appointmentEto().status()).isEqualTo(AppointmentStatus.SCHEDULED); + }); + } + + @Test + void shouldFindAppointmentsByCriteria() { + // given + AppointmentCriteria criteria = AppointmentCriteria + .builder() + .treatmentName("Konsultacja dentystyczna") + .build(); + + // when + List result = findAppointmentUc.findByCriteria(criteria); + + // then + assertThat(result).hasSize(2); + } + + @Test + void shouldFindAllAppointments() { + // given + // when + List result = findAppointmentUc.findAll(); + + // then + assertThat(result).hasSize(21); + } + + @Test + void shouldFindConflictedAppointment() { + // given + Long specialistId = -1L; + Instant dateTime = toInstant("2024-03-01 09:00:00"); + + // when + boolean hasConflictingAppointment = findAppointmentUc.hasConflictingAppointment(specialistId, dateTime); + + // then + assertThat(hasConflictingAppointment).isTrue(); + } + +} \ No newline at end of file diff --git a/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageAppointmentUcTestIT.java b/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageAppointmentUcTestIT.java new file mode 100644 index 0000000..09f13b8 --- /dev/null +++ b/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageAppointmentUcTestIT.java @@ -0,0 +1,90 @@ +package com.capgemini.training.appointmentbooking.logic; + +import com.capgemini.training.appointmentbooking.common.BaseTest; +import com.capgemini.training.appointmentbooking.common.datatype.AppointmentStatus; +import com.capgemini.training.appointmentbooking.common.exception.ConflictedAppointmentException; +import com.capgemini.training.appointmentbooking.common.to.AppointmentBookingEto; +import com.capgemini.training.appointmentbooking.common.to.AppointmentCto; +import jakarta.inject.Inject; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import java.time.Instant; +import java.util.Optional; + + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) +class ManageAppointmentUcTestIT extends BaseTest { + + @Inject + private FindAppointmentUc findAppointmentUc; + + @Inject + private ManageAppointmentUc manageAppointmentUc; + + @Test + void shouldBookAppointment() { + Long clientId = -1L; + Long specialistId = -2L; + Long treatmentId = -3L; + Instant dateTime = toInstant("2024-03-03 14:00:00"); + + // given + AppointmentBookingEto appointmentBookingEto = AppointmentBookingEto + .builder() + .clientId(clientId) + .specialistId(specialistId) + .treatmentId(treatmentId) + .dateTime(dateTime) + .build(); + + // when + AppointmentCto result = manageAppointmentUc.bookAppointment(appointmentBookingEto); + + // then + Optional appointmentCto = findAppointmentUc.findAppointment(result.appointmentEto().id()); + assertThat(appointmentCto).isPresent().hasValueSatisfying(a -> { + assertThat(a.clientEto().id()).isEqualTo(clientId); + assertThat(a.treatmentCto().specialistEto().id()).isEqualTo(specialistId); + assertThat(a.treatmentCto().treatmentEto().id()).isEqualTo(treatmentId); + assertThat(a.appointmentEto().dateTime()).isEqualTo(dateTime); + assertThat(a.appointmentEto().status()).isEqualTo(AppointmentStatus.SCHEDULED); + }); + + } + + @Test + void shouldThrowAnExceptionDuringAppointmentBooking() { + Long specialistId = -3L; + Instant dateTime = toInstant("2024-03-03 14:00:00"); + + // given + AppointmentBookingEto appointmentBookingEto = AppointmentBookingEto + .builder() + .specialistId(specialistId) + .dateTime(dateTime) + .build(); + + // when & then + assertThatThrownBy(() -> manageAppointmentUc.bookAppointment(appointmentBookingEto)) + .isInstanceOf(ConflictedAppointmentException.class) + .hasMessageContaining("The appointment conflicts with another scheduled appointment."); + } + + @Test + void shouldAppointmentStatus() { + // given + Long appointmentId = -1L; + AppointmentStatus status = AppointmentStatus.COMPLETED; + + // when + manageAppointmentUc.updateAppointmentStatus(appointmentId, status); + + // then + Optional appointmentCto = findAppointmentUc.findAppointment(appointmentId); + assertThat(appointmentCto).isPresent().hasValueSatisfying(a -> { + assertThat(a.appointmentEto().status()).isEqualTo(AppointmentStatus.COMPLETED); + }); + } + +} \ No newline at end of file diff --git a/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImplTest.java b/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImplTest.java new file mode 100644 index 0000000..9470846 --- /dev/null +++ b/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImplTest.java @@ -0,0 +1,121 @@ +package com.capgemini.training.appointmentbooking.logic.impl; + +import com.capgemini.training.appointmentbooking.common.BaseTest; +import com.capgemini.training.appointmentbooking.common.datatype.AppointmentStatus; +import com.capgemini.training.appointmentbooking.common.to.AppointmentCto; +import com.capgemini.training.appointmentbooking.dataaccess.entity.AppointmentEntity; +import com.capgemini.training.appointmentbooking.dataaccess.repository.AppointmentRepository; +import com.capgemini.training.appointmentbooking.dataaccess.repository.criteria.AppointmentCriteria; +import com.capgemini.training.appointmentbooking.logic.mapper.AppointmentMapper; +import com.capgemini.training.appointmentbooking.logic.mapper.AppointmentMapperImpl; +import com.capgemini.training.appointmentbooking.logic.mapper.ClientMapper; +import com.capgemini.training.appointmentbooking.logic.mapper.TreatmentMapper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mapstruct.factory.Mappers; +import org.mockito.InjectMocks; +import org.mockito.MockitoAnnotations; +import org.mockito.Spy; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.test.util.ReflectionTestUtils; + +import java.time.Instant; +import java.util.List; +import java.util.Optional; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + + +@ExtendWith(MockitoExtension.class) +class FindAppointmentUcImplTest extends BaseTest { + + private final AppointmentRepository appointmentRepository = mock(AppointmentRepository.class); + + @InjectMocks + private FindAppointmentUcImpl findAppointmentUc; + + @Spy + private static AppointmentMapper appointmentMapper = new AppointmentMapperImpl(); + + @BeforeEach + void beforeEach() { + MockitoAnnotations.initMocks(this); + ClientMapper clientMapper = Mappers.getMapper(ClientMapper.class); + TreatmentMapper treatmentMapper = Mappers.getMapper(TreatmentMapper.class); + ReflectionTestUtils.setField(appointmentMapper, "clientMapper", clientMapper); + ReflectionTestUtils.setField(appointmentMapper, "treatmentMapper", treatmentMapper); + } + + @Test + void shouldFindAppointment() { + // given + Long appointmentId = -1L; + Instant dateTime = toInstant("2024-03-01 09:00:00"); + AppointmentStatus status = AppointmentStatus.SCHEDULED; + AppointmentEntity appointmentEntity = new AppointmentEntity(); + appointmentEntity.setId(appointmentId); + appointmentEntity.setDateTime(dateTime); + appointmentEntity.setStatus(status); + when(appointmentRepository.findById(appointmentId)).thenReturn(Optional.of(appointmentEntity)); + + // when + Optional appointment = findAppointmentUc.findAppointment(appointmentId); + + // then + assertThat(appointment).isPresent(); + appointment.ifPresent(a -> { + assertThat(a.appointmentEto().id()).isEqualTo(appointmentId); + assertThat(a.appointmentEto().dateTime()).isEqualTo(dateTime); + assertThat(a.appointmentEto().status()).isEqualTo(AppointmentStatus.SCHEDULED); + }); + } + + @Test + void shouldFindAppointmentsByCriteria() { + // given + AppointmentCriteria criteria = AppointmentCriteria.builder().treatmentName("Konsultacja dentystyczna").build(); + AppointmentEntity appointmentEntity = new AppointmentEntity(); + appointmentEntity.setStatus(AppointmentStatus.COMPLETED); + when(appointmentRepository.findByCriteria(criteria)).thenReturn(List.of(appointmentEntity, appointmentEntity, appointmentEntity)); + + // when + List result = findAppointmentUc.findByCriteria(criteria); + + // then + assertThat(result).hasSize(3); + assertThat(result).allMatch(appointment -> appointment.appointmentEto().status() == AppointmentStatus.COMPLETED); + } + + @Test + void shouldFindAllAppointments() { + // given + AppointmentEntity appointmentEntity = new AppointmentEntity(); + appointmentEntity.setStatus(AppointmentStatus.COMPLETED); + when(appointmentRepository.findAll()).thenReturn(List.of(appointmentEntity, appointmentEntity, appointmentEntity)); + + // when + List result = findAppointmentUc.findAll(); + + // then + assertThat(result).hasSize(3); + assertThat(result).allMatch(appointment -> appointment.appointmentEto().status() == AppointmentStatus.COMPLETED); + } + + @Test + void shouldFindConflictedAppointment() { + // given + Long specialistId = -1L; + Instant dateTime = toInstant("2024-03-01 09:00:00"); + when(appointmentRepository.hasConflictingAppointmentBySpecialistIdAndDateTime(any(), any())).thenReturn(true); + + // when + boolean hasConflictingAppointment = findAppointmentUc.hasConflictingAppointment(specialistId, dateTime); + + // then + assertThat(hasConflictingAppointment).isTrue(); + } + +} \ No newline at end of file diff --git a/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImplTest.java b/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImplTest.java new file mode 100644 index 0000000..dade633 --- /dev/null +++ b/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImplTest.java @@ -0,0 +1,158 @@ +package com.capgemini.training.appointmentbooking.logic.impl; + +import com.capgemini.training.appointmentbooking.common.BaseTest; +import com.capgemini.training.appointmentbooking.common.datatype.AppointmentStatus; +import com.capgemini.training.appointmentbooking.common.exception.ConflictedAppointmentException; +import com.capgemini.training.appointmentbooking.common.to.AppointmentBookingEto; +import com.capgemini.training.appointmentbooking.common.to.AppointmentCto; +import com.capgemini.training.appointmentbooking.common.to.AppointmentEto; +import com.capgemini.training.appointmentbooking.dataaccess.entity.AppointmentEntity; +import com.capgemini.training.appointmentbooking.dataaccess.entity.ClientEntity; +import com.capgemini.training.appointmentbooking.dataaccess.entity.SpecialistEntity; +import com.capgemini.training.appointmentbooking.dataaccess.entity.TreatmentEntity; +import com.capgemini.training.appointmentbooking.dataaccess.repository.AppointmentRepository; +import com.capgemini.training.appointmentbooking.dataaccess.repository.ClientRepository; +import com.capgemini.training.appointmentbooking.dataaccess.repository.TreatmentRepository; +import com.capgemini.training.appointmentbooking.logic.mapper.*; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mapstruct.factory.Mappers; +import org.mockito.InjectMocks; +import org.mockito.MockitoAnnotations; +import org.mockito.Spy; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.test.util.ReflectionTestUtils; + +import java.time.Instant; +import java.util.Optional; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + + +@ExtendWith(MockitoExtension.class) +class ManageAppointmentUcImplTest extends BaseTest { + + private final AppointmentRepository appointmentRepository = mock(AppointmentRepository.class); + + private final ClientRepository clientRepository = mock(ClientRepository.class); + + private final TreatmentRepository treatmentRepository = mock(TreatmentRepository.class); + + private final FindAppointmentUcImpl findAppointmentUc = mock(FindAppointmentUcImpl.class); + + @InjectMocks + private ManageAppointmentUcImpl manageAppointmentUc; + + @Spy + private static AppointmentMapper appointmentMapper = new AppointmentMapperImpl(); + + @Spy + private static TreatmentMapper treatmentMapper = new TreatmentMapperImpl(); + + @Spy + private static SpecialistMapper specialistMapper = new SpecialistMapperImpl(); + + @Spy + private static ClientMapper clientMapper = new ClientMapperImpl(); + + @BeforeEach + void beforeEach() { + MockitoAnnotations.initMocks(this); + ClientMapper clientMapper = Mappers.getMapper(ClientMapper.class); + TreatmentMapper treatmentMapper = Mappers.getMapper(TreatmentMapper.class); + ReflectionTestUtils.setField(appointmentMapper, "clientMapper", clientMapper); + ReflectionTestUtils.setField(appointmentMapper, "treatmentMapper", treatmentMapper); + } + + @Test + void shouldBookAppointment() { + // given + Long clientId = -1L; + Long specialistId = -2L; + Long treatmentId = -3L; + Instant dateTime = toInstant("2024-03-03 14:00:00"); + AppointmentStatus status = AppointmentStatus.SCHEDULED; + + AppointmentBookingEto appointmentBookingEto = AppointmentBookingEto + .builder() + .clientId(clientId) + .specialistId(specialistId) + .treatmentId(treatmentId) + .dateTime(dateTime) + .build(); + + AppointmentEntity appointmentEntity = buildAppointmentEntity(clientId, specialistId, treatmentId, dateTime, status); + + when(findAppointmentUc.hasConflictingAppointment(specialistId, dateTime)).thenReturn(false); + when(clientRepository.findById(appointmentBookingEto.clientId())).thenReturn(Optional.of(new ClientEntity())); + when(treatmentRepository.findById(appointmentBookingEto.treatmentId())).thenReturn(Optional.of(new TreatmentEntity())); + when(appointmentRepository.saveAndFlush(any())).thenReturn(appointmentEntity); + + // when + AppointmentCto result = manageAppointmentUc.bookAppointment(appointmentBookingEto); + + // then + assertThat(result.clientEto().id()).isEqualTo(clientId); + assertThat(result.treatmentCto().specialistEto().id()).isEqualTo(specialistId); + assertThat(result.treatmentCto().treatmentEto().id()).isEqualTo(treatmentId); + assertThat(result.appointmentEto().dateTime()).isEqualTo(dateTime); + assertThat(result.appointmentEto().status()).isEqualTo(status); + } + + @Test + void shouldThrowAnExceptionDuringAppointmentBooking() { + // given + Long specialistId = -3L; + Instant dateTime = toInstant("2024-03-03 14:00:00"); + + AppointmentBookingEto appointmentBookingEto = AppointmentBookingEto + .builder() + .specialistId(specialistId) + .dateTime(dateTime) + .build(); + + when(findAppointmentUc.hasConflictingAppointment(specialistId, dateTime)).thenReturn(true); + + // when & then + assertThatThrownBy(() -> manageAppointmentUc.bookAppointment(appointmentBookingEto)) + .isInstanceOf(ConflictedAppointmentException.class) + .hasMessageContaining("The appointment conflicts with another scheduled appointment."); + } + + private static AppointmentEntity buildAppointmentEntity(Long clientId, Long specialistId, Long treatmentId, Instant dateTime, AppointmentStatus status) { + AppointmentEntity appointmentEntity = new AppointmentEntity(); + ClientEntity clientEntity = new ClientEntity(); + clientEntity.setId(clientId); + appointmentEntity.setClient(clientEntity); + SpecialistEntity specialistEntity = new SpecialistEntity(); + specialistEntity.setId(specialistId); + TreatmentEntity treatmentEntity = new TreatmentEntity(); + treatmentEntity.setId(treatmentId); + treatmentEntity.setSpecialist(specialistEntity); + appointmentEntity.setTreatment(treatmentEntity); + appointmentEntity.setDateTime(dateTime); + appointmentEntity.setStatus(status); + return appointmentEntity; + } + + @Test + void shouldUpdateAppointmentStatus() { + // given + Long appointmentId = -1L; + AppointmentStatus status = AppointmentStatus.COMPLETED; + when(findAppointmentUc.findAppointment(appointmentId)).thenReturn(Optional.of(AppointmentCto.builder().build())); + AppointmentEntity appointmentEntity = new AppointmentEntity(); + appointmentEntity.setStatus(status); + when(appointmentRepository.saveAndFlush(any())).thenReturn(appointmentEntity); + + // when + AppointmentEto result = manageAppointmentUc.updateAppointmentStatus(appointmentId, status); + + // then + assertThat(result.status()).isEqualTo(status); + } + +} \ No newline at end of file From 3ea9d2291f9b3b8346b30dd952e9c723c7f4d212 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Machaj?= Date: Mon, 17 Mar 2025 15:15:07 +0100 Subject: [PATCH 02/12] add mappers configuration --- .../logic/config/MappingConfiguration.java | 35 +++++++++++++++++++ .../logic/mapper/AppointmentMapper.java | 2 +- .../logic/mapper/ClientMapper.java | 2 +- .../logic/mapper/SpecialistMapper.java | 2 +- .../logic/mapper/TreatmentMapper.java | 2 +- .../logic/mapper/UserMapper.java | 2 +- .../impl/ManageAppointmentUcImplTest.java | 27 +++++--------- 7 files changed, 49 insertions(+), 23 deletions(-) create mode 100644 src/main/java/com/capgemini/training/appointmentbooking/logic/config/MappingConfiguration.java diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/config/MappingConfiguration.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/config/MappingConfiguration.java new file mode 100644 index 0000000..1315f5d --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/config/MappingConfiguration.java @@ -0,0 +1,35 @@ +package com.capgemini.training.appointmentbooking.logic.config; + +import com.capgemini.training.appointmentbooking.logic.mapper.*; +import org.mapstruct.factory.Mappers; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +class MappingConfiguration { + + @Bean + AppointmentMapper getAppointmentMapper() { + return Mappers.getMapper(AppointmentMapper.class); + } + + @Bean + ClientMapper getClientMapper() { + return Mappers.getMapper(ClientMapper.class); + } + + @Bean + SpecialistMapper getSpecialistMapper() { + return Mappers.getMapper(SpecialistMapper.class); + } + + @Bean + TreatmentMapper getTreatmentMapper() { + return Mappers.getMapper(TreatmentMapper.class); + } + + @Bean + UserMapper getUserMapper() { + return Mappers.getMapper(UserMapper.class); + } +} \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/AppointmentMapper.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/AppointmentMapper.java index 930cd49..b8332ce 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/AppointmentMapper.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/AppointmentMapper.java @@ -8,7 +8,7 @@ import org.mapstruct.Mapping; -@Mapper(componentModel = "spring", uses = {ClientMapper.class, TreatmentMapper.class}) +@Mapper(uses = {ClientMapper.class, TreatmentMapper.class}) public interface AppointmentMapper { @Mapping(target = "client", ignore = true) diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/ClientMapper.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/ClientMapper.java index 407371e..cd5d010 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/ClientMapper.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/ClientMapper.java @@ -7,7 +7,7 @@ import org.mapstruct.Mapping; -@Mapper(componentModel = "spring") +@Mapper() public interface ClientMapper { @Mapping(target = "appointments", ignore = true) diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/SpecialistMapper.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/SpecialistMapper.java index 3e6a55d..bd2e2b1 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/SpecialistMapper.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/SpecialistMapper.java @@ -7,7 +7,7 @@ import org.mapstruct.Mapping; -@Mapper(componentModel = "spring") +@Mapper() public interface SpecialistMapper { @Mapping(target = "version", ignore = true) diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/TreatmentMapper.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/TreatmentMapper.java index 6a5d1aa..629dd3e 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/TreatmentMapper.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/TreatmentMapper.java @@ -8,7 +8,7 @@ import org.mapstruct.Mapping; -@Mapper(componentModel = "spring", uses = {SpecialistMapper.class}) +@Mapper(uses = {SpecialistMapper.class}) public interface TreatmentMapper { @Mapping(target = "specialist", ignore = true) diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/UserMapper.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/UserMapper.java index 85548a3..7ccfcde 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/UserMapper.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/UserMapper.java @@ -7,7 +7,7 @@ import org.mapstruct.Mapping; -@Mapper(componentModel = "spring") +@Mapper() public interface UserMapper { @Mapping(target = "firstname", source = "firstName") diff --git a/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImplTest.java b/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImplTest.java index dade633..09669ac 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImplTest.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImplTest.java @@ -14,34 +14,34 @@ import com.capgemini.training.appointmentbooking.dataaccess.repository.ClientRepository; import com.capgemini.training.appointmentbooking.dataaccess.repository.TreatmentRepository; import com.capgemini.training.appointmentbooking.logic.mapper.*; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mapstruct.factory.Mappers; import org.mockito.InjectMocks; -import org.mockito.MockitoAnnotations; +import org.mockito.Mock; import org.mockito.Spy; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.test.util.ReflectionTestUtils; import java.time.Instant; import java.util.Optional; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class ManageAppointmentUcImplTest extends BaseTest { - private final AppointmentRepository appointmentRepository = mock(AppointmentRepository.class); + @Mock + private AppointmentRepository appointmentRepository; - private final ClientRepository clientRepository = mock(ClientRepository.class); + @Mock + private ClientRepository clientRepository; - private final TreatmentRepository treatmentRepository = mock(TreatmentRepository.class); + @Mock + private TreatmentRepository treatmentRepository; - private final FindAppointmentUcImpl findAppointmentUc = mock(FindAppointmentUcImpl.class); + @Mock + private FindAppointmentUcImpl findAppointmentUc; @InjectMocks private ManageAppointmentUcImpl manageAppointmentUc; @@ -58,15 +58,6 @@ class ManageAppointmentUcImplTest extends BaseTest { @Spy private static ClientMapper clientMapper = new ClientMapperImpl(); - @BeforeEach - void beforeEach() { - MockitoAnnotations.initMocks(this); - ClientMapper clientMapper = Mappers.getMapper(ClientMapper.class); - TreatmentMapper treatmentMapper = Mappers.getMapper(TreatmentMapper.class); - ReflectionTestUtils.setField(appointmentMapper, "clientMapper", clientMapper); - ReflectionTestUtils.setField(appointmentMapper, "treatmentMapper", treatmentMapper); - } - @Test void shouldBookAppointment() { // given From 573a4b74b5c26ebefa1d97e96dfdd2842c289e49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Machaj?= Date: Mon, 17 Mar 2025 16:45:43 +0100 Subject: [PATCH 03/12] add tests, refactoring --- .../logic/FindAppointmentUc.java | 2 +- .../logic/FindTreatmentUc.java | 6 +- .../logic/config/MappingConfiguration.java | 1 + .../logic/impl/FindAppointmentUcImpl.java | 2 +- .../logic/impl/FindTreatmentUcImpl.java | 6 +- .../logic/impl/ManageAppointmentUcImpl.java | 2 +- .../logic/FindAppointmentUcTestIT.java | 4 +- .../logic/FindTreatmentUcTestIT.java | 66 +++++++++++++++++++ .../logic/ManageAppointmentUcTestIT.java | 13 ++-- .../logic/ManageTreatmentUcTestIT.java | 53 +++++++++++++++ .../logic/impl/FindAppointmentUcImplTest.java | 24 ++----- .../impl/ManageAppointmentUcImplTest.java | 2 +- 12 files changed, 144 insertions(+), 37 deletions(-) create mode 100644 src/test/java/com/capgemini/training/appointmentbooking/logic/FindTreatmentUcTestIT.java create mode 100644 src/test/java/com/capgemini/training/appointmentbooking/logic/ManageTreatmentUcTestIT.java diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/FindAppointmentUc.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/FindAppointmentUc.java index caa7715..465ccc2 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/FindAppointmentUc.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/FindAppointmentUc.java @@ -10,7 +10,7 @@ public interface FindAppointmentUc { - Optional findAppointment(Long id); + Optional findById(Long id); List findByCriteria(AppointmentCriteria criteria); diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/FindTreatmentUc.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/FindTreatmentUc.java index ce0e672..1c23a49 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/FindTreatmentUc.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/FindTreatmentUc.java @@ -9,9 +9,9 @@ public interface FindTreatmentUc { - Optional findTreatment(Long id); + Optional findById(Long id); - List findAllTreatments(); + List findAll(); - List findTreatmentsByCriteria(TreatmentCriteria criteria); + List findByCriteria(TreatmentCriteria criteria); } \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/config/MappingConfiguration.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/config/MappingConfiguration.java index 1315f5d..3f2a5e9 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/config/MappingConfiguration.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/config/MappingConfiguration.java @@ -32,4 +32,5 @@ TreatmentMapper getTreatmentMapper() { UserMapper getUserMapper() { return Mappers.getMapper(UserMapper.class); } + } \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImpl.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImpl.java index 9c1e5d3..7f2e56b 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImpl.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImpl.java @@ -29,7 +29,7 @@ public FindAppointmentUcImpl(AppointmentRepository appointmentRepository, Appoin } @Override - public Optional findAppointment(Long id) { + public Optional findById(Long id) { return appointmentRepository.findById(id).map(appointmentMapper::toCto); } diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindTreatmentUcImpl.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindTreatmentUcImpl.java index 2aaeb0d..65c29da 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindTreatmentUcImpl.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindTreatmentUcImpl.java @@ -27,17 +27,17 @@ public FindTreatmentUcImpl(TreatmentRepository treatmentRepository, TreatmentMap } @Override - public Optional findTreatment(Long id) { + public Optional findById(Long id) { return treatmentRepository.findById(id).map(treatmentMapper::toCto); } @Override - public List findTreatmentsByCriteria(TreatmentCriteria criteria) { + public List findByCriteria(TreatmentCriteria criteria) { return treatmentRepository.findByCriteria(criteria).stream().map(treatmentMapper::toCto).collect(Collectors.toList()); } @Override - public List findAllTreatments() { + public List findAll() { return treatmentRepository.findAll().stream().map(treatmentMapper::toCto).toList(); } } \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImpl.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImpl.java index 71d592f..fa79895 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImpl.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImpl.java @@ -70,7 +70,7 @@ public AppointmentCto bookAppointment(AppointmentBookingEto appointmentBookingEt @Override public AppointmentEto updateAppointmentStatus(Long appointmentId, AppointmentStatus appointmentStatus) { - AppointmentEntity appointmentEntity = findAppointmentUc.findAppointment(appointmentId) + AppointmentEntity appointmentEntity = findAppointmentUc.findById(appointmentId) .map(appointmentMapper::toEntity) .orElseThrow(() -> new EntityNotFoundException("Appointment not found for ID: " + appointmentId)); diff --git a/src/test/java/com/capgemini/training/appointmentbooking/logic/FindAppointmentUcTestIT.java b/src/test/java/com/capgemini/training/appointmentbooking/logic/FindAppointmentUcTestIT.java index eb04a29..8aab225 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/logic/FindAppointmentUcTestIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/logic/FindAppointmentUcTestIT.java @@ -24,12 +24,12 @@ class FindAppointmentUcTestIT extends BaseTest { private AppointmentRepository appointmentRepository; @Test - void shouldFindAppointment() { + void shouldFindById() { // given Long appointmentId = -10L; // when - Optional appointment = findAppointmentUc.findAppointment(appointmentId); + Optional appointment = findAppointmentUc.findById(appointmentId); // then assertThat(appointment).isPresent(); diff --git a/src/test/java/com/capgemini/training/appointmentbooking/logic/FindTreatmentUcTestIT.java b/src/test/java/com/capgemini/training/appointmentbooking/logic/FindTreatmentUcTestIT.java new file mode 100644 index 0000000..dda420a --- /dev/null +++ b/src/test/java/com/capgemini/training/appointmentbooking/logic/FindTreatmentUcTestIT.java @@ -0,0 +1,66 @@ +package com.capgemini.training.appointmentbooking.logic; + +import com.capgemini.training.appointmentbooking.common.BaseTest; +import com.capgemini.training.appointmentbooking.common.to.TreatmentCto; +import com.capgemini.training.appointmentbooking.dataaccess.repository.TreatmentRepository; +import com.capgemini.training.appointmentbooking.dataaccess.repository.criteria.TreatmentCriteria; +import jakarta.inject.Inject; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; +import java.util.Optional; + + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) +class FindTreatmentUcTestIT extends BaseTest { + + @Inject + private FindTreatmentUc findTreatmentUc; + + @Inject + private TreatmentRepository treatmentRepository; + + @Test + void shouldFindTreatment() { + // given + Long treatmentId = -1L; + + // when + Optional appointment = findTreatmentUc.findById(treatmentId); + + // then + assertThat(appointment).isPresent(); + appointment.ifPresent(a -> { + assertThat(a.treatmentEto().id()).isEqualTo(treatmentId); + assertThat(a.treatmentEto().name()).isEqualTo("Konsultacja dentystyczna"); + assertThat(a.treatmentEto().description()).isEqualTo("Konsultacja dentystyczna z diagnostyką i planem leczenia"); + assertThat(a.treatmentEto().durationMinutes()).isEqualTo(30); + }); + } + + @Test + void shouldFindAppointmentsByCriteria() { + // given + TreatmentCriteria criteria = TreatmentCriteria + .builder() + .name("Konsultacja dentystyczna") + .build(); + + // when + List result = findTreatmentUc.findByCriteria(criteria); + + // then + assertThat(result).hasSize(1); + } + + @Test + void shouldFindAllTreatments() { + // given & when + List result = findTreatmentUc.findAll(); + + // then + assertThat(result).hasSize(12); + } + +} \ No newline at end of file diff --git a/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageAppointmentUcTestIT.java b/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageAppointmentUcTestIT.java index 09f13b8..0c961a8 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageAppointmentUcTestIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageAppointmentUcTestIT.java @@ -24,12 +24,12 @@ class ManageAppointmentUcTestIT extends BaseTest { @Test void shouldBookAppointment() { + // given Long clientId = -1L; Long specialistId = -2L; Long treatmentId = -3L; Instant dateTime = toInstant("2024-03-03 14:00:00"); - // given AppointmentBookingEto appointmentBookingEto = AppointmentBookingEto .builder() .clientId(clientId) @@ -42,23 +42,24 @@ void shouldBookAppointment() { AppointmentCto result = manageAppointmentUc.bookAppointment(appointmentBookingEto); // then - Optional appointmentCto = findAppointmentUc.findAppointment(result.appointmentEto().id()); + Optional appointmentCto = findAppointmentUc.findById(result.appointmentEto().id()); assertThat(appointmentCto).isPresent().hasValueSatisfying(a -> { + assertThat(a.appointmentEto().id()).isNotNull(); + assertThat(a.appointmentEto().dateTime()).isEqualTo(dateTime); + assertThat(a.appointmentEto().status()).isEqualTo(AppointmentStatus.SCHEDULED); assertThat(a.clientEto().id()).isEqualTo(clientId); assertThat(a.treatmentCto().specialistEto().id()).isEqualTo(specialistId); assertThat(a.treatmentCto().treatmentEto().id()).isEqualTo(treatmentId); - assertThat(a.appointmentEto().dateTime()).isEqualTo(dateTime); - assertThat(a.appointmentEto().status()).isEqualTo(AppointmentStatus.SCHEDULED); }); } @Test void shouldThrowAnExceptionDuringAppointmentBooking() { + // given Long specialistId = -3L; Instant dateTime = toInstant("2024-03-03 14:00:00"); - // given AppointmentBookingEto appointmentBookingEto = AppointmentBookingEto .builder() .specialistId(specialistId) @@ -81,7 +82,7 @@ void shouldAppointmentStatus() { manageAppointmentUc.updateAppointmentStatus(appointmentId, status); // then - Optional appointmentCto = findAppointmentUc.findAppointment(appointmentId); + Optional appointmentCto = findAppointmentUc.findById(appointmentId); assertThat(appointmentCto).isPresent().hasValueSatisfying(a -> { assertThat(a.appointmentEto().status()).isEqualTo(AppointmentStatus.COMPLETED); }); diff --git a/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageTreatmentUcTestIT.java b/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageTreatmentUcTestIT.java new file mode 100644 index 0000000..754f47b --- /dev/null +++ b/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageTreatmentUcTestIT.java @@ -0,0 +1,53 @@ +package com.capgemini.training.appointmentbooking.logic; + +import com.capgemini.training.appointmentbooking.common.BaseTest; +import com.capgemini.training.appointmentbooking.common.to.TreatmentCreationEto; +import com.capgemini.training.appointmentbooking.common.to.TreatmentCto; +import jakarta.inject.Inject; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.Optional; + + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) +class ManageTreatmentUcTestIT extends BaseTest { + + @Inject + private FindTreatmentUc findTreatmentUc; + + @Inject + private ManageTreatmentUc manageTreatmentUc; + + @Test + void shouldCreateTreatment() { + // given + String name = "Wypełnianie ubytków"; + String description = "Wypełnianie ubytków próchnicowych w zębach za pomocą materiałów kompozytowych"; + int durationMinutes = 60; + Long specialistId = -1L; + + TreatmentCreationEto treatmentCreationEto = TreatmentCreationEto + .builder() + .name(name) + .description(description) + .durationMinutes(durationMinutes) + .specialistId(specialistId) + .build(); + + // when + TreatmentCto result = manageTreatmentUc.createTreatment(treatmentCreationEto); + + // then + Optional appointmentCto = findTreatmentUc.findById(result.treatmentEto().id()); + assertThat(appointmentCto).isPresent().hasValueSatisfying(a -> { + assertThat(a.treatmentEto().id()).isNotNull(); + assertThat(a.treatmentEto().name()).isEqualTo(name); + assertThat(a.treatmentEto().description()).isEqualTo(description); + assertThat(a.treatmentEto().durationMinutes()).isEqualTo(durationMinutes); + assertThat(a.specialistEto().id()).isEqualTo(specialistId); + }); + + } + +} \ No newline at end of file diff --git a/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImplTest.java b/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImplTest.java index 9470846..bec17d5 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImplTest.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImplTest.java @@ -8,31 +8,26 @@ import com.capgemini.training.appointmentbooking.dataaccess.repository.criteria.AppointmentCriteria; import com.capgemini.training.appointmentbooking.logic.mapper.AppointmentMapper; import com.capgemini.training.appointmentbooking.logic.mapper.AppointmentMapperImpl; -import com.capgemini.training.appointmentbooking.logic.mapper.ClientMapper; -import com.capgemini.training.appointmentbooking.logic.mapper.TreatmentMapper; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mapstruct.factory.Mappers; import org.mockito.InjectMocks; -import org.mockito.MockitoAnnotations; +import org.mockito.Mock; import org.mockito.Spy; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.test.util.ReflectionTestUtils; import java.time.Instant; import java.util.List; import java.util.Optional; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class FindAppointmentUcImplTest extends BaseTest { - private final AppointmentRepository appointmentRepository = mock(AppointmentRepository.class); + @Mock + private AppointmentRepository appointmentRepository; @InjectMocks private FindAppointmentUcImpl findAppointmentUc; @@ -40,17 +35,8 @@ class FindAppointmentUcImplTest extends BaseTest { @Spy private static AppointmentMapper appointmentMapper = new AppointmentMapperImpl(); - @BeforeEach - void beforeEach() { - MockitoAnnotations.initMocks(this); - ClientMapper clientMapper = Mappers.getMapper(ClientMapper.class); - TreatmentMapper treatmentMapper = Mappers.getMapper(TreatmentMapper.class); - ReflectionTestUtils.setField(appointmentMapper, "clientMapper", clientMapper); - ReflectionTestUtils.setField(appointmentMapper, "treatmentMapper", treatmentMapper); - } - @Test - void shouldFindAppointment() { + void shouldFindById() { // given Long appointmentId = -1L; Instant dateTime = toInstant("2024-03-01 09:00:00"); @@ -62,7 +48,7 @@ void shouldFindAppointment() { when(appointmentRepository.findById(appointmentId)).thenReturn(Optional.of(appointmentEntity)); // when - Optional appointment = findAppointmentUc.findAppointment(appointmentId); + Optional appointment = findAppointmentUc.findById(appointmentId); // then assertThat(appointment).isPresent(); diff --git a/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImplTest.java b/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImplTest.java index 09669ac..b282b0c 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImplTest.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImplTest.java @@ -134,7 +134,7 @@ void shouldUpdateAppointmentStatus() { // given Long appointmentId = -1L; AppointmentStatus status = AppointmentStatus.COMPLETED; - when(findAppointmentUc.findAppointment(appointmentId)).thenReturn(Optional.of(AppointmentCto.builder().build())); + when(findAppointmentUc.findById(appointmentId)).thenReturn(Optional.of(AppointmentCto.builder().build())); AppointmentEntity appointmentEntity = new AppointmentEntity(); appointmentEntity.setStatus(status); when(appointmentRepository.saveAndFlush(any())).thenReturn(appointmentEntity); From 601bced1671a251aac0dc49ed8e19b3f9d2f6eb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Machaj?= Date: Mon, 17 Mar 2025 17:31:02 +0100 Subject: [PATCH 04/12] add tests isolation --- .../dataaccess/repository/AppointmentRepositoryTestIT.java | 3 +++ .../dataaccess/repository/ClientRepositoryTestIT.java | 3 +++ .../dataaccess/repository/SpecialistRepositoryTestIT.java | 3 +++ .../dataaccess/repository/TreatmentRepositoryTestIT.java | 3 +++ .../dataaccess/repository/UserRepositoryTestIT.java | 3 +++ .../appointmentbooking/logic/FindAppointmentUcTestIT.java | 5 +++-- .../appointmentbooking/logic/FindTreatmentUcTestIT.java | 2 ++ .../appointmentbooking/logic/ManageAppointmentUcTestIT.java | 2 ++ .../appointmentbooking/logic/ManageTreatmentUcTestIT.java | 2 ++ 9 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/AppointmentRepositoryTestIT.java b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/AppointmentRepositoryTestIT.java index e9d2e3a..2394673 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/AppointmentRepositoryTestIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/AppointmentRepositoryTestIT.java @@ -10,11 +10,14 @@ import jakarta.inject.Inject; import org.junit.jupiter.api.Test; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.transaction.annotation.Transactional; import java.time.Instant; import java.util.List; import java.util.Optional; + +@Transactional @DataJpaTest public class AppointmentRepositoryTestIT extends BaseTest { diff --git a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/ClientRepositoryTestIT.java b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/ClientRepositoryTestIT.java index 22e1777..6db7dcc 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/ClientRepositoryTestIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/ClientRepositoryTestIT.java @@ -5,9 +5,12 @@ import jakarta.inject.Inject; import org.junit.jupiter.api.Test; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.transaction.annotation.Transactional; import java.util.List; + +@Transactional @DataJpaTest public class ClientRepositoryTestIT extends BaseTest { diff --git a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/SpecialistRepositoryTestIT.java b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/SpecialistRepositoryTestIT.java index b5aec30..0aadcef 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/SpecialistRepositoryTestIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/SpecialistRepositoryTestIT.java @@ -6,9 +6,12 @@ import jakarta.inject.Inject; import org.junit.jupiter.api.Test; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.transaction.annotation.Transactional; import java.util.List; + +@Transactional @DataJpaTest public class SpecialistRepositoryTestIT extends BaseTest { diff --git a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/TreatmentRepositoryTestIT.java b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/TreatmentRepositoryTestIT.java index fc53725..86933ff 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/TreatmentRepositoryTestIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/TreatmentRepositoryTestIT.java @@ -8,10 +8,13 @@ import jakarta.inject.Inject; import org.junit.jupiter.api.Test; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Optional; + +@Transactional @DataJpaTest public class TreatmentRepositoryTestIT extends BaseTest { diff --git a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/UserRepositoryTestIT.java b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/UserRepositoryTestIT.java index 58483aa..53f444a 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/UserRepositoryTestIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/UserRepositoryTestIT.java @@ -6,9 +6,12 @@ import jakarta.inject.Inject; import org.junit.jupiter.api.Test; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.transaction.annotation.Transactional; import java.util.List; + +@Transactional @DataJpaTest public class UserRepositoryTestIT extends BaseTest { diff --git a/src/test/java/com/capgemini/training/appointmentbooking/logic/FindAppointmentUcTestIT.java b/src/test/java/com/capgemini/training/appointmentbooking/logic/FindAppointmentUcTestIT.java index 8aab225..d0926d1 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/logic/FindAppointmentUcTestIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/logic/FindAppointmentUcTestIT.java @@ -8,12 +8,13 @@ import jakarta.inject.Inject; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; import java.time.Instant; import java.util.List; import java.util.Optional; - +@Transactional @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) class FindAppointmentUcTestIT extends BaseTest { @@ -62,7 +63,7 @@ void shouldFindAllAppointments() { List result = findAppointmentUc.findAll(); // then - assertThat(result).hasSize(21); + assertThat(result).hasSize(20); } @Test diff --git a/src/test/java/com/capgemini/training/appointmentbooking/logic/FindTreatmentUcTestIT.java b/src/test/java/com/capgemini/training/appointmentbooking/logic/FindTreatmentUcTestIT.java index dda420a..c809023 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/logic/FindTreatmentUcTestIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/logic/FindTreatmentUcTestIT.java @@ -7,11 +7,13 @@ import jakarta.inject.Inject; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Optional; +@Transactional @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) class FindTreatmentUcTestIT extends BaseTest { diff --git a/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageAppointmentUcTestIT.java b/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageAppointmentUcTestIT.java index 0c961a8..1382e2b 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageAppointmentUcTestIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageAppointmentUcTestIT.java @@ -8,11 +8,13 @@ import jakarta.inject.Inject; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; import java.time.Instant; import java.util.Optional; +@Transactional @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) class ManageAppointmentUcTestIT extends BaseTest { diff --git a/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageTreatmentUcTestIT.java b/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageTreatmentUcTestIT.java index 754f47b..40f46cf 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageTreatmentUcTestIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageTreatmentUcTestIT.java @@ -6,10 +6,12 @@ import jakarta.inject.Inject; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; import java.util.Optional; +@Transactional @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) class ManageTreatmentUcTestIT extends BaseTest { From 068f5ef46ac518c1b3e42487664ab9ed413a636a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Machaj?= Date: Mon, 17 Mar 2025 20:47:25 +0100 Subject: [PATCH 05/12] refactoring --- .../dataaccess/repository/SpecialistRepository.java | 1 - .../training/appointmentbooking/logic/FindTreatmentUc.java | 1 + .../appointmentbooking/logic/impl/FindTreatmentUcImpl.java | 1 + .../appointmentbooking/logic/mapper/AppointmentMapper.java | 1 + .../appointmentbooking/logic/mapper/SpecialistMapper.java | 1 + .../appointmentbooking/logic/mapper/TreatmentMapper.java | 1 + .../training/appointmentbooking/logic/mapper/UserMapper.java | 1 + .../dataaccess/repository/AppointmentRepositoryTestIT.java | 1 + .../dataaccess/repository/ClientRepositoryTestIT.java | 1 + .../dataaccess/repository/SpecialistRepositoryTestIT.java | 1 + .../dataaccess/repository/TreatmentRepositoryTestIT.java | 1 + .../dataaccess/repository/UserRepositoryTestIT.java | 1 + .../appointmentbooking/logic/ManageTreatmentUcTestIT.java | 1 - 13 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/repository/SpecialistRepository.java b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/repository/SpecialistRepository.java index 86925ef..b5473e4 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/repository/SpecialistRepository.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/repository/SpecialistRepository.java @@ -27,7 +27,6 @@ default List findSpecialistByName(String firstName, String las .where(user.firstname.eq(firstName) .and(user.lastname.eq(lastName))) .fetch(); - } } diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/FindTreatmentUc.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/FindTreatmentUc.java index 1c23a49..22b1834 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/FindTreatmentUc.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/FindTreatmentUc.java @@ -14,4 +14,5 @@ public interface FindTreatmentUc { List findAll(); List findByCriteria(TreatmentCriteria criteria); + } \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindTreatmentUcImpl.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindTreatmentUcImpl.java index 65c29da..7b3eeaf 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindTreatmentUcImpl.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindTreatmentUcImpl.java @@ -40,4 +40,5 @@ public List findByCriteria(TreatmentCriteria criteria) { public List findAll() { return treatmentRepository.findAll().stream().map(treatmentMapper::toCto).toList(); } + } \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/AppointmentMapper.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/AppointmentMapper.java index b8332ce..3715ba4 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/AppointmentMapper.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/AppointmentMapper.java @@ -30,4 +30,5 @@ public interface AppointmentMapper { @Mapping(source = "entity.client", target = "clientEto") @Mapping(source = "entity.treatment", target = "treatmentCto") AppointmentCto toCto(AppointmentEntity entity); + } \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/SpecialistMapper.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/SpecialistMapper.java index bd2e2b1..4520053 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/SpecialistMapper.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/SpecialistMapper.java @@ -16,4 +16,5 @@ public interface SpecialistMapper { SpecialistEntity toEntity(SpecialistEto eto); SpecialistEto toEto(SpecialistEntity entity); + } \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/TreatmentMapper.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/TreatmentMapper.java index 629dd3e..2788f88 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/TreatmentMapper.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/TreatmentMapper.java @@ -28,4 +28,5 @@ public interface TreatmentMapper { @Mapping(source = "entity", target = "treatmentEto") @Mapping(source = "entity.specialist", target = "specialistEto") TreatmentCto toCto(TreatmentEntity entity); + } \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/UserMapper.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/UserMapper.java index 7ccfcde..362cb03 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/UserMapper.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/UserMapper.java @@ -18,4 +18,5 @@ public interface UserMapper { @Mapping(target = "firstName", source = "firstname") @Mapping(target = "lastName", source = "lastname") UserEto toEto(UserEntity entity); + } \ No newline at end of file diff --git a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/AppointmentRepositoryTestIT.java b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/AppointmentRepositoryTestIT.java index 2394673..d512862 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/AppointmentRepositoryTestIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/AppointmentRepositoryTestIT.java @@ -196,4 +196,5 @@ void shouldFindConflictedAppointment() { // then assertThat(conflict).isTrue(); } + } diff --git a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/ClientRepositoryTestIT.java b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/ClientRepositoryTestIT.java index 6db7dcc..607e6ea 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/ClientRepositoryTestIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/ClientRepositoryTestIT.java @@ -35,4 +35,5 @@ void shouldFindClientsByName() { assertThat(client.getUser().getLastname()).isEqualTo(lastName).as("Expected client to have the specified last name"); }); } + } diff --git a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/SpecialistRepositoryTestIT.java b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/SpecialistRepositoryTestIT.java index 0aadcef..09db21a 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/SpecialistRepositoryTestIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/SpecialistRepositoryTestIT.java @@ -51,4 +51,5 @@ void shouldFindSpecialistsByName() { assertThat(specialist.getUser().getLastname()).isEqualTo(lastName).as("Expected specialist to have the specified last name"); }); } + } diff --git a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/TreatmentRepositoryTestIT.java b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/TreatmentRepositoryTestIT.java index 86933ff..2c0d7cf 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/TreatmentRepositoryTestIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/TreatmentRepositoryTestIT.java @@ -168,4 +168,5 @@ void shouldSaveTreatment() { assertThat(savedSpecialist.getTreatments()).isNotNull(); }); } + } diff --git a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/UserRepositoryTestIT.java b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/UserRepositoryTestIT.java index 53f444a..b8e9c6b 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/UserRepositoryTestIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/UserRepositoryTestIT.java @@ -43,4 +43,5 @@ void shouldFindUsersByCriteria() { assertThat(user.getLastname()).isEqualTo(lastName).as("Expected user to have the specified last name"); }); } + } diff --git a/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageTreatmentUcTestIT.java b/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageTreatmentUcTestIT.java index 40f46cf..a9e925a 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageTreatmentUcTestIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageTreatmentUcTestIT.java @@ -49,7 +49,6 @@ void shouldCreateTreatment() { assertThat(a.treatmentEto().durationMinutes()).isEqualTo(durationMinutes); assertThat(a.specialistEto().id()).isEqualTo(specialistId); }); - } } \ No newline at end of file From 67c7902861703193b8097e2100d805c4aac5a919 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Machaj?= Date: Mon, 17 Mar 2025 21:06:39 +0100 Subject: [PATCH 06/12] refactoring --- .../logic/impl/ManageAppointmentUcImpl.java | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImpl.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImpl.java index fa79895..0dd76bc 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImpl.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImpl.java @@ -56,16 +56,7 @@ public AppointmentCto bookAppointment(AppointmentBookingEto appointmentBookingEt AppointmentEntity appointmentEntity = buildAppointmentEntity(appointmentBookingEto); appointmentEntity = appointmentRepository.saveAndFlush(appointmentEntity); - TreatmentCto treatmentCto = TreatmentCto.builder() - .treatmentEto(treatmentMapper.toEto(appointmentEntity.getTreatment())) - .specialistEto(specialistMapper.toEto(appointmentEntity.getTreatment().getSpecialist())) - .build(); - - return AppointmentCto.builder() - .appointmentEto(appointmentMapper.toEto(appointmentEntity)) - .clientEto(clientMapper.toEto(appointmentEntity.getClient())) - .treatmentCto(treatmentCto) - .build(); + return appointmentMapper.toCto(appointmentEntity); } @Override From 6a9830c3bf213d4b6190a1628041904aeeac7926 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Machaj?= Date: Mon, 17 Mar 2025 21:10:02 +0100 Subject: [PATCH 07/12] refactoring --- .../logic/impl/ManageAppointmentUcImpl.java | 27 +++++++++---------- .../logic/impl/ManageTreatmentUcImpl.java | 4 ++- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImpl.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImpl.java index 0dd76bc..06a828e 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImpl.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImpl.java @@ -2,7 +2,9 @@ import com.capgemini.training.appointmentbooking.common.datatype.AppointmentStatus; import com.capgemini.training.appointmentbooking.common.exception.ConflictedAppointmentException; -import com.capgemini.training.appointmentbooking.common.to.*; +import com.capgemini.training.appointmentbooking.common.to.AppointmentBookingEto; +import com.capgemini.training.appointmentbooking.common.to.AppointmentCto; +import com.capgemini.training.appointmentbooking.common.to.AppointmentEto; import com.capgemini.training.appointmentbooking.dataaccess.entity.AppointmentEntity; import com.capgemini.training.appointmentbooking.dataaccess.entity.ClientEntity; import com.capgemini.training.appointmentbooking.dataaccess.entity.TreatmentEntity; @@ -11,7 +13,7 @@ import com.capgemini.training.appointmentbooking.dataaccess.repository.TreatmentRepository; import com.capgemini.training.appointmentbooking.logic.FindAppointmentUc; import com.capgemini.training.appointmentbooking.logic.ManageAppointmentUc; -import com.capgemini.training.appointmentbooking.logic.mapper.*; +import com.capgemini.training.appointmentbooking.logic.mapper.AppointmentMapper; import jakarta.persistence.EntityNotFoundException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -21,28 +23,23 @@ @Transactional public class ManageAppointmentUcImpl implements ManageAppointmentUc { + private final FindAppointmentUc findAppointmentUc; + private final AppointmentRepository appointmentRepository; - private final TreatmentRepository treatmentRepository; + private final ClientRepository clientRepository; - private final FindAppointmentUc findAppointmentUc; + private final TreatmentRepository treatmentRepository; private final AppointmentMapper appointmentMapper; - private final TreatmentMapper treatmentMapper; - private final ClientMapper clientMapper; - private final SpecialistMapper specialistMapper; - public ManageAppointmentUcImpl(AppointmentRepository appointmentRepository, TreatmentRepository treatmentRepository, ClientRepository clientRepository, - FindAppointmentUc findAppointmentUc, - AppointmentMapper appointmentMapper, TreatmentMapper treatmentMapper, ClientMapper clientMapper, SpecialistMapper specialistMapper) { + public ManageAppointmentUcImpl(FindAppointmentUc findAppointmentUc, AppointmentRepository appointmentRepository, ClientRepository clientRepository, + TreatmentRepository treatmentRepository, AppointmentMapper appointmentMapper) { + this.findAppointmentUc = findAppointmentUc; this.appointmentRepository = appointmentRepository; - this.treatmentRepository = treatmentRepository; this.clientRepository = clientRepository; - this.findAppointmentUc = findAppointmentUc; + this.treatmentRepository = treatmentRepository; this.appointmentMapper = appointmentMapper; - this.treatmentMapper = treatmentMapper; - this.clientMapper = clientMapper; - this.specialistMapper = specialistMapper; } @Override diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageTreatmentUcImpl.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageTreatmentUcImpl.java index 22582a0..b47da80 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageTreatmentUcImpl.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageTreatmentUcImpl.java @@ -18,12 +18,14 @@ public class ManageTreatmentUcImpl implements ManageTreatmentUc { private final TreatmentRepository treatmentRepository; + private final SpecialistRepository specialistRepository; + private final TreatmentMapper treatmentMapper; public ManageTreatmentUcImpl(TreatmentRepository treatmentRepository, SpecialistRepository specialistRepository, TreatmentMapper treatmentMapper) { - this.specialistRepository = specialistRepository; this.treatmentRepository = treatmentRepository; + this.specialistRepository = specialistRepository; this.treatmentMapper = treatmentMapper; } From 9ee1725f7d9be2d140df5be1421dbd024ca1d6ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Machaj?= Date: Mon, 17 Mar 2025 22:00:24 +0100 Subject: [PATCH 08/12] add constraint validation --- pom.xml | 4 +++ .../common/to/AppointmentBookingEto.java | 4 ++- .../common/to/AppointmentCto.java | 4 ++- .../common/to/AppointmentEto.java | 3 ++- .../common/to/ClientCto.java | 3 ++- .../common/to/ClientEto.java | 3 ++- .../common/to/SpecialistCto.java | 3 ++- .../common/to/SpecialistEto.java | 4 ++- .../common/to/TreatmentCreationEto.java | 6 ++++- .../common/to/TreatmentCto.java | 3 ++- .../common/to/TreatmentEto.java | 5 +++- .../appointmentbooking/common/to/UserEto.java | 8 +++++- .../logic/FindAppointmentUc.java | 5 ++-- .../logic/FindTreatmentUc.java | 3 ++- .../logic/ManageAppointmentUc.java | 6 +++-- .../logic/ManageTreatmentUc.java | 3 ++- .../logic/impl/FindAppointmentUcImpl.java | 8 +++--- .../logic/impl/FindTreatmentUcImpl.java | 5 +++- .../logic/impl/ManageAppointmentUcImpl.java | 10 +++++--- .../logic/impl/ManageTreatmentUcImpl.java | 7 ++++-- .../logic/ManageAppointmentUcTestIT.java | 25 +++++++++++++++++++ 21 files changed, 96 insertions(+), 26 deletions(-) diff --git a/pom.xml b/pom.xml index 73f2405..261a7eb 100644 --- a/pom.xml +++ b/pom.xml @@ -88,6 +88,10 @@ ${org.mapstruct.version} provided + + org.springframework.boot + spring-boot-starter-validation + diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/to/AppointmentBookingEto.java b/src/main/java/com/capgemini/training/appointmentbooking/common/to/AppointmentBookingEto.java index 2ba4be8..d9b14e4 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/common/to/AppointmentBookingEto.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/to/AppointmentBookingEto.java @@ -1,10 +1,12 @@ package com.capgemini.training.appointmentbooking.common.to; +import jakarta.validation.constraints.NotNull; import lombok.Builder; import java.time.Instant; @Builder -public record AppointmentBookingEto(Long clientId, Long treatmentId, Long specialistId, Instant dateTime) { +public record AppointmentBookingEto(@NotNull Long clientId, @NotNull Long treatmentId, @NotNull Long specialistId, + @NotNull Instant dateTime) { } \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/to/AppointmentCto.java b/src/main/java/com/capgemini/training/appointmentbooking/common/to/AppointmentCto.java index 658249e..3559574 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/common/to/AppointmentCto.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/to/AppointmentCto.java @@ -1,8 +1,10 @@ package com.capgemini.training.appointmentbooking.common.to; +import jakarta.validation.Valid; import lombok.Builder; @Builder -public record AppointmentCto(AppointmentEto appointmentEto, ClientEto clientEto, TreatmentCto treatmentCto) { +public record AppointmentCto(@Valid AppointmentEto appointmentEto, @Valid ClientEto clientEto, + @Valid TreatmentCto treatmentCto) { } \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/to/AppointmentEto.java b/src/main/java/com/capgemini/training/appointmentbooking/common/to/AppointmentEto.java index cb0b1b6..a5a3262 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/common/to/AppointmentEto.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/to/AppointmentEto.java @@ -1,11 +1,12 @@ package com.capgemini.training.appointmentbooking.common.to; import com.capgemini.training.appointmentbooking.common.datatype.AppointmentStatus; +import jakarta.validation.constraints.NotNull; import lombok.Builder; import java.time.Instant; @Builder -public record AppointmentEto(Long id, Instant dateTime, AppointmentStatus status) { +public record AppointmentEto(@NotNull Long id, @NotNull Instant dateTime, @NotNull AppointmentStatus status) { } \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/to/ClientCto.java b/src/main/java/com/capgemini/training/appointmentbooking/common/to/ClientCto.java index dd0f608..e9a1d6f 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/common/to/ClientCto.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/to/ClientCto.java @@ -1,8 +1,9 @@ package com.capgemini.training.appointmentbooking.common.to; +import jakarta.validation.Valid; import lombok.Builder; @Builder -public record ClientCto(ClientEto clientEto, UserEto userEto) { +public record ClientCto(@Valid ClientEto clientEto, @Valid UserEto userEto) { } \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/to/ClientEto.java b/src/main/java/com/capgemini/training/appointmentbooking/common/to/ClientEto.java index 949e5eb..293b2b5 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/common/to/ClientEto.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/to/ClientEto.java @@ -1,8 +1,9 @@ package com.capgemini.training.appointmentbooking.common.to; +import jakarta.validation.constraints.NotNull; import lombok.Builder; @Builder -public record ClientEto(Long id) { +public record ClientEto(@NotNull Long id) { } \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/to/SpecialistCto.java b/src/main/java/com/capgemini/training/appointmentbooking/common/to/SpecialistCto.java index 7019073..a6e63bd 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/common/to/SpecialistCto.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/to/SpecialistCto.java @@ -1,8 +1,9 @@ package com.capgemini.training.appointmentbooking.common.to; +import jakarta.validation.Valid; import lombok.Builder; @Builder -public record SpecialistCto(SpecialistEto specialistEto, UserEto userEto) { +public record SpecialistCto(@Valid SpecialistEto specialistEto, @Valid UserEto userEto) { } \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/to/SpecialistEto.java b/src/main/java/com/capgemini/training/appointmentbooking/common/to/SpecialistEto.java index 6e82ad5..d6008e2 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/common/to/SpecialistEto.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/to/SpecialistEto.java @@ -1,9 +1,11 @@ package com.capgemini.training.appointmentbooking.common.to; import com.capgemini.training.appointmentbooking.common.datatype.Specialization; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; import lombok.Builder; @Builder -public record SpecialistEto(Long id, Specialization specialization) { +public record SpecialistEto(@NotNull Long id, @Valid Specialization specialization) { } \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentCreationEto.java b/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentCreationEto.java index 32f3229..6300729 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentCreationEto.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentCreationEto.java @@ -1,8 +1,12 @@ package com.capgemini.training.appointmentbooking.common.to; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import lombok.Builder; @Builder -public record TreatmentCreationEto(String name, String description, int durationMinutes, Long specialistId) { +public record TreatmentCreationEto(@NotNull @Size(min = 5, max = 20) String name, + @NotNull @Size(min = 5, max = 80) String description, int durationMinutes, + @NotNull Long specialistId) { } \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentCto.java b/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentCto.java index 999c404..6e9fc5d 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentCto.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentCto.java @@ -1,8 +1,9 @@ package com.capgemini.training.appointmentbooking.common.to; +import jakarta.validation.Valid; import lombok.Builder; @Builder -public record TreatmentCto(TreatmentEto treatmentEto, SpecialistEto specialistEto) { +public record TreatmentCto(@Valid TreatmentEto treatmentEto, @Valid SpecialistEto specialistEto) { } \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentEto.java b/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentEto.java index 62140df..0d5df76 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentEto.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentEto.java @@ -1,8 +1,11 @@ package com.capgemini.training.appointmentbooking.common.to; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import lombok.Builder; @Builder -public record TreatmentEto(Long id, String name, String description, int durationMinutes) { +public record TreatmentEto(Long id, @NotNull @Size(min = 5, max = 80) String name, + @NotNull @Size(min = 5, max = 80) String description, int durationMinutes) { } \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/to/UserEto.java b/src/main/java/com/capgemini/training/appointmentbooking/common/to/UserEto.java index d9204ed..4d4ba6c 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/common/to/UserEto.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/to/UserEto.java @@ -1,8 +1,14 @@ package com.capgemini.training.appointmentbooking.common.to; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import lombok.Builder; @Builder -public record UserEto(Long id, String email, String passwordHash, String firstName, String lastName) { +public record UserEto(Long id, @NotEmpty @Email String email, String passwordHash, + @NotNull @Size(min = 3, max = 20) String firstName, + @NotNull @Size(min = 3, max = 20) String lastName) { } \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/FindAppointmentUc.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/FindAppointmentUc.java index 465ccc2..71612bf 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/FindAppointmentUc.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/FindAppointmentUc.java @@ -2,6 +2,7 @@ import com.capgemini.training.appointmentbooking.common.to.AppointmentCto; import com.capgemini.training.appointmentbooking.dataaccess.repository.criteria.AppointmentCriteria; +import jakarta.validation.constraints.NotNull; import java.time.Instant; import java.util.List; @@ -10,12 +11,12 @@ public interface FindAppointmentUc { - Optional findById(Long id); + Optional findById(@NotNull Long id); List findByCriteria(AppointmentCriteria criteria); List findAll(); - boolean hasConflictingAppointment(Long specialistId, Instant dateTime); + boolean hasConflictingAppointment(@NotNull Long specialistId, @NotNull Instant dateTime); } \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/FindTreatmentUc.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/FindTreatmentUc.java index 22b1834..04a1136 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/FindTreatmentUc.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/FindTreatmentUc.java @@ -2,6 +2,7 @@ import com.capgemini.training.appointmentbooking.common.to.TreatmentCto; import com.capgemini.training.appointmentbooking.dataaccess.repository.criteria.TreatmentCriteria; +import jakarta.validation.constraints.NotNull; import java.util.List; import java.util.Optional; @@ -9,7 +10,7 @@ public interface FindTreatmentUc { - Optional findById(Long id); + Optional findById(@NotNull Long id); List findAll(); diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/ManageAppointmentUc.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/ManageAppointmentUc.java index 48104a1..3a0a304 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/ManageAppointmentUc.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/ManageAppointmentUc.java @@ -4,12 +4,14 @@ import com.capgemini.training.appointmentbooking.common.to.AppointmentBookingEto; import com.capgemini.training.appointmentbooking.common.to.AppointmentCto; import com.capgemini.training.appointmentbooking.common.to.AppointmentEto; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; public interface ManageAppointmentUc { - AppointmentCto bookAppointment(AppointmentBookingEto appointmentBookingEto); + AppointmentCto bookAppointment(@Valid AppointmentBookingEto appointmentBookingEto); - AppointmentEto updateAppointmentStatus(Long appointmentId, AppointmentStatus appointmentStatus); + AppointmentEto updateAppointmentStatus(@NotNull Long appointmentId, @NotNull AppointmentStatus appointmentStatus); } \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/ManageTreatmentUc.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/ManageTreatmentUc.java index aed7173..b975727 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/ManageTreatmentUc.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/ManageTreatmentUc.java @@ -2,9 +2,10 @@ import com.capgemini.training.appointmentbooking.common.to.TreatmentCreationEto; import com.capgemini.training.appointmentbooking.common.to.TreatmentCto; +import jakarta.validation.Valid; public interface ManageTreatmentUc { - TreatmentCto createTreatment(TreatmentCreationEto treatmentCreationEto); + TreatmentCto createTreatment(@Valid TreatmentCreationEto treatmentCreationEto); } \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImpl.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImpl.java index 7f2e56b..d919fe3 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImpl.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImpl.java @@ -1,13 +1,14 @@ package com.capgemini.training.appointmentbooking.logic.impl; import com.capgemini.training.appointmentbooking.common.to.AppointmentCto; -import com.capgemini.training.appointmentbooking.dataaccess.entity.AppointmentEntity; import com.capgemini.training.appointmentbooking.dataaccess.repository.AppointmentRepository; import com.capgemini.training.appointmentbooking.dataaccess.repository.criteria.AppointmentCriteria; import com.capgemini.training.appointmentbooking.logic.FindAppointmentUc; import com.capgemini.training.appointmentbooking.logic.mapper.AppointmentMapper; +import jakarta.validation.constraints.NotNull; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; import java.time.Instant; import java.util.List; @@ -17,6 +18,7 @@ @Service @Transactional(readOnly = true) +@Validated public class FindAppointmentUcImpl implements FindAppointmentUc { private final AppointmentRepository appointmentRepository; @@ -29,7 +31,7 @@ public FindAppointmentUcImpl(AppointmentRepository appointmentRepository, Appoin } @Override - public Optional findById(Long id) { + public Optional findById(@NotNull Long id) { return appointmentRepository.findById(id).map(appointmentMapper::toCto); } @@ -44,7 +46,7 @@ public List findByCriteria(AppointmentCriteria criteria) { } @Override - public boolean hasConflictingAppointment(Long specialistId, Instant dateTime) { + public boolean hasConflictingAppointment(@NotNull Long specialistId, @NotNull Instant dateTime) { return appointmentRepository.hasConflictingAppointmentBySpecialistIdAndDateTime(specialistId, dateTime); } diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindTreatmentUcImpl.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindTreatmentUcImpl.java index 7b3eeaf..09cbf8d 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindTreatmentUcImpl.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindTreatmentUcImpl.java @@ -5,8 +5,10 @@ import com.capgemini.training.appointmentbooking.dataaccess.repository.criteria.TreatmentCriteria; import com.capgemini.training.appointmentbooking.logic.FindTreatmentUc; import com.capgemini.training.appointmentbooking.logic.mapper.TreatmentMapper; +import jakarta.validation.constraints.NotNull; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; import java.util.List; import java.util.Optional; @@ -15,6 +17,7 @@ @Service @Transactional(readOnly = true) +@Validated public class FindTreatmentUcImpl implements FindTreatmentUc { private final TreatmentRepository treatmentRepository; @@ -27,7 +30,7 @@ public FindTreatmentUcImpl(TreatmentRepository treatmentRepository, TreatmentMap } @Override - public Optional findById(Long id) { + public Optional findById(@NotNull Long id) { return treatmentRepository.findById(id).map(treatmentMapper::toCto); } diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImpl.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImpl.java index 06a828e..1bae6a3 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImpl.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImpl.java @@ -15,12 +15,16 @@ import com.capgemini.training.appointmentbooking.logic.ManageAppointmentUc; import com.capgemini.training.appointmentbooking.logic.mapper.AppointmentMapper; import jakarta.persistence.EntityNotFoundException; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; @Service @Transactional +@Validated public class ManageAppointmentUcImpl implements ManageAppointmentUc { private final FindAppointmentUc findAppointmentUc; @@ -43,7 +47,7 @@ public ManageAppointmentUcImpl(FindAppointmentUc findAppointmentUc, AppointmentR } @Override - public AppointmentCto bookAppointment(AppointmentBookingEto appointmentBookingEto) { + public AppointmentCto bookAppointment(@Valid AppointmentBookingEto appointmentBookingEto) { boolean hasConflict = findAppointmentUc.hasConflictingAppointment(appointmentBookingEto.specialistId(), appointmentBookingEto.dateTime()); if (hasConflict) { @@ -57,7 +61,7 @@ public AppointmentCto bookAppointment(AppointmentBookingEto appointmentBookingEt } @Override - public AppointmentEto updateAppointmentStatus(Long appointmentId, AppointmentStatus appointmentStatus) { + public AppointmentEto updateAppointmentStatus(@NotNull Long appointmentId, @NotNull AppointmentStatus appointmentStatus) { AppointmentEntity appointmentEntity = findAppointmentUc.findById(appointmentId) .map(appointmentMapper::toEntity) .orElseThrow(() -> new EntityNotFoundException("Appointment not found for ID: " + appointmentId)); @@ -68,7 +72,7 @@ public AppointmentEto updateAppointmentStatus(Long appointmentId, AppointmentSta return appointmentMapper.toEto(appointmentEntity); } - private AppointmentEntity buildAppointmentEntity(AppointmentBookingEto appointmentBookingEto) { + private AppointmentEntity buildAppointmentEntity(@Valid AppointmentBookingEto appointmentBookingEto) { AppointmentEntity entity = new AppointmentEntity(); ClientEntity clientEntity = clientRepository.findById(appointmentBookingEto.clientId()) diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageTreatmentUcImpl.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageTreatmentUcImpl.java index b47da80..bf51273 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageTreatmentUcImpl.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageTreatmentUcImpl.java @@ -9,12 +9,15 @@ import com.capgemini.training.appointmentbooking.logic.ManageTreatmentUc; import com.capgemini.training.appointmentbooking.logic.mapper.TreatmentMapper; import jakarta.persistence.EntityNotFoundException; +import jakarta.validation.Valid; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; @Service @Transactional +@Validated public class ManageTreatmentUcImpl implements ManageTreatmentUc { private final TreatmentRepository treatmentRepository; @@ -30,13 +33,13 @@ public ManageTreatmentUcImpl(TreatmentRepository treatmentRepository, Specialist } @Override - public TreatmentCto createTreatment(TreatmentCreationEto treatmentCreationEto) { + public TreatmentCto createTreatment(@Valid TreatmentCreationEto treatmentCreationEto) { TreatmentEntity treatmentEntity = buildTreatmentEntity(treatmentCreationEto); treatmentEntity = treatmentRepository.saveAndFlush(treatmentEntity); return treatmentMapper.toCto(treatmentEntity); } - private TreatmentEntity buildTreatmentEntity(TreatmentCreationEto treatmentCreationEto) { + private TreatmentEntity buildTreatmentEntity(@Valid TreatmentCreationEto treatmentCreationEto) { TreatmentEntity entity = new TreatmentEntity(); SpecialistEntity specialistEntity = specialistRepository.findById(treatmentCreationEto.specialistId()) diff --git a/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageAppointmentUcTestIT.java b/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageAppointmentUcTestIT.java index 1382e2b..f5ab1ba 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageAppointmentUcTestIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageAppointmentUcTestIT.java @@ -6,6 +6,7 @@ import com.capgemini.training.appointmentbooking.common.to.AppointmentBookingEto; import com.capgemini.training.appointmentbooking.common.to.AppointmentCto; import jakarta.inject.Inject; +import jakarta.validation.ConstraintViolationException; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; @@ -56,6 +57,28 @@ void shouldBookAppointment() { } + @Test + void shouldThrowConstraintViolationExceptionDuringAppointmentBooking() { + // given + Long clientId = null; + Long specialistId = -2L; + Long treatmentId = -3L; + Instant dateTime = toInstant("2024-03-03 14:00:00"); + + AppointmentBookingEto appointmentBookingEto = AppointmentBookingEto + .builder() + .clientId(clientId) + .specialistId(specialistId) + .treatmentId(treatmentId) + .dateTime(dateTime) + .build(); + + // then + assertThatThrownBy(() -> manageAppointmentUc.bookAppointment(appointmentBookingEto)) + .isInstanceOf(ConstraintViolationException.class) + .hasMessageContaining("bookAppointment.appointmentBookingEto.clientId: must not be null"); + } + @Test void shouldThrowAnExceptionDuringAppointmentBooking() { // given @@ -66,6 +89,8 @@ void shouldThrowAnExceptionDuringAppointmentBooking() { .builder() .specialistId(specialistId) .dateTime(dateTime) + .clientId(-1L) + .treatmentId(-1L) .build(); // when & then From 949764a4304c34d3987aa5635af83d86587d0023 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Machaj?= Date: Tue, 18 Mar 2025 09:26:30 +0100 Subject: [PATCH 09/12] add code review adjustments --- .../common/to/TreatmentCreationEto.java | 12 ------------ .../common/to/TreatmentCreationTo.java | 12 ++++++++++++ .../logic/ManageTreatmentUc.java | 4 ++-- .../logic/impl/ManageAppointmentUcImpl.java | 7 ++----- .../logic/impl/ManageTreatmentUcImpl.java | 17 ++++++++--------- .../logic/ManageTreatmentUcTestIT.java | 6 +++--- .../logic/impl/FindAppointmentUcImplTest.java | 4 ++-- .../logic/impl/ManageAppointmentUcImplTest.java | 14 +++++++++----- 8 files changed, 38 insertions(+), 38 deletions(-) delete mode 100644 src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentCreationEto.java create mode 100644 src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentCreationTo.java diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentCreationEto.java b/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentCreationEto.java deleted file mode 100644 index 6300729..0000000 --- a/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentCreationEto.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.capgemini.training.appointmentbooking.common.to; - -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; -import lombok.Builder; - - -@Builder -public record TreatmentCreationEto(@NotNull @Size(min = 5, max = 20) String name, - @NotNull @Size(min = 5, max = 80) String description, int durationMinutes, - @NotNull Long specialistId) { -} \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentCreationTo.java b/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentCreationTo.java new file mode 100644 index 0000000..97575ba --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentCreationTo.java @@ -0,0 +1,12 @@ +package com.capgemini.training.appointmentbooking.common.to; + +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Builder; + + +@Builder +public record TreatmentCreationTo(@NotNull @Size(min = 5, max = 20) String name, + @NotNull @Size(min = 5, max = 80) String description, int durationMinutes, + @NotNull Long specialistId) { +} \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/ManageTreatmentUc.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/ManageTreatmentUc.java index b975727..c3f9209 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/ManageTreatmentUc.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/ManageTreatmentUc.java @@ -1,11 +1,11 @@ package com.capgemini.training.appointmentbooking.logic; -import com.capgemini.training.appointmentbooking.common.to.TreatmentCreationEto; +import com.capgemini.training.appointmentbooking.common.to.TreatmentCreationTo; import com.capgemini.training.appointmentbooking.common.to.TreatmentCto; import jakarta.validation.Valid; public interface ManageTreatmentUc { - TreatmentCto createTreatment(@Valid TreatmentCreationEto treatmentCreationEto); + TreatmentCto createTreatment(@Valid TreatmentCreationTo treatmentCreationTo); } \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImpl.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImpl.java index 1bae6a3..901682e 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImpl.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImpl.java @@ -75,11 +75,8 @@ public AppointmentEto updateAppointmentStatus(@NotNull Long appointmentId, @NotN private AppointmentEntity buildAppointmentEntity(@Valid AppointmentBookingEto appointmentBookingEto) { AppointmentEntity entity = new AppointmentEntity(); - ClientEntity clientEntity = clientRepository.findById(appointmentBookingEto.clientId()) - .orElseThrow(() -> new EntityNotFoundException("Client not found")); - - TreatmentEntity treatmentEntity = treatmentRepository.findById(appointmentBookingEto.treatmentId()) - .orElseThrow(() -> new EntityNotFoundException("Treatment not found")); + ClientEntity clientEntity = clientRepository.getReferenceById(appointmentBookingEto.clientId()); + TreatmentEntity treatmentEntity = treatmentRepository.getReferenceById(appointmentBookingEto.treatmentId()); entity.setClient(clientEntity); entity.setTreatment(treatmentEntity); diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageTreatmentUcImpl.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageTreatmentUcImpl.java index bf51273..9c21a0d 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageTreatmentUcImpl.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageTreatmentUcImpl.java @@ -1,6 +1,6 @@ package com.capgemini.training.appointmentbooking.logic.impl; -import com.capgemini.training.appointmentbooking.common.to.TreatmentCreationEto; +import com.capgemini.training.appointmentbooking.common.to.TreatmentCreationTo; import com.capgemini.training.appointmentbooking.common.to.TreatmentCto; import com.capgemini.training.appointmentbooking.dataaccess.entity.SpecialistEntity; import com.capgemini.training.appointmentbooking.dataaccess.entity.TreatmentEntity; @@ -33,21 +33,20 @@ public ManageTreatmentUcImpl(TreatmentRepository treatmentRepository, Specialist } @Override - public TreatmentCto createTreatment(@Valid TreatmentCreationEto treatmentCreationEto) { - TreatmentEntity treatmentEntity = buildTreatmentEntity(treatmentCreationEto); + public TreatmentCto createTreatment(@Valid TreatmentCreationTo treatmentCreationTo) { + TreatmentEntity treatmentEntity = buildTreatmentEntity(treatmentCreationTo); treatmentEntity = treatmentRepository.saveAndFlush(treatmentEntity); return treatmentMapper.toCto(treatmentEntity); } - private TreatmentEntity buildTreatmentEntity(@Valid TreatmentCreationEto treatmentCreationEto) { + private TreatmentEntity buildTreatmentEntity(@Valid TreatmentCreationTo treatmentCreationTo) { TreatmentEntity entity = new TreatmentEntity(); - SpecialistEntity specialistEntity = specialistRepository.findById(treatmentCreationEto.specialistId()) - .orElseThrow(() -> new EntityNotFoundException("Treatment not found")); + SpecialistEntity specialistEntity = specialistRepository.getReferenceById(treatmentCreationTo.specialistId()); - entity.setName(treatmentCreationEto.name()); - entity.setDescription(treatmentCreationEto.description()); - entity.setDurationMinutes(treatmentCreationEto.durationMinutes()); + entity.setName(treatmentCreationTo.name()); + entity.setDescription(treatmentCreationTo.description()); + entity.setDurationMinutes(treatmentCreationTo.durationMinutes()); entity.setSpecialist(specialistEntity); return entity; diff --git a/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageTreatmentUcTestIT.java b/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageTreatmentUcTestIT.java index a9e925a..f8116d9 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageTreatmentUcTestIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageTreatmentUcTestIT.java @@ -1,7 +1,7 @@ package com.capgemini.training.appointmentbooking.logic; import com.capgemini.training.appointmentbooking.common.BaseTest; -import com.capgemini.training.appointmentbooking.common.to.TreatmentCreationEto; +import com.capgemini.training.appointmentbooking.common.to.TreatmentCreationTo; import com.capgemini.training.appointmentbooking.common.to.TreatmentCto; import jakarta.inject.Inject; import org.junit.jupiter.api.Test; @@ -29,7 +29,7 @@ void shouldCreateTreatment() { int durationMinutes = 60; Long specialistId = -1L; - TreatmentCreationEto treatmentCreationEto = TreatmentCreationEto + TreatmentCreationTo treatmentCreationTo = TreatmentCreationTo .builder() .name(name) .description(description) @@ -38,7 +38,7 @@ void shouldCreateTreatment() { .build(); // when - TreatmentCto result = manageTreatmentUc.createTreatment(treatmentCreationEto); + TreatmentCto result = manageTreatmentUc.createTreatment(treatmentCreationTo); // then Optional appointmentCto = findTreatmentUc.findById(result.treatmentEto().id()); diff --git a/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImplTest.java b/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImplTest.java index bec17d5..eef0288 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImplTest.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImplTest.java @@ -7,9 +7,9 @@ import com.capgemini.training.appointmentbooking.dataaccess.repository.AppointmentRepository; import com.capgemini.training.appointmentbooking.dataaccess.repository.criteria.AppointmentCriteria; import com.capgemini.training.appointmentbooking.logic.mapper.AppointmentMapper; -import com.capgemini.training.appointmentbooking.logic.mapper.AppointmentMapperImpl; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mapstruct.factory.Mappers; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; @@ -33,7 +33,7 @@ class FindAppointmentUcImplTest extends BaseTest { private FindAppointmentUcImpl findAppointmentUc; @Spy - private static AppointmentMapper appointmentMapper = new AppointmentMapperImpl(); + private static AppointmentMapper appointmentMapper = Mappers.getMapper(AppointmentMapper.class); @Test void shouldFindById() { diff --git a/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImplTest.java b/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImplTest.java index b282b0c..c3d8f14 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImplTest.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImplTest.java @@ -13,9 +13,13 @@ import com.capgemini.training.appointmentbooking.dataaccess.repository.AppointmentRepository; import com.capgemini.training.appointmentbooking.dataaccess.repository.ClientRepository; import com.capgemini.training.appointmentbooking.dataaccess.repository.TreatmentRepository; -import com.capgemini.training.appointmentbooking.logic.mapper.*; +import com.capgemini.training.appointmentbooking.logic.mapper.AppointmentMapper; +import com.capgemini.training.appointmentbooking.logic.mapper.ClientMapper; +import com.capgemini.training.appointmentbooking.logic.mapper.SpecialistMapper; +import com.capgemini.training.appointmentbooking.logic.mapper.TreatmentMapper; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mapstruct.factory.Mappers; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; @@ -47,16 +51,16 @@ class ManageAppointmentUcImplTest extends BaseTest { private ManageAppointmentUcImpl manageAppointmentUc; @Spy - private static AppointmentMapper appointmentMapper = new AppointmentMapperImpl(); + private static AppointmentMapper appointmentMapper = Mappers.getMapper(AppointmentMapper.class); @Spy - private static TreatmentMapper treatmentMapper = new TreatmentMapperImpl(); + private static TreatmentMapper treatmentMapper = Mappers.getMapper(TreatmentMapper.class); @Spy - private static SpecialistMapper specialistMapper = new SpecialistMapperImpl(); + private static SpecialistMapper specialistMapper = Mappers.getMapper(SpecialistMapper.class); @Spy - private static ClientMapper clientMapper = new ClientMapperImpl(); + private static ClientMapper clientMapper = Mappers.getMapper(ClientMapper.class); @Test void shouldBookAppointment() { From bcd5d1bde585a3986fc739567b74ffe4bb546895 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Machaj?= Date: Tue, 18 Mar 2025 09:31:20 +0100 Subject: [PATCH 10/12] fix tests --- .../logic/impl/ManageAppointmentUcImplTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImplTest.java b/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImplTest.java index c3d8f14..f3a3e80 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImplTest.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImplTest.java @@ -82,8 +82,8 @@ void shouldBookAppointment() { AppointmentEntity appointmentEntity = buildAppointmentEntity(clientId, specialistId, treatmentId, dateTime, status); when(findAppointmentUc.hasConflictingAppointment(specialistId, dateTime)).thenReturn(false); - when(clientRepository.findById(appointmentBookingEto.clientId())).thenReturn(Optional.of(new ClientEntity())); - when(treatmentRepository.findById(appointmentBookingEto.treatmentId())).thenReturn(Optional.of(new TreatmentEntity())); + when(clientRepository.getReferenceById(appointmentBookingEto.clientId())).thenReturn(new ClientEntity()); + when(treatmentRepository.getReferenceById(appointmentBookingEto.treatmentId())).thenReturn((new TreatmentEntity())); when(appointmentRepository.saveAndFlush(any())).thenReturn(appointmentEntity); // when From 98f1f0dc21e5e6866ae5ef4414b5d79001fc61f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Machaj?= Date: Tue, 18 Mar 2025 12:15:44 +0100 Subject: [PATCH 11/12] add separate mappers for ctos --- .../logic/config/MappingConfiguration.java | 10 +++++++ .../logic/impl/FindAppointmentUcImpl.java | 14 +++++----- .../logic/impl/FindTreatmentUcImpl.java | 14 +++++----- .../logic/impl/ManageAppointmentUcImpl.java | 10 ++++--- .../logic/impl/ManageTreatmentUcImpl.java | 11 ++++---- .../logic/mapper/AppointmentCtoMapper.java | 26 +++++++++++++++++++ .../logic/mapper/AppointmentMapper.java | 16 +----------- .../logic/mapper/ClientMapper.java | 2 +- .../logic/mapper/SpecialistMapper.java | 2 +- .../logic/mapper/TreatmentCtoMapper.java | 25 ++++++++++++++++++ .../logic/mapper/TreatmentMapper.java | 15 +---------- .../logic/mapper/UserMapper.java | 4 +-- .../logic/impl/FindAppointmentUcImplTest.java | 4 +++ .../impl/ManageAppointmentUcImplTest.java | 11 +++++--- 14 files changed, 104 insertions(+), 60 deletions(-) create mode 100644 src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/AppointmentCtoMapper.java create mode 100644 src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/TreatmentCtoMapper.java diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/config/MappingConfiguration.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/config/MappingConfiguration.java index 3f2a5e9..ab8ada4 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/config/MappingConfiguration.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/config/MappingConfiguration.java @@ -13,6 +13,11 @@ AppointmentMapper getAppointmentMapper() { return Mappers.getMapper(AppointmentMapper.class); } + @Bean + AppointmentCtoMapper getAppointmentCtoMapper() { + return Mappers.getMapper(AppointmentCtoMapper.class); + } + @Bean ClientMapper getClientMapper() { return Mappers.getMapper(ClientMapper.class); @@ -28,6 +33,11 @@ TreatmentMapper getTreatmentMapper() { return Mappers.getMapper(TreatmentMapper.class); } + @Bean + TreatmentCtoMapper getTreatmentCtoMapper() { + return Mappers.getMapper(TreatmentCtoMapper.class); + } + @Bean UserMapper getUserMapper() { return Mappers.getMapper(UserMapper.class); diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImpl.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImpl.java index d919fe3..973276c 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImpl.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImpl.java @@ -4,7 +4,7 @@ import com.capgemini.training.appointmentbooking.dataaccess.repository.AppointmentRepository; import com.capgemini.training.appointmentbooking.dataaccess.repository.criteria.AppointmentCriteria; import com.capgemini.training.appointmentbooking.logic.FindAppointmentUc; -import com.capgemini.training.appointmentbooking.logic.mapper.AppointmentMapper; +import com.capgemini.training.appointmentbooking.logic.mapper.AppointmentCtoMapper; import jakarta.validation.constraints.NotNull; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -23,26 +23,26 @@ public class FindAppointmentUcImpl implements FindAppointmentUc { private final AppointmentRepository appointmentRepository; - private final AppointmentMapper appointmentMapper; + private final AppointmentCtoMapper appointmentCtoMapper; - public FindAppointmentUcImpl(AppointmentRepository appointmentRepository, AppointmentMapper appointmentMapper) { + public FindAppointmentUcImpl(AppointmentRepository appointmentRepository, AppointmentCtoMapper appointmentCtoMapper) { this.appointmentRepository = appointmentRepository; - this.appointmentMapper = appointmentMapper; + this.appointmentCtoMapper = appointmentCtoMapper; } @Override public Optional findById(@NotNull Long id) { - return appointmentRepository.findById(id).map(appointmentMapper::toCto); + return appointmentRepository.findById(id).map(appointmentCtoMapper::toCto); } @Override public List findAll() { - return appointmentRepository.findAll().stream().map(appointmentMapper::toCto).collect(Collectors.toList()); + return appointmentRepository.findAll().stream().map(appointmentCtoMapper::toCto).collect(Collectors.toList()); } @Override public List findByCriteria(AppointmentCriteria criteria) { - return appointmentRepository.findByCriteria(criteria).stream().map(appointmentMapper::toCto).collect(Collectors.toList()); + return appointmentRepository.findByCriteria(criteria).stream().map(appointmentCtoMapper::toCto).collect(Collectors.toList()); } @Override diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindTreatmentUcImpl.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindTreatmentUcImpl.java index 09cbf8d..218f8f9 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindTreatmentUcImpl.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/FindTreatmentUcImpl.java @@ -4,7 +4,7 @@ import com.capgemini.training.appointmentbooking.dataaccess.repository.TreatmentRepository; import com.capgemini.training.appointmentbooking.dataaccess.repository.criteria.TreatmentCriteria; import com.capgemini.training.appointmentbooking.logic.FindTreatmentUc; -import com.capgemini.training.appointmentbooking.logic.mapper.TreatmentMapper; +import com.capgemini.training.appointmentbooking.logic.mapper.TreatmentCtoMapper; import jakarta.validation.constraints.NotNull; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -22,26 +22,26 @@ public class FindTreatmentUcImpl implements FindTreatmentUc { private final TreatmentRepository treatmentRepository; - private final TreatmentMapper treatmentMapper; + private final TreatmentCtoMapper treatmentCtoMapper; - public FindTreatmentUcImpl(TreatmentRepository treatmentRepository, TreatmentMapper treatmentMapper) { + public FindTreatmentUcImpl(TreatmentRepository treatmentRepository, TreatmentCtoMapper treatmentCtoMapper) { this.treatmentRepository = treatmentRepository; - this.treatmentMapper = treatmentMapper; + this.treatmentCtoMapper = treatmentCtoMapper; } @Override public Optional findById(@NotNull Long id) { - return treatmentRepository.findById(id).map(treatmentMapper::toCto); + return treatmentRepository.findById(id).map(treatmentCtoMapper::toCto); } @Override public List findByCriteria(TreatmentCriteria criteria) { - return treatmentRepository.findByCriteria(criteria).stream().map(treatmentMapper::toCto).collect(Collectors.toList()); + return treatmentRepository.findByCriteria(criteria).stream().map(treatmentCtoMapper::toCto).collect(Collectors.toList()); } @Override public List findAll() { - return treatmentRepository.findAll().stream().map(treatmentMapper::toCto).toList(); + return treatmentRepository.findAll().stream().map(treatmentCtoMapper::toCto).toList(); } } \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImpl.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImpl.java index 901682e..1a84d35 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImpl.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImpl.java @@ -13,6 +13,7 @@ import com.capgemini.training.appointmentbooking.dataaccess.repository.TreatmentRepository; import com.capgemini.training.appointmentbooking.logic.FindAppointmentUc; import com.capgemini.training.appointmentbooking.logic.ManageAppointmentUc; +import com.capgemini.training.appointmentbooking.logic.mapper.AppointmentCtoMapper; import com.capgemini.training.appointmentbooking.logic.mapper.AppointmentMapper; import jakarta.persistence.EntityNotFoundException; import jakarta.validation.Valid; @@ -37,13 +38,16 @@ public class ManageAppointmentUcImpl implements ManageAppointmentUc { private final AppointmentMapper appointmentMapper; + private final AppointmentCtoMapper appointmentCtoMapper; + public ManageAppointmentUcImpl(FindAppointmentUc findAppointmentUc, AppointmentRepository appointmentRepository, ClientRepository clientRepository, - TreatmentRepository treatmentRepository, AppointmentMapper appointmentMapper) { + TreatmentRepository treatmentRepository, AppointmentMapper appointmentMapper, AppointmentCtoMapper appointmentCtoMapper) { this.findAppointmentUc = findAppointmentUc; this.appointmentRepository = appointmentRepository; this.clientRepository = clientRepository; this.treatmentRepository = treatmentRepository; this.appointmentMapper = appointmentMapper; + this.appointmentCtoMapper = appointmentCtoMapper; } @Override @@ -57,13 +61,13 @@ public AppointmentCto bookAppointment(@Valid AppointmentBookingEto appointmentBo AppointmentEntity appointmentEntity = buildAppointmentEntity(appointmentBookingEto); appointmentEntity = appointmentRepository.saveAndFlush(appointmentEntity); - return appointmentMapper.toCto(appointmentEntity); + return appointmentCtoMapper.toCto(appointmentEntity); } @Override public AppointmentEto updateAppointmentStatus(@NotNull Long appointmentId, @NotNull AppointmentStatus appointmentStatus) { AppointmentEntity appointmentEntity = findAppointmentUc.findById(appointmentId) - .map(appointmentMapper::toEntity) + .map(appointmentCtoMapper::toEntity) .orElseThrow(() -> new EntityNotFoundException("Appointment not found for ID: " + appointmentId)); appointmentEntity.setStatus(appointmentStatus); diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageTreatmentUcImpl.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageTreatmentUcImpl.java index 9c21a0d..659d002 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageTreatmentUcImpl.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/impl/ManageTreatmentUcImpl.java @@ -7,8 +7,7 @@ import com.capgemini.training.appointmentbooking.dataaccess.repository.SpecialistRepository; import com.capgemini.training.appointmentbooking.dataaccess.repository.TreatmentRepository; import com.capgemini.training.appointmentbooking.logic.ManageTreatmentUc; -import com.capgemini.training.appointmentbooking.logic.mapper.TreatmentMapper; -import jakarta.persistence.EntityNotFoundException; +import com.capgemini.training.appointmentbooking.logic.mapper.TreatmentCtoMapper; import jakarta.validation.Valid; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -24,19 +23,19 @@ public class ManageTreatmentUcImpl implements ManageTreatmentUc { private final SpecialistRepository specialistRepository; - private final TreatmentMapper treatmentMapper; + private final TreatmentCtoMapper treatmentCtoMapper; - public ManageTreatmentUcImpl(TreatmentRepository treatmentRepository, SpecialistRepository specialistRepository, TreatmentMapper treatmentMapper) { + public ManageTreatmentUcImpl(TreatmentRepository treatmentRepository, SpecialistRepository specialistRepository, TreatmentCtoMapper treatmentCtoMapper) { this.treatmentRepository = treatmentRepository; this.specialistRepository = specialistRepository; - this.treatmentMapper = treatmentMapper; + this.treatmentCtoMapper = treatmentCtoMapper; } @Override public TreatmentCto createTreatment(@Valid TreatmentCreationTo treatmentCreationTo) { TreatmentEntity treatmentEntity = buildTreatmentEntity(treatmentCreationTo); treatmentEntity = treatmentRepository.saveAndFlush(treatmentEntity); - return treatmentMapper.toCto(treatmentEntity); + return treatmentCtoMapper.toCto(treatmentEntity); } private TreatmentEntity buildTreatmentEntity(@Valid TreatmentCreationTo treatmentCreationTo) { diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/AppointmentCtoMapper.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/AppointmentCtoMapper.java new file mode 100644 index 0000000..0a23545 --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/AppointmentCtoMapper.java @@ -0,0 +1,26 @@ +package com.capgemini.training.appointmentbooking.logic.mapper; + + +import com.capgemini.training.appointmentbooking.common.to.AppointmentCto; +import com.capgemini.training.appointmentbooking.dataaccess.entity.AppointmentEntity; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + + +@Mapper(uses = {AppointmentMapper.class, ClientMapper.class, TreatmentCtoMapper.class}) +public interface AppointmentCtoMapper { + + @Mapping(source = "appointmentEto.id", target = "id") + @Mapping(source = "appointmentEto.dateTime", target = "dateTime") + @Mapping(source = "appointmentEto.status", target = "status") + @Mapping(source = "clientEto", target = "client") + @Mapping(source = "treatmentCto", target = "treatment") + @Mapping(target = "version", ignore = true) + AppointmentEntity toEntity(AppointmentCto eto); + + @Mapping(source = "entity", target = "appointmentEto") + @Mapping(source = "entity.client", target = "clientEto") + @Mapping(source = "entity.treatment", target = "treatmentCto") + AppointmentCto toCto(AppointmentEntity entity); + +} \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/AppointmentMapper.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/AppointmentMapper.java index 3715ba4..7110e89 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/AppointmentMapper.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/AppointmentMapper.java @@ -1,14 +1,13 @@ package com.capgemini.training.appointmentbooking.logic.mapper; -import com.capgemini.training.appointmentbooking.common.to.AppointmentCto; import com.capgemini.training.appointmentbooking.common.to.AppointmentEto; import com.capgemini.training.appointmentbooking.dataaccess.entity.AppointmentEntity; import org.mapstruct.Mapper; import org.mapstruct.Mapping; -@Mapper(uses = {ClientMapper.class, TreatmentMapper.class}) +@Mapper public interface AppointmentMapper { @Mapping(target = "client", ignore = true) @@ -16,19 +15,6 @@ public interface AppointmentMapper { @Mapping(target = "treatment", ignore = true) AppointmentEntity toEntity(AppointmentEto eto); - @Mapping(source = "appointmentEto.id", target = "id") - @Mapping(source = "appointmentEto.dateTime", target = "dateTime") - @Mapping(source = "appointmentEto.status", target = "status") - @Mapping(source = "clientEto", target = "client") - @Mapping(source = "treatmentCto", target = "treatment") - @Mapping(target = "version", ignore = true) - AppointmentEntity toEntity(AppointmentCto eto); - AppointmentEto toEto(AppointmentEntity entity); - @Mapping(source = "entity", target = "appointmentEto") - @Mapping(source = "entity.client", target = "clientEto") - @Mapping(source = "entity.treatment", target = "treatmentCto") - AppointmentCto toCto(AppointmentEntity entity); - } \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/ClientMapper.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/ClientMapper.java index cd5d010..26654cf 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/ClientMapper.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/ClientMapper.java @@ -7,7 +7,7 @@ import org.mapstruct.Mapping; -@Mapper() +@Mapper public interface ClientMapper { @Mapping(target = "appointments", ignore = true) diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/SpecialistMapper.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/SpecialistMapper.java index 4520053..415b979 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/SpecialistMapper.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/SpecialistMapper.java @@ -7,7 +7,7 @@ import org.mapstruct.Mapping; -@Mapper() +@Mapper public interface SpecialistMapper { @Mapping(target = "version", ignore = true) diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/TreatmentCtoMapper.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/TreatmentCtoMapper.java new file mode 100644 index 0000000..ab729e1 --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/TreatmentCtoMapper.java @@ -0,0 +1,25 @@ +package com.capgemini.training.appointmentbooking.logic.mapper; + + +import com.capgemini.training.appointmentbooking.common.to.TreatmentCto; +import com.capgemini.training.appointmentbooking.dataaccess.entity.TreatmentEntity; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + + +@Mapper(uses = {TreatmentMapper.class, SpecialistMapper.class}) +public interface TreatmentCtoMapper { + + @Mapping(source = "treatmentEto.id", target = "id") + @Mapping(source = "treatmentEto.name", target = "name") + @Mapping(source = "treatmentEto.description", target = "description") + @Mapping(source = "treatmentEto.durationMinutes", target = "durationMinutes") + @Mapping(source = "specialistEto", target = "specialist") + @Mapping(target = "version", ignore = true) + TreatmentEntity toEntity(TreatmentCto entity); + + @Mapping(source = "entity", target = "treatmentEto") + @Mapping(source = "entity.specialist", target = "specialistEto") + TreatmentCto toCto(TreatmentEntity entity); + +} \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/TreatmentMapper.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/TreatmentMapper.java index 2788f88..e4bbfb3 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/TreatmentMapper.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/TreatmentMapper.java @@ -1,32 +1,19 @@ package com.capgemini.training.appointmentbooking.logic.mapper; -import com.capgemini.training.appointmentbooking.common.to.TreatmentCto; import com.capgemini.training.appointmentbooking.common.to.TreatmentEto; import com.capgemini.training.appointmentbooking.dataaccess.entity.TreatmentEntity; import org.mapstruct.Mapper; import org.mapstruct.Mapping; -@Mapper(uses = {SpecialistMapper.class}) +@Mapper public interface TreatmentMapper { @Mapping(target = "specialist", ignore = true) @Mapping(target = "version", ignore = true) TreatmentEntity toEntity(TreatmentEto eto); - @Mapping(source = "treatmentEto.id", target = "id") - @Mapping(source = "treatmentEto.name", target = "name") - @Mapping(source = "treatmentEto.description", target = "description") - @Mapping(source = "treatmentEto.durationMinutes", target = "durationMinutes") - @Mapping(source = "specialistEto", target = "specialist") - @Mapping(target = "version", ignore = true) - TreatmentEntity toEntity(TreatmentCto entity); - TreatmentEto toEto(TreatmentEntity entity); - @Mapping(source = "entity", target = "treatmentEto") - @Mapping(source = "entity.specialist", target = "specialistEto") - TreatmentCto toCto(TreatmentEntity entity); - } \ No newline at end of file diff --git a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/UserMapper.java b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/UserMapper.java index 362cb03..d03f27a 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/UserMapper.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/logic/mapper/UserMapper.java @@ -7,7 +7,7 @@ import org.mapstruct.Mapping; -@Mapper() +@Mapper public interface UserMapper { @Mapping(target = "firstname", source = "firstName") @@ -18,5 +18,5 @@ public interface UserMapper { @Mapping(target = "firstName", source = "firstname") @Mapping(target = "lastName", source = "lastname") UserEto toEto(UserEntity entity); - + } \ No newline at end of file diff --git a/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImplTest.java b/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImplTest.java index eef0288..11991de 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImplTest.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/FindAppointmentUcImplTest.java @@ -6,6 +6,7 @@ import com.capgemini.training.appointmentbooking.dataaccess.entity.AppointmentEntity; import com.capgemini.training.appointmentbooking.dataaccess.repository.AppointmentRepository; import com.capgemini.training.appointmentbooking.dataaccess.repository.criteria.AppointmentCriteria; +import com.capgemini.training.appointmentbooking.logic.mapper.AppointmentCtoMapper; import com.capgemini.training.appointmentbooking.logic.mapper.AppointmentMapper; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -35,6 +36,9 @@ class FindAppointmentUcImplTest extends BaseTest { @Spy private static AppointmentMapper appointmentMapper = Mappers.getMapper(AppointmentMapper.class); + @Spy + private static AppointmentCtoMapper appointmentCtoMapper = Mappers.getMapper(AppointmentCtoMapper.class); + @Test void shouldFindById() { // given diff --git a/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImplTest.java b/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImplTest.java index f3a3e80..da1153a 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImplTest.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/logic/impl/ManageAppointmentUcImplTest.java @@ -13,10 +13,7 @@ import com.capgemini.training.appointmentbooking.dataaccess.repository.AppointmentRepository; import com.capgemini.training.appointmentbooking.dataaccess.repository.ClientRepository; import com.capgemini.training.appointmentbooking.dataaccess.repository.TreatmentRepository; -import com.capgemini.training.appointmentbooking.logic.mapper.AppointmentMapper; -import com.capgemini.training.appointmentbooking.logic.mapper.ClientMapper; -import com.capgemini.training.appointmentbooking.logic.mapper.SpecialistMapper; -import com.capgemini.training.appointmentbooking.logic.mapper.TreatmentMapper; +import com.capgemini.training.appointmentbooking.logic.mapper.*; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mapstruct.factory.Mappers; @@ -53,9 +50,15 @@ class ManageAppointmentUcImplTest extends BaseTest { @Spy private static AppointmentMapper appointmentMapper = Mappers.getMapper(AppointmentMapper.class); + @Spy + private static AppointmentCtoMapper appointmentCtoMapper = Mappers.getMapper(AppointmentCtoMapper.class); + @Spy private static TreatmentMapper treatmentMapper = Mappers.getMapper(TreatmentMapper.class); + @Spy + private static TreatmentCtoMapper treatmentCtoMapper = Mappers.getMapper(TreatmentCtoMapper.class); + @Spy private static SpecialistMapper specialistMapper = Mappers.getMapper(SpecialistMapper.class); From 935c595f3cb956a8de80b51317a905ac0279eabc Mon Sep 17 00:00:00 2001 From: Piotr Kubicki Date: Fri, 21 Mar 2025 16:00:59 +0100 Subject: [PATCH 12/12] fix: small refactor, add @Min(1) for TreatmentCreationTo#durationMinutes --- pom.xml | 4 ++-- .../appointmentbooking/common/datatype/AppointmentStatus.java | 2 +- .../appointmentbooking/common/to/TreatmentCreationTo.java | 4 +++- .../appointmentbooking/logic/FindAppointmentUcTestIT.java | 4 ---- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index 261a7eb..dbec20a 100644 --- a/pom.xml +++ b/pom.xml @@ -67,7 +67,7 @@ com.querydsl querydsl-apt - 5.0.0 + 5.1.0 jakarta provided @@ -75,7 +75,7 @@ com.querydsl querydsl-jpa jakarta - 5.0.0 + 5.1.0 org.mapstruct diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/datatype/AppointmentStatus.java b/src/main/java/com/capgemini/training/appointmentbooking/common/datatype/AppointmentStatus.java index 7f49c3a..53854ad 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/common/datatype/AppointmentStatus.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/datatype/AppointmentStatus.java @@ -1,5 +1,5 @@ package com.capgemini.training.appointmentbooking.common.datatype; public enum AppointmentStatus { -SCHEDULED, CANCELLED, COMPLETED; + SCHEDULED, CANCELLED, COMPLETED } diff --git a/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentCreationTo.java b/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentCreationTo.java index 97575ba..3ff509d 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentCreationTo.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/common/to/TreatmentCreationTo.java @@ -1,5 +1,6 @@ package com.capgemini.training.appointmentbooking.common.to; +import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; import lombok.Builder; @@ -7,6 +8,7 @@ @Builder public record TreatmentCreationTo(@NotNull @Size(min = 5, max = 20) String name, - @NotNull @Size(min = 5, max = 80) String description, int durationMinutes, + @NotNull @Size(min = 5, max = 80) String description, + @Min(1) int durationMinutes, @NotNull Long specialistId) { } \ No newline at end of file diff --git a/src/test/java/com/capgemini/training/appointmentbooking/logic/FindAppointmentUcTestIT.java b/src/test/java/com/capgemini/training/appointmentbooking/logic/FindAppointmentUcTestIT.java index d0926d1..a5d111f 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/logic/FindAppointmentUcTestIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/logic/FindAppointmentUcTestIT.java @@ -3,7 +3,6 @@ import com.capgemini.training.appointmentbooking.common.BaseTest; import com.capgemini.training.appointmentbooking.common.datatype.AppointmentStatus; import com.capgemini.training.appointmentbooking.common.to.AppointmentCto; -import com.capgemini.training.appointmentbooking.dataaccess.repository.AppointmentRepository; import com.capgemini.training.appointmentbooking.dataaccess.repository.criteria.AppointmentCriteria; import jakarta.inject.Inject; import org.junit.jupiter.api.Test; @@ -21,9 +20,6 @@ class FindAppointmentUcTestIT extends BaseTest { @Inject private FindAppointmentUc findAppointmentUc; - @Inject - private AppointmentRepository appointmentRepository; - @Test void shouldFindById() { // given