diff --git a/src/main/java/com/capgemini/training/appointmentbooking/AppointmentBookingAppApplication.java b/src/main/java/com/capgemini/training/appointmentbooking/AppointmentBookingAppApplication.java index 147a512..1639ccf 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/AppointmentBookingAppApplication.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/AppointmentBookingAppApplication.java @@ -1,12 +1,9 @@ package com.capgemini.training.appointmentbooking; -import com.capgemini.training.appointmentbooking.dataaccess.repository.impl.BaseJpaRepositoryImpl; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @SpringBootApplication -@EnableJpaRepositories(repositoryBaseClass = BaseJpaRepositoryImpl.class) public class AppointmentBookingAppApplication { public static void main(String[] args) { diff --git a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/config/DataaccessConfiguration.java b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/config/DataaccessConfiguration.java new file mode 100644 index 0000000..9fbaceb --- /dev/null +++ b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/config/DataaccessConfiguration.java @@ -0,0 +1,11 @@ +package com.capgemini.training.appointmentbooking.dataaccess.config; + +import com.capgemini.training.appointmentbooking.dataaccess.repository.impl.BaseJpaRepositoryImpl; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; + +@Configuration +@EnableJpaRepositories( + repositoryBaseClass = BaseJpaRepositoryImpl.class, + basePackages = "com.capgemini.training.appointmentbooking.dataaccess.repository") +public class DataaccessConfiguration {} diff --git a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/repository/AppointmentRepository.java b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/repository/AppointmentRepository.java index 53927f1..9426b3c 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/repository/AppointmentRepository.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/repository/AppointmentRepository.java @@ -77,6 +77,7 @@ SELECT CASE WHEN COUNT(a) > 0 THEN TRUE ELSE FALSE END JOIN a.treatment t WHERE t.specialist.id = :specialistId AND a.dateTime = :date + AND a.status <> com.capgemini.training.appointmentbooking.common.datatype.AppointmentStatus.CANCELLED """) boolean hasConflictingAppointmentBySpecialistIdAndDateTime(@Param("specialistId") Long specialistId, @Param("date") Instant date); diff --git a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/repository/BaseJpaRepository.java b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/repository/BaseJpaRepository.java index 1720af1..6b37c38 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/repository/BaseJpaRepository.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/repository/BaseJpaRepository.java @@ -1,11 +1,11 @@ package com.capgemini.training.appointmentbooking.dataaccess.repository; import jakarta.persistence.EntityManager; -import org.springframework.data.jpa.repository.support.JpaRepositoryImplementation; +import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.NoRepositoryBean; @NoRepositoryBean -public interface BaseJpaRepository extends JpaRepositoryImplementation { +public interface BaseJpaRepository extends JpaRepository { EntityManager getEntityManager(); diff --git a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/repository/TreatmentRepository.java b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/repository/TreatmentRepository.java index 8479256..5eab402 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/repository/TreatmentRepository.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/repository/TreatmentRepository.java @@ -14,7 +14,7 @@ @Repository public interface TreatmentRepository extends BaseJpaRepository { - List findAllByName(String name); + List findAllByNameStartingWithIgnoringCase(String name); List findByNameNamedQuery(String name); diff --git a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/repository/UserRepository.java b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/repository/UserRepository.java index 75d3412..52b8b87 100644 --- a/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/repository/UserRepository.java +++ b/src/main/java/com/capgemini/training/appointmentbooking/dataaccess/repository/UserRepository.java @@ -15,7 +15,6 @@ @Repository public interface UserRepository extends BaseJpaRepository { - default List findByCriteria(UserCriteria criteria) { Objects.requireNonNull(criteria, "criteria must not be null"); @@ -41,4 +40,5 @@ default List findByCriteria(UserCriteria criteria) { return entityManager.createQuery(cq).getResultList(); } + } diff --git a/src/test/java/com/capgemini/training/appointmentbooking/common/BaseDataJpaTest.java b/src/test/java/com/capgemini/training/appointmentbooking/common/BaseDataJpaTest.java new file mode 100644 index 0000000..5eaeaff --- /dev/null +++ b/src/test/java/com/capgemini/training/appointmentbooking/common/BaseDataJpaTest.java @@ -0,0 +1,11 @@ +package com.capgemini.training.appointmentbooking.common; + +import com.capgemini.training.appointmentbooking.dataaccess.config.DataaccessConfiguration; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.context.annotation.Import; +import org.springframework.transaction.annotation.Transactional; + +@DataJpaTest +@Import(DataaccessConfiguration.class) +public class BaseDataJpaTest extends BaseTest{ +} diff --git a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/entity/EntitySmokeTestIT.java b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/entity/EntitySmokeIT.java similarity index 86% rename from src/test/java/com/capgemini/training/appointmentbooking/dataaccess/entity/EntitySmokeTestIT.java rename to src/test/java/com/capgemini/training/appointmentbooking/dataaccess/entity/EntitySmokeIT.java index 2286fa0..87c969c 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/entity/EntitySmokeTestIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/entity/EntitySmokeIT.java @@ -10,9 +10,10 @@ import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; +import org.springframework.data.repository.config.BootstrapMode; -@DataJpaTest -public class EntitySmokeTestIT { +@DataJpaTest(bootstrapMode = BootstrapMode.LAZY) +public class EntitySmokeIT { @PersistenceContext private EntityManager em; diff --git a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/AppointmentRepositoryTestIT.java b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/AppointmentRepositoryIT.java similarity index 95% rename from src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/AppointmentRepositoryTestIT.java rename to src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/AppointmentRepositoryIT.java index d512862..b1aa168 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/AppointmentRepositoryTestIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/AppointmentRepositoryIT.java @@ -1,6 +1,6 @@ package com.capgemini.training.appointmentbooking.dataaccess.repository; -import com.capgemini.training.appointmentbooking.common.BaseTest; +import com.capgemini.training.appointmentbooking.common.BaseDataJpaTest; import com.capgemini.training.appointmentbooking.common.datatype.AppointmentStatus; import com.capgemini.training.appointmentbooking.dataaccess.entity.AppointmentEntity; import com.capgemini.training.appointmentbooking.dataaccess.entity.ClientEntity; @@ -9,17 +9,14 @@ import com.capgemini.training.appointmentbooking.dataaccess.repository.criteria.AppointmentCriteria; 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 { + +public class AppointmentRepositoryIT extends BaseDataJpaTest { @Inject private AppointmentRepository appointmentRepository; @@ -196,5 +193,4 @@ 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/ClientRepositoryIT.java similarity index 77% rename from src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/ClientRepositoryTestIT.java rename to src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/ClientRepositoryIT.java index 607e6ea..4a2538f 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/ClientRepositoryTestIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/ClientRepositoryIT.java @@ -1,18 +1,15 @@ package com.capgemini.training.appointmentbooking.dataaccess.repository; -import com.capgemini.training.appointmentbooking.common.BaseTest; +import com.capgemini.training.appointmentbooking.common.BaseDataJpaTest; import com.capgemini.training.appointmentbooking.dataaccess.entity.ClientEntity; 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 { + +public class ClientRepositoryIT extends BaseDataJpaTest { @Inject private ClientRepository clientRepository; @@ -35,5 +32,4 @@ 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/SpecialistRepositoryIT.java similarity index 85% rename from src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/SpecialistRepositoryTestIT.java rename to src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/SpecialistRepositoryIT.java index 09db21a..c1ba94f 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/SpecialistRepositoryTestIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/SpecialistRepositoryIT.java @@ -1,19 +1,15 @@ package com.capgemini.training.appointmentbooking.dataaccess.repository; -import com.capgemini.training.appointmentbooking.common.BaseTest; +import com.capgemini.training.appointmentbooking.common.BaseDataJpaTest; import com.capgemini.training.appointmentbooking.common.datatype.Specialization; import com.capgemini.training.appointmentbooking.dataaccess.entity.SpecialistEntity; 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 { +public class SpecialistRepositoryIT extends BaseDataJpaTest { @Inject private SpecialistRepository specialistRepository; @@ -51,5 +47,4 @@ 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/TreatmentRepositoryIT.java similarity index 93% rename from src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/TreatmentRepositoryTestIT.java rename to src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/TreatmentRepositoryIT.java index 2c0d7cf..f2ddbf9 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/TreatmentRepositoryTestIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/TreatmentRepositoryIT.java @@ -1,22 +1,18 @@ package com.capgemini.training.appointmentbooking.dataaccess.repository; -import com.capgemini.training.appointmentbooking.common.BaseTest; +import com.capgemini.training.appointmentbooking.common.BaseDataJpaTest; import com.capgemini.training.appointmentbooking.common.datatype.Specialization; import com.capgemini.training.appointmentbooking.dataaccess.entity.SpecialistEntity; import com.capgemini.training.appointmentbooking.dataaccess.entity.TreatmentEntity; import com.capgemini.training.appointmentbooking.dataaccess.repository.criteria.TreatmentCriteria; 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 { +public class TreatmentRepositoryIT extends BaseDataJpaTest { @Inject private TreatmentRepository treatmentRepository; @@ -27,10 +23,10 @@ public class TreatmentRepositoryTestIT extends BaseTest { @Test void shouldFindTreatmentsByName() { // given - String treatmentName = "Konsultacja dentystyczna"; + String treatmentName = "konsUltacja de"; // when - List result = treatmentRepository.findAllByName(treatmentName); + List result = treatmentRepository.findAllByNameStartingWithIgnoringCase(treatmentName); // then assertThat(result).hasSize(1); @@ -168,5 +164,4 @@ 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/UserRepositoryIT.java similarity index 82% rename from src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/UserRepositoryTestIT.java rename to src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/UserRepositoryIT.java index b8e9c6b..561ed8e 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/UserRepositoryTestIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/dataaccess/repository/UserRepositoryIT.java @@ -1,19 +1,15 @@ package com.capgemini.training.appointmentbooking.dataaccess.repository; -import com.capgemini.training.appointmentbooking.common.BaseTest; +import com.capgemini.training.appointmentbooking.common.BaseDataJpaTest; import com.capgemini.training.appointmentbooking.dataaccess.entity.UserEntity; import com.capgemini.training.appointmentbooking.dataaccess.repository.criteria.UserCriteria; 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 { +public class UserRepositoryIT extends BaseDataJpaTest { @Inject private UserRepository userRepository; @@ -43,5 +39,4 @@ 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/ManageAppointmentUcTestIT.java b/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageAppointmentUcTestIT.java index f5ab1ba..0bee03a 100644 --- a/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageAppointmentUcTestIT.java +++ b/src/test/java/com/capgemini/training/appointmentbooking/logic/ManageAppointmentUcTestIT.java @@ -82,8 +82,8 @@ void shouldThrowConstraintViolationExceptionDuringAppointmentBooking() { @Test void shouldThrowAnExceptionDuringAppointmentBooking() { // given - Long specialistId = -3L; - Instant dateTime = toInstant("2024-03-03 14:00:00"); + Long specialistId = -4L; + Instant dateTime = toInstant("2024-03-04 08:15:00"); AppointmentBookingEto appointmentBookingEto = AppointmentBookingEto .builder()