diff --git a/src/main/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/common/exceptions/DateChronologyException.java b/src/main/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/common/exceptions/DateChronologyException.java new file mode 100644 index 00000000..a159cff8 --- /dev/null +++ b/src/main/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/common/exceptions/DateChronologyException.java @@ -0,0 +1,17 @@ +package br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.common.exceptions; + +import lombok.Getter; + +import java.time.LocalDate; + +@Getter +public class DateChronologyException extends RuntimeException { + private final LocalDate startDate; + private final LocalDate endDate; + + public DateChronologyException(LocalDate startDate, LocalDate endDate) { + super(); + this.startDate = startDate; + this.endDate = endDate; + } +} diff --git a/src/main/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/common/exceptions/ResponseEntityExceptionHandlerApp.java b/src/main/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/common/exceptions/ResponseEntityExceptionHandlerApp.java index 87ddf7ce..c126947c 100644 --- a/src/main/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/common/exceptions/ResponseEntityExceptionHandlerApp.java +++ b/src/main/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/common/exceptions/ResponseEntityExceptionHandlerApp.java @@ -213,4 +213,36 @@ public ResponseEntity mergeFiles(MergeFilesException exception) { HttpStatus.CONFLICT ); } + + @ExceptionHandler(DateChronologyException.class) + public ResponseEntity dateCronology(DateChronologyException exception) { + return new ResponseEntity<>( + new ProblemDetail( + "the date " + + exception.getStartDate().toString() + + " should be before the date " + + exception.getEndDate().toString(), + Collections.emptyList() + ), + HttpStatus.CONFLICT + ); + } + + @ExceptionHandler(TimeOverlayException.class) + public ResponseEntity dateOverlay(TimeOverlayException exception) { + return new ResponseEntity<>( + new ProblemDetail( + "the time between " + + exception.getStartDate().toString() + + " and " + + exception.getEndDate().toString() + + " overlaps with the time between " + + exception.getOverlaidStartDate().toString() + + " and " + + exception.getOverlaidEndDate().toString(), + Collections.emptyList() + ), + HttpStatus.CONFLICT + ); + } } diff --git a/src/main/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/common/exceptions/TimeOverlayException.java b/src/main/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/common/exceptions/TimeOverlayException.java new file mode 100644 index 00000000..122810bb --- /dev/null +++ b/src/main/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/common/exceptions/TimeOverlayException.java @@ -0,0 +1,21 @@ +package br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.common.exceptions; + +import lombok.Getter; + +import java.time.LocalDate; + +@Getter +public class TimeOverlayException extends RuntimeException { + private final LocalDate startDate; + private final LocalDate endDate; + private final LocalDate overlaidStartDate; + private final LocalDate overlaidEndDate; + + public TimeOverlayException(LocalDate startDate, LocalDate endDate, LocalDate overlaidStartDate, LocalDate overlaidEndDate) { + super(); + this.startDate = startDate; + this.endDate = endDate; + this.overlaidStartDate = overlaidStartDate; + this.overlaidEndDate = overlaidEndDate; + } +} diff --git a/src/main/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/curriculum/Curriculum.java b/src/main/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/curriculum/Curriculum.java index 291edc14..ad036158 100644 --- a/src/main/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/curriculum/Curriculum.java +++ b/src/main/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/curriculum/Curriculum.java @@ -7,6 +7,7 @@ import lombok.Setter; import javax.persistence.*; +import java.time.LocalDate; import java.util.UUID; @Entity @@ -22,6 +23,8 @@ public class Curriculum { private Integer internshipCourseLoad; private String internshipStartCriteria; private String internshipAllowedActivities; + private LocalDate validityStartDate; + private LocalDate validityEndDate; @Enumerated(EnumType.STRING) private EntityStatus status; @@ -34,6 +37,8 @@ public Curriculum( Integer internshipCourseLoad, String internshipStartCriteria, String internshipAllowedActivities, + LocalDate validityStartDate, + LocalDate validityEndDate, Course course ) { this.id = UUID.randomUUID(); @@ -42,6 +47,8 @@ public Curriculum( this.internshipCourseLoad = internshipCourseLoad; this.internshipStartCriteria = internshipStartCriteria; this.internshipAllowedActivities = internshipAllowedActivities; + this.validityStartDate = validityStartDate; + this.validityEndDate = validityEndDate; this.status = EntityStatus.ENABLED; this.course = course; } diff --git a/src/main/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/curriculum/CurriculumCreateDto.java b/src/main/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/curriculum/CurriculumCreateDto.java index c4b20346..2c06b4d4 100644 --- a/src/main/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/curriculum/CurriculumCreateDto.java +++ b/src/main/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/curriculum/CurriculumCreateDto.java @@ -1,10 +1,12 @@ package br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.curriculum; import lombok.Value; +import org.springframework.format.annotation.DateTimeFormat; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Positive; +import java.time.LocalDate; @Value public class CurriculumCreateDto { @@ -23,4 +25,9 @@ public class CurriculumCreateDto { @NotNull @NotBlank String internshipAllowedActivities; + @NotNull + @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) + LocalDate validityStartDate; + @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) + LocalDate validityEndDate; } diff --git a/src/main/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/curriculum/CurriculumDto.java b/src/main/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/curriculum/CurriculumDto.java index 3fe2789e..2fe16982 100644 --- a/src/main/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/curriculum/CurriculumDto.java +++ b/src/main/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/curriculum/CurriculumDto.java @@ -4,6 +4,7 @@ import br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.course.CourseDto; import lombok.Value; +import java.time.LocalDate; import java.util.UUID; @Value @@ -14,6 +15,8 @@ public class CurriculumDto { Integer internshipCourseLoad; String internshipStartCriteria; String internshipAllowedActivities; + LocalDate validityStartDate; + LocalDate validityEndDate; CourseDto course; EntityStatus status; } diff --git a/src/main/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/curriculum/CurriculumOverlapVerification.java b/src/main/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/curriculum/CurriculumOverlapVerification.java new file mode 100644 index 00000000..e3fef760 --- /dev/null +++ b/src/main/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/curriculum/CurriculumOverlapVerification.java @@ -0,0 +1,88 @@ +package br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.curriculum; + +import br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.common.exceptions.DateChronologyException; +import br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.common.exceptions.TimeOverlayException; + +import java.time.LocalDate; +import java.util.List; +import java.util.UUID; + +public class CurriculumOverlapVerification { + + public boolean checkingAddCurriculum(List curriculums, CurriculumCreateDto curriculum){ + var validityStartDate = curriculum.getValidityStartDate(); + var validityEndDate = curriculum.getValidityEndDate(); + if(validityEndDate != null) { + verifyDatesChronology(validityStartDate, validityEndDate); + for(Curriculum c : curriculums){ + var comparingStartDate = c.getValidityStartDate(); + var comparingEndDate = c.getValidityEndDate(); + if(comparingEndDate != null && ( + (validityStartDate.isAfter(comparingStartDate) && validityStartDate.isBefore(comparingEndDate)) || (validityEndDate.isAfter(comparingStartDate) && validityEndDate.isBefore(comparingEndDate)) || validityStartDate.isEqual(comparingStartDate) || validityStartDate.isEqual(comparingEndDate) || validityEndDate.isEqual(comparingStartDate) || validityEndDate.isEqual(comparingEndDate)) + ){ + throw new TimeOverlayException(validityStartDate,validityEndDate,comparingStartDate,comparingEndDate); + } + else if( + comparingEndDate == null && (validityStartDate.isAfter(comparingStartDate) || validityEndDate.isAfter(comparingStartDate) || validityStartDate.isEqual(comparingStartDate) || validityEndDate.isEqual(comparingStartDate)) + ){ + throw new TimeOverlayException(validityStartDate,validityEndDate,comparingStartDate,LocalDate.now()); + } + } + } + else if(!(curriculums.isEmpty())){ + for(Curriculum c : curriculums){ + var comparingStartDate = c.getValidityStartDate(); + var comparingEndDate = c.getValidityEndDate(); + if(comparingEndDate == null){ + throw new TimeOverlayException(validityStartDate, LocalDate.now(),comparingStartDate,LocalDate.now()); + } + if( + validityStartDate.isBefore(comparingStartDate) || validityStartDate.isBefore(comparingEndDate) || validityStartDate.isEqual(comparingStartDate) || validityStartDate.isEqual(comparingEndDate) + ){ + throw new TimeOverlayException(validityStartDate,validityEndDate,comparingStartDate,comparingEndDate); + } + } + } + return true; + } + + public boolean checkingUpdateCurriculum(List curriculums, CurriculumCreateDto curriculum, UUID curriculumID){ + var validityStartDate = curriculum.getValidityStartDate(); + var validityEndDate = curriculum.getValidityEndDate(); + if(validityEndDate != null) { + verifyDatesChronology(validityStartDate, validityEndDate); + for(Curriculum c : curriculums){ + var comparingStartDate = c.getValidityStartDate(); + var comparingEndDate = c.getValidityEndDate(); + if( + (comparingEndDate != null && c.getId() != curriculumID) && ((validityStartDate.isAfter(comparingStartDate) && validityStartDate.isBefore(comparingEndDate)) || (validityEndDate.isAfter(comparingStartDate) && validityEndDate.isBefore(comparingEndDate)) || validityStartDate.isEqual(comparingStartDate) || validityStartDate.isEqual(comparingEndDate) || validityEndDate.isEqual(comparingStartDate) || validityEndDate.isEqual(comparingEndDate)) + ){ + throw new TimeOverlayException(validityStartDate, validityEndDate, comparingStartDate, comparingEndDate); + } + else if ( + (comparingEndDate == null && c.getId() != curriculumID) && (validityStartDate.isAfter(comparingStartDate) || validityEndDate.isAfter(comparingStartDate) || validityStartDate.isEqual(comparingStartDate) || validityEndDate.isEqual(comparingStartDate)) + ){ + throw new TimeOverlayException(validityStartDate, validityEndDate,comparingStartDate,LocalDate.now()); + } + } + } + else { + for(Curriculum c : curriculums){ + var comparingStartDate = c.getValidityStartDate(); + var comparingEndDate = c.getValidityEndDate(); + if( + c.getId() != curriculumID && (validityStartDate.isBefore(comparingStartDate) || validityStartDate.isBefore(comparingEndDate) || validityStartDate.isEqual(comparingStartDate) || validityStartDate.isEqual(comparingEndDate)) + ){ + throw new TimeOverlayException(validityStartDate,LocalDate.now(),comparingStartDate,comparingEndDate); + } + } + } + return true; + } + + private void verifyDatesChronology(LocalDate startDate, LocalDate endDate){ + if(startDate.isAfter(endDate) || startDate.isEqual(endDate)){ + throw new DateChronologyException(startDate, endDate); + } + } +} diff --git a/src/main/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/curriculum/CurriculumServiceImpl.java b/src/main/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/curriculum/CurriculumServiceImpl.java index 2df82fd9..84e66e3c 100644 --- a/src/main/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/curriculum/CurriculumServiceImpl.java +++ b/src/main/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/curriculum/CurriculumServiceImpl.java @@ -2,8 +2,7 @@ import br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.common.dtos.EntityUpdateStatusDto; import br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.common.enums.EntityStatus; -import br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.common.exceptions.ResourceName; -import br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.common.exceptions.ResourceNotFoundException; +import br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.common.exceptions.*; import br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.course.Course; import br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.course.CourseService; import org.springframework.beans.factory.annotation.Autowired; @@ -17,6 +16,7 @@ public class CurriculumServiceImpl implements CurriculumService { private CurriculumRepository curriculumRepository; private CourseService courseService; + private CurriculumOverlapVerification curriculumOverlapVerification; public CurriculumServiceImpl(CurriculumRepository curriculumRepository) { this.curriculumRepository = curriculumRepository; @@ -30,6 +30,8 @@ public void setCourseService(CourseService courseService) { @Override public Curriculum create(UUID courseId, CurriculumCreateDto curriculumCreateDto) { Course course = courseService.findById(courseId); + List curriculumList = findAll(courseId); + curriculumOverlapVerification.checkingAddCurriculum(curriculumList, curriculumCreateDto); return curriculumRepository.save(new Curriculum( curriculumCreateDto.getCode(), @@ -37,6 +39,8 @@ public Curriculum create(UUID courseId, CurriculumCreateDto curriculumCreateDto) curriculumCreateDto.getInternshipCourseLoad(), curriculumCreateDto.getInternshipStartCriteria(), curriculumCreateDto.getInternshipAllowedActivities(), + curriculumCreateDto.getValidityStartDate(), + curriculumCreateDto.getValidityEndDate(), course )); } @@ -63,6 +67,9 @@ public Curriculum findByCurriculumId(UUID curriculumId) { public Curriculum update(UUID courseId, UUID curriculumId, CurriculumCreateDto curriculumCreateDto) { Course course = courseService.findById(courseId); getCurriculum(courseId, curriculumId); + List curriculumList = findAll(courseId); + + curriculumOverlapVerification.checkingUpdateCurriculum(curriculumList, curriculumCreateDto, curriculumId); Curriculum curriculumUpdated = new Curriculum( curriculumCreateDto.getCode(), @@ -70,6 +77,8 @@ public Curriculum update(UUID courseId, UUID curriculumId, CurriculumCreateDto c curriculumCreateDto.getInternshipCourseLoad(), curriculumCreateDto.getInternshipStartCriteria(), curriculumCreateDto.getInternshipAllowedActivities(), + curriculumCreateDto.getValidityStartDate(), + curriculumCreateDto.getValidityEndDate(), course ); curriculumUpdated.setId(curriculumId); diff --git a/src/main/resources/db/migration/V6__create_curriculums_table.sql b/src/main/resources/db/migration/V6__create_curriculums_table.sql index 3eaa50e2..079c5214 100644 --- a/src/main/resources/db/migration/V6__create_curriculums_table.sql +++ b/src/main/resources/db/migration/V6__create_curriculums_table.sql @@ -5,6 +5,8 @@ CREATE TABLE curriculums( internship_course_load INT NOT NULL, internship_start_criteria VARCHAR NOT NULL, internship_allowed_activities VARCHAR NOT NULL, + validity_start_date DATE NOT NULL, + validity_end_date DATE, status VARCHAR NOT NULL, course_id UUID NOT NULL, CONSTRAINT curriculums_pk PRIMARY KEY (id), diff --git a/src/test/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/curriculum/CurriculumOverlapVerificationTest.java b/src/test/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/curriculum/CurriculumOverlapVerificationTest.java new file mode 100644 index 00000000..2c8563e2 --- /dev/null +++ b/src/test/java/br/edu/ifsp/ifspcodelab/gestaoestagiosbackend/curriculum/CurriculumOverlapVerificationTest.java @@ -0,0 +1,816 @@ +package br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.curriculum; + +import br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.common.exceptions.DateChronologyException; +import br.edu.ifsp.ifspcodelab.gestaoestagiosbackend.common.exceptions.TimeOverlayException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.UUID; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; + + +class CurriculumOverlapVerificationTest { + private CurriculumOverlapVerification curriculumOverlapVerification; + + @BeforeEach + void setUp(){ + curriculumOverlapVerification = new CurriculumOverlapVerification(); + } + + + //Uma lista vazia e adição de um novo currículo com data de início e fim definidas + @Test + @DisplayName("Lista vazia, Adição de novo currículo, Data de início e fim definidos, Data de início anterior a data de fim") + void checkingAddCurriculumEmptyList() { + var curriculumList = new ArrayList(); + var curriculum = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MIN, + LocalDate.MAX + ); + + Boolean result = curriculumOverlapVerification.checkingAddCurriculum(curriculumList,curriculum); + + assertThat(result).isTrue(); + } + + @Test + @DisplayName("Lista vazia, Adição de novo currículo, Data de início e fim definidos, Data de início depois da data de fim") + void checkingAddCurriculumEmptyWithStartDateAfterEndDate() { + var curriculumList = new ArrayList(); + var curriculum = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MAX, + LocalDate.MIN + ); + + assertThatThrownBy(() -> curriculumOverlapVerification.checkingAddCurriculum(curriculumList,curriculum)) + .isInstanceOf(DateChronologyException.class); + } + + //Uma lista vazia e adição de um novo currículo com apenas data de início definida + @Test + @DisplayName("Lista vazia, Adição de novo currículo, Apenas data de início definida") + void checkingAddCurriculumEmptyListOnlyStartDateDefinied() { + var curriculumList = new ArrayList(); + var curriculum = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MIN, + null + ); + + Boolean result = curriculumOverlapVerification.checkingAddCurriculum(curriculumList,curriculum); + + assertThat(result).isTrue(); + } + + //Uma lista com um ou mais currículos, todos com data de início e fim definidas e adição de um novo currículo com data de início e fim definidas, sem sobreposição + @Test + @DisplayName("Lista não vazia com currículos com datas definidas, Adição de novo currículo, Data de início e fim definidos, Data de início anterior a data de fim") + void checkingAddCurriculumNotEmptyList() { + var curriculumSaved = new Curriculum(); + curriculumSaved.setValidityStartDate(LocalDate.MIN); + curriculumSaved.setValidityEndDate(LocalDate.MIN.plusMonths(12)); + var curriculumList = new ArrayList(); + curriculumList.add(curriculumSaved); + + var curriculum = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MAX.minusMonths(12), + LocalDate.MAX + ); + + Boolean result = curriculumOverlapVerification.checkingAddCurriculum(curriculumList,curriculum); + + assertThat(result).isTrue(); + } + + //Uma lista com um ou mais currículos, todos com data de início e fim definidas e adição de um novo currículo com apenas data de início definida, sem sobreposição + @Test + @DisplayName("Lista não vazia com currículos com datas definidas, Adição de novo currículo, Apenas data de início") + void checkingAddCurriculumNotEmptyListOnlyStartDateDefined() { + var curriculumSaved = new Curriculum(); + curriculumSaved.setValidityStartDate(LocalDate.MIN); + curriculumSaved.setValidityEndDate(LocalDate.MIN.plusMonths(12)); + var curriculumList = new ArrayList(); + curriculumList.add(curriculumSaved); + + var curriculum = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MAX.minusMonths(12), + null + ); + + Boolean result = curriculumOverlapVerification.checkingAddCurriculum(curriculumList,curriculum); + + assertThat(result).isTrue(); + } + + //Uma lista com currículo com apenas data de início definida, adição de um novo currículo com data de início e fim definidas, sem sobreposição + @Test + @DisplayName("Lista não vazia com um curículo com apenas data de início definida, Adição de novo currículo, Datas de início e fim definidas") + void checkingAddCurriculumNotEmptyListOneWithOnlyStartDateDefined() { + var curriculumSaved = new Curriculum(); + curriculumSaved.setValidityStartDate(LocalDate.MAX); + var curriculumList = new ArrayList(); + curriculumList.add(curriculumSaved); + + var curriculum = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MIN, + LocalDate.MIN.plusMonths(12) + ); + + Boolean result = curriculumOverlapVerification.checkingAddCurriculum(curriculumList,curriculum); + + assertThat(result).isTrue(); + } + + //Uma lista com um ou mais currículos, um deles com apenas data de início definida, os outros com ambas as datas definidas, e adição de um novo currículo com apenas data de início definida + @Test + @DisplayName("Lista não vazia com um curículo com apenas data de início definida, Adição de novo currículo, Apenas data de início definida") + void checkingAddCurriculumNotEmptyListOneWithOnlyStartDateDefinedOverlay() { + var curriculumSaved = new Curriculum(); + curriculumSaved.setValidityStartDate(LocalDate.MAX); + var curriculumList = new ArrayList(); + curriculumList.add(curriculumSaved); + + var curriculum = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MIN, + null + ); + + assertThatThrownBy(() -> curriculumOverlapVerification.checkingAddCurriculum(curriculumList,curriculum)) + .isInstanceOf(TimeOverlayException.class); + } + + //Uma lista com um ou mais currículos, todos com data de início e fim definidas e adição de um novo currículo com data de início e fim definidas, com sobreposição + @Test + @DisplayName("Lista não vazia com curículo com data de início e fim definidas, Adição de novo currículo, Datas de início e fim definidas, Sobreposição") + void checkingAddCurriculumNotEmptyListDatesDefinedOverlay() { + var curriculumSaved = new Curriculum(); + curriculumSaved.setValidityStartDate(LocalDate.MIN); + curriculumSaved.setValidityEndDate(LocalDate.MAX); + var curriculumList = new ArrayList(); + curriculumList.add(curriculumSaved); + + var curriculum = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MIN.plusMonths(12), + LocalDate.MAX.minusMonths(12) + ); + + assertThatThrownBy(() -> curriculumOverlapVerification.checkingAddCurriculum(curriculumList,curriculum)) + .isInstanceOf(TimeOverlayException.class); + } + + //Uma lista com um ou mais currículos, todos com data de início e fim definidas e adição de um novo currículo com apenas data de início definida, com sobreposição + @Test + @DisplayName("Lista não vazia com curículo com data de início e fim definidas, Adição de novo currículo, Apenas data de início definida, Sobreposição") + void checkingAddCurriculumNotEmptyListOnlyStartDateDefinedOverlay() { + var curriculumSaved = new Curriculum(); + curriculumSaved.setValidityStartDate(LocalDate.MIN); + curriculumSaved.setValidityEndDate(LocalDate.MAX); + var curriculumList = new ArrayList(); + curriculumList.add(curriculumSaved); + + var curriculum = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MIN.plusMonths(12), + null + ); + + assertThatThrownBy(() -> curriculumOverlapVerification.checkingAddCurriculum(curriculumList,curriculum)) + .isInstanceOf(TimeOverlayException.class); + } + + //Uma lista com currículo com apenas data de início definida, adição de um novo currículo com data de início e fim definidas, com sobreposição + @Test + @DisplayName("Lista não vazia com curículo com apenas data de início definida, Adição de novo currículo, Data de início e fim definidas, Sobreposição") + void checkingAddCurriculumNotEmptyListOneWithOnlySartDateDefinedOverlay() { + var curriculumSaved = new Curriculum(); + curriculumSaved.setValidityStartDate(LocalDate.MIN); + var curriculumList = new ArrayList(); + curriculumList.add(curriculumSaved); + + var curriculum = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MIN.plusMonths(12), + LocalDate.MAX + ); + + assertThatThrownBy(() -> curriculumOverlapVerification.checkingAddCurriculum(curriculumList,curriculum)) + .isInstanceOf(TimeOverlayException.class); + } + + //Uma lista com um ou mais currículos, todos com data de início e fim definidas e adição de um novo currículo com apenas data de início definida no mesmo dia de algum currículo já salvo, com sobreposição + @Test + @DisplayName("Lista não vazia com curículo com data de início e fim definidas, Adição de novo currículo, Apenas data de início definida, Sobreposição") + void checkingAddCurriculumNotEmptyListStartDateEqualOverlay() { + var curriculumSaved = new Curriculum(); + curriculumSaved.setValidityStartDate(LocalDate.MIN); + curriculumSaved.setValidityEndDate(LocalDate.MAX); + var curriculumList = new ArrayList(); + curriculumList.add(curriculumSaved); + + var curriculum = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MIN, + null + ); + + assertThatThrownBy(() -> curriculumOverlapVerification.checkingAddCurriculum(curriculumList,curriculum)) + .isInstanceOf(TimeOverlayException.class); + } + + //Uma lista com um ou mais currículos, todos com data de início e fim definidas e adição de um novo currículo com apenas data de início definida no mesmo dia de algum currículo já salvo, com sobreposição + @Test + @DisplayName("Lista não vazia com curículo com data de início e fim definidas, Adição de novo currículo, Apenas data de início definida, Sobreposição de mesma Data") + void checkingAddCurriculumNotEmptyListStartOrEndDateEqualOverlay() { + var curriculumSaved = new Curriculum(); + curriculumSaved.setValidityStartDate(LocalDate.MIN.plusMonths(12)); + curriculumSaved.setValidityEndDate(LocalDate.MAX); + var curriculumList = new ArrayList(); + curriculumList.add(curriculumSaved); + + var curriculum = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MIN, + LocalDate.MIN.plusMonths(12) + ); + + assertThatThrownBy(() -> curriculumOverlapVerification.checkingAddCurriculum(curriculumList,curriculum)) + .isInstanceOf(TimeOverlayException.class); + } + + //Uma lista com um ou mais currículos, um deles com apenas a data de início definida e adição de um novo currículo com data de início e fim definidas, data de fim no mesmo dia do currículo já salvo, com sobreposição + @Test + @DisplayName("Lista não vazia com curículo com apenas data de início definida, Adição de novo currículo, Data de início e fim definidas, Sobreposição de mesma data") + void checkingAddCurriculumNotEmptyListEndDateSameOverlay() { + var curriculumSaved = new Curriculum(); + curriculumSaved.setValidityStartDate(LocalDate.MIN.plusMonths(12)); + var curriculumList = new ArrayList(); + curriculumList.add(curriculumSaved); + + var curriculum = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MIN, + LocalDate.MIN.plusMonths(12) + ); + + assertThatThrownBy(() -> curriculumOverlapVerification.checkingAddCurriculum(curriculumList,curriculum)) + .isInstanceOf(TimeOverlayException.class); + } + + //Uma lista com um ou mais currículos, todos com data de início e fim definidas e adição de um novo currículo com apenas data de início definida no mesmo dia de fim de um currículo já salvo, com sobreposição + @Test + @DisplayName("Lista não vazia com curículo com data de início e fim definidas, Adição de novo currículo, Apenas data de início definida, Sobreposição de mesma data") + void checkingAddCurriculumNotEmptyListEndDateEqualOverlay() { + var curriculumSaved = new Curriculum(); + curriculumSaved.setValidityStartDate(LocalDate.MIN); + curriculumSaved.setValidityEndDate(LocalDate.MAX); + var curriculumList = new ArrayList(); + curriculumList.add(curriculumSaved); + + var curriculum = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MAX, + null + ); + + assertThatThrownBy(() -> curriculumOverlapVerification.checkingAddCurriculum(curriculumList,curriculum)) + .isInstanceOf(TimeOverlayException.class); + } + + //Lista vazia, Adição de um novo currículo com as datas de início e fim definidas para o mesmo dia + @Test + @DisplayName("Lista vazia, Adição de novo currículo, Datas definidas iguais, Sobreposição de mesma data") + void checkingAddCurriculumEmptyListStartDateEqualsEndDate() { + var curriculumList = new ArrayList(); + var curriculum = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MAX, + LocalDate.MAX + ); + + assertThatThrownBy(() -> curriculumOverlapVerification.checkingAddCurriculum(curriculumList,curriculum)) + .isInstanceOf(DateChronologyException.class); + } + + //Uma lista com um ou mais currículos, todos com data de início e fim definidas e adição de um novo currículo com data de início e fim definidas, datas coincidentes, com sobreposição + @Test + @DisplayName("Lista não vazia com currículos com datas definidas, Adição de novo currículo, Data de início e fim definidos, Data de início coincidente, Sobreposição") + void checkingAddCurriculumNotEmptyListSameDatesOverlay() { + var curriculumSaved = new Curriculum(); + curriculumSaved.setValidityStartDate(LocalDate.MIN); + curriculumSaved.setValidityEndDate(LocalDate.MIN.plusMonths(12)); + var curriculumList = new ArrayList(); + curriculumList.add(curriculumSaved); + + var curriculum = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MIN.plusMonths(12), + LocalDate.MAX + ); + + assertThatThrownBy(() -> curriculumOverlapVerification.checkingAddCurriculum(curriculumList,curriculum)) + .isInstanceOf(TimeOverlayException.class); + } + + //Uma lista com currículo com apenas data de início definida, adição de um novo currículo com data de início e fim definidas, data de fim coincidente, com sobreposição + @Test + @DisplayName("Lista não vazia com curículo com apenas data de início definida, Adição de novo currículo, Data de início e fim definidas, Datas coincidentes, Sobreposição") + void checkingAddCurriculumNotEmptyListEndDateEqualsOtherDateOverlay() { + var curriculumSaved = new Curriculum(); + curriculumSaved.setValidityStartDate(LocalDate.MAX.minusMonths(12)); + var curriculumList = new ArrayList(); + curriculumList.add(curriculumSaved); + + var curriculum = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MIN, + LocalDate.MAX.minusMonths(12) + ); + + assertThatThrownBy(() -> curriculumOverlapVerification.checkingAddCurriculum(curriculumList,curriculum)) + .isInstanceOf(TimeOverlayException.class); + } + + //Uma lista com dois currículos: ambos com data de início e fim definidas; Atualização de um deles com data de início e fim definidas, sem sobreposição + @Test + @DisplayName("Lista não vazia com currículos com datas definidas, Atualização de um currículo, Data de início e fim definidos, Data de início anterior a data de fim") + void checkingUpdateCurriculumAllDatesDefined() { + var curriculum = new Curriculum(); + curriculum.setId(UUID.fromString("32c4dcbe-9769-4cc5-a1fb-2bcc9d38e12f")); + curriculum.setValidityStartDate(LocalDate.MIN); + curriculum.setValidityEndDate(LocalDate.MIN.plusMonths(12)); + var curriculumToBeUpdated = new Curriculum(); + curriculumToBeUpdated.setId(UUID.fromString("30472217-b2eb-43dd-9d0c-1a2c536bb56d")); + curriculumToBeUpdated.setValidityStartDate(LocalDate.MIN.plusMonths(12).plusDays(1)); + curriculumToBeUpdated.setValidityEndDate(LocalDate.MAX); + var curriculumList = new ArrayList(); + curriculumList.add(curriculum); + curriculumList.add(curriculumToBeUpdated); + var curriculumUpdated = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MAX.minusMonths(12), + LocalDate.MAX + ); + + Boolean result = curriculumOverlapVerification.checkingUpdateCurriculum(curriculumList,curriculumUpdated,curriculumToBeUpdated.getId()); + + assertThat(result).isTrue(); + } + + //Uma lista com dois currículos: ambos com data de início e fim definidas; Atualização de um deles com data de início e fim definidas, datas fora de ordem + @Test + @DisplayName("Lista não vazia com currículos com datas definidas, Atualização de um currículo, Data de início e fim definidos, Data de início depois da data de fim") + void checkingUpdateCurriculumAllDatesDefinedStartAfterEnd() { + var curriculum = new Curriculum(); + curriculum.setId(UUID.fromString("32c4dcbe-9769-4cc5-a1fb-2bcc9d38e12f")); + curriculum.setValidityStartDate(LocalDate.MIN); + curriculum.setValidityEndDate(LocalDate.MIN.plusMonths(12)); + var curriculumToBeUpdated = new Curriculum(); + curriculumToBeUpdated.setId(UUID.fromString("30472217-b2eb-43dd-9d0c-1a2c536bb56d")); + curriculumToBeUpdated.setValidityStartDate(LocalDate.MIN.plusMonths(12).plusDays(1)); + curriculumToBeUpdated.setValidityEndDate(LocalDate.MAX); + var curriculumList = new ArrayList(); + curriculumList.add(curriculum); + curriculumList.add(curriculumToBeUpdated); + var curriculumUpdated = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MAX, + LocalDate.MAX.minusMonths(12) + ); + + assertThatThrownBy(() -> curriculumOverlapVerification.checkingUpdateCurriculum(curriculumList,curriculumUpdated,curriculumToBeUpdated.getId())) + .isInstanceOf(DateChronologyException.class); + } + + //Uma lista com dois currículos: ambos com data de início e fim definidas; Atualização de um deles com apenas data de início definida, sem sobreposição + @Test + @DisplayName("Lista não vazia com currículos com datas definidas, Atualização de um currículo, Apenas data de início") + void checkingUpdateCurriculumAllDatesDefinedUpdateTOOnlyStartDate() { + var curriculum = new Curriculum(); + curriculum.setId(UUID.fromString("32c4dcbe-9769-4cc5-a1fb-2bcc9d38e12f")); + curriculum.setValidityStartDate(LocalDate.MIN); + curriculum.setValidityEndDate(LocalDate.MIN.plusMonths(12)); + var curriculumToBeUpdated = new Curriculum(); + curriculumToBeUpdated.setId(UUID.fromString("30472217-b2eb-43dd-9d0c-1a2c536bb56d")); + curriculumToBeUpdated.setValidityStartDate(LocalDate.MIN.plusMonths(12).plusDays(1)); + curriculumToBeUpdated.setValidityEndDate(LocalDate.MAX); + var curriculumList = new ArrayList(); + curriculumList.add(curriculum); + curriculumList.add(curriculumToBeUpdated); + var curriculumUpdated = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MAX.minusMonths(12), + null + ); + + Boolean result = curriculumOverlapVerification.checkingUpdateCurriculum(curriculumList,curriculumUpdated,curriculumToBeUpdated.getId()); + + assertThat(result).isTrue(); + } + + //Uma lista com dois currículos: um com apenas data de início definida, outro com ambas datas definidas; Atualização do currículo com ambas as datas, sem sobreposição + @Test + @DisplayName("Lista não vazia com um curículo com apenas data de início definida, Atualização de currículo, Datas de início e fim definidas") + void checkingUpdateCurriculumUpdatingBothDates() { + var curriculum = new Curriculum(); + curriculum.setId(UUID.fromString("32c4dcbe-9769-4cc5-a1fb-2bcc9d38e12f")); + curriculum.setValidityStartDate(LocalDate.MAX); + var curriculumToBeUpdated = new Curriculum(); + curriculumToBeUpdated.setId(UUID.fromString("30472217-b2eb-43dd-9d0c-1a2c536bb56d")); + curriculumToBeUpdated.setValidityStartDate(LocalDate.MIN); + curriculumToBeUpdated.setValidityEndDate(LocalDate.MIN.plusMonths(12)); + var curriculumList = new ArrayList(); + curriculumList.add(curriculum); + curriculumList.add(curriculumToBeUpdated); + var curriculumUpdated = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MIN.plusMonths(10), + LocalDate.MAX.minusDays(1) + ); + + Boolean result = curriculumOverlapVerification.checkingUpdateCurriculum(curriculumList,curriculumUpdated,curriculumToBeUpdated.getId()); + + assertThat(result).isTrue(); + } + + //Uma lista com dois currículos: um com apenas data de início definida, outro com ambas datas definidas; Atualização do currículo com apenas data inicial, definindo ambas as datas; sem sobreposição + @Test + @DisplayName("Lista não vazia com um curículo com apenas data de início definida, Atualização de currículo, Definindo ambas as datas") + void checkingUpdateCurriculumUpdatingOnlyStartDateToBoth() { + var curriculum = new Curriculum(); + curriculum.setId(UUID.fromString("32c4dcbe-9769-4cc5-a1fb-2bcc9d38e12f")); + curriculum.setValidityStartDate(LocalDate.MIN); + curriculum.setValidityEndDate(LocalDate.MIN.plusMonths(12)); + var curriculumToBeUpdated = new Curriculum(); + curriculumToBeUpdated.setId(UUID.fromString("30472217-b2eb-43dd-9d0c-1a2c536bb56d")); + curriculumToBeUpdated.setValidityStartDate(LocalDate.MIN.plusMonths(12).plusDays(1)); + var curriculumList = new ArrayList(); + curriculumList.add(curriculum); + curriculumList.add(curriculumToBeUpdated); + var curriculumUpdated = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MIN.plusMonths(15), + LocalDate.MAX + ); + + Boolean result = curriculumOverlapVerification.checkingUpdateCurriculum(curriculumList,curriculumUpdated,curriculumToBeUpdated.getId()); + + assertThat(result).isTrue(); + } + + //Uma lista com dois currículos: um com apenas data de início definida, outro com ambas datas definidas; Atualização do currículo com apenas data inicial, atualizando a data de início; sem sobreposição + @Test + @DisplayName("Lista não vazia com um curículo com apenas data de início definida, Atualização de currículo, Apenas data de início") + void checkingUpdateCurriculumUpdatingOnlyStartDate() { + var curriculum = new Curriculum(); + curriculum.setId(UUID.fromString("32c4dcbe-9769-4cc5-a1fb-2bcc9d38e12f")); + curriculum.setValidityStartDate(LocalDate.MIN); + curriculum.setValidityEndDate(LocalDate.MIN.plusMonths(12)); + var curriculumToBeUpdated = new Curriculum(); + curriculumToBeUpdated.setId(UUID.fromString("30472217-b2eb-43dd-9d0c-1a2c536bb56d")); + curriculumToBeUpdated.setValidityStartDate(LocalDate.MIN.plusMonths(12).plusDays(1)); + var curriculumList = new ArrayList(); + curriculumList.add(curriculum); + curriculumList.add(curriculumToBeUpdated); + var curriculumUpdated = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MAX, + null + ); + + Boolean result = curriculumOverlapVerification.checkingUpdateCurriculum(curriculumList,curriculumUpdated,curriculumToBeUpdated.getId()); + + assertThat(result).isTrue(); + } + + //Uma lista com dois currículos: ambos com data de início e fim definidas; Atualização de um deles com data de início e fim definidas, com sobreposição + @Test + @DisplayName("Lista não vazia com currículos com datas definidas, Atualização de um currículo, Data de início e fim definidos, Data de início anterior a data de fim, Sobreposição") + void checkingUpdateCurriculumAllDatesDefinedOverlay() { + var curriculum = new Curriculum(); + curriculum.setId(UUID.fromString("32c4dcbe-9769-4cc5-a1fb-2bcc9d38e12f")); + curriculum.setValidityStartDate(LocalDate.MIN); + curriculum.setValidityEndDate(LocalDate.MIN.plusMonths(12)); + var curriculumToBeUpdated = new Curriculum(); + curriculumToBeUpdated.setId(UUID.fromString("30472217-b2eb-43dd-9d0c-1a2c536bb56d")); + curriculumToBeUpdated.setValidityStartDate(LocalDate.MIN.plusMonths(12).plusDays(1)); + curriculumToBeUpdated.setValidityEndDate(LocalDate.MAX); + var curriculumList = new ArrayList(); + curriculumList.add(curriculum); + curriculumList.add(curriculumToBeUpdated); + var curriculumUpdated = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MIN.plusMonths(10), + LocalDate.MAX + ); + + assertThatThrownBy(() -> curriculumOverlapVerification.checkingUpdateCurriculum(curriculumList,curriculumUpdated,curriculumToBeUpdated.getId())) + .isInstanceOf(TimeOverlayException.class); + } + + //Uma lista com dois currículos: ambos com data de início e fim definidas; Atualização de um deles com data de início e fim definidas, mesma data + @Test + @DisplayName("Lista não vazia com currículos com datas definidas, Atualização de um currículo, Data de início e fim definidos, Data de início igual a data de fim") + void checkingUpdateCurriculumAllDatesDefinedStartDateEqualsEndDate() { + var curriculum = new Curriculum(); + curriculum.setId(UUID.fromString("32c4dcbe-9769-4cc5-a1fb-2bcc9d38e12f")); + curriculum.setValidityStartDate(LocalDate.MIN); + curriculum.setValidityEndDate(LocalDate.MIN.plusMonths(12)); + var curriculumToBeUpdated = new Curriculum(); + curriculumToBeUpdated.setId(UUID.fromString("30472217-b2eb-43dd-9d0c-1a2c536bb56d")); + curriculumToBeUpdated.setValidityStartDate(LocalDate.MIN.plusMonths(12).plusDays(1)); + curriculumToBeUpdated.setValidityEndDate(LocalDate.MAX); + var curriculumList = new ArrayList(); + curriculumList.add(curriculum); + curriculumList.add(curriculumToBeUpdated); + var curriculumUpdated = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MAX, + LocalDate.MAX + ); + + assertThatThrownBy(() -> curriculumOverlapVerification.checkingUpdateCurriculum(curriculumList,curriculumUpdated,curriculumToBeUpdated.getId())) + .isInstanceOf(DateChronologyException.class); + } + + //Uma lista com dois currículos: ambos com data de início e fim definidas; Atualização de um deles com apenas data de início definida, com sobreposição + @Test + @DisplayName("Lista não vazia com currículos com datas definidas, Atualização de um currículo, Apenas data de início, Sobreposição") + void checkingUpdateCurriculumAllDatesDefinedUpdateTOOnlyStartDateOvelay() { + var curriculum = new Curriculum(); + curriculum.setId(UUID.fromString("32c4dcbe-9769-4cc5-a1fb-2bcc9d38e12f")); + curriculum.setValidityStartDate(LocalDate.MIN); + curriculum.setValidityEndDate(LocalDate.MIN.plusMonths(12)); + var curriculumToBeUpdated = new Curriculum(); + curriculumToBeUpdated.setId(UUID.fromString("30472217-b2eb-43dd-9d0c-1a2c536bb56d")); + curriculumToBeUpdated.setValidityStartDate(LocalDate.MIN.plusMonths(12).plusDays(1)); + curriculumToBeUpdated.setValidityEndDate(LocalDate.MAX); + var curriculumList = new ArrayList(); + curriculumList.add(curriculum); + curriculumList.add(curriculumToBeUpdated); + var curriculumUpdated = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MIN, + null + ); + + assertThatThrownBy(() -> curriculumOverlapVerification.checkingUpdateCurriculum(curriculumList,curriculumUpdated,curriculumToBeUpdated.getId())) + .isInstanceOf(TimeOverlayException.class); + } + + //Uma lista com dois currículos: um com apenas data de início definida, outro com ambas datas definidas; Atualização do currículo com ambas as datas, com sobreposição + @Test + @DisplayName("Lista não vazia com um curículo com apenas data de início definida, Atualização de currículo, Datas de início e fim definidas, Sobreposição") + void checkingUpdateCurriculumUpdatingBothDatesOverlay() { + var curriculum = new Curriculum(); + curriculum.setId(UUID.fromString("32c4dcbe-9769-4cc5-a1fb-2bcc9d38e12f")); + curriculum.setValidityStartDate(LocalDate.MAX.minusDays(1)); + var curriculumToBeUpdated = new Curriculum(); + curriculumToBeUpdated.setId(UUID.fromString("30472217-b2eb-43dd-9d0c-1a2c536bb56d")); + curriculumToBeUpdated.setValidityStartDate(LocalDate.MIN); + curriculumToBeUpdated.setValidityEndDate(LocalDate.MIN.plusMonths(12)); + var curriculumList = new ArrayList(); + curriculumList.add(curriculum); + curriculumList.add(curriculumToBeUpdated); + var curriculumUpdated = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MIN.plusMonths(10), + LocalDate.MAX + ); + + assertThatThrownBy(() -> curriculumOverlapVerification.checkingUpdateCurriculum(curriculumList,curriculumUpdated,curriculumToBeUpdated.getId())) + .isInstanceOf(TimeOverlayException.class); + } + + //Uma lista com dois currículos: um com apenas data de início definida, outro com ambas datas definidas; Atualização do currículo com apenas data inicial, definindo ambas as datas; com sobreposição + @Test + @DisplayName("Lista não vazia com um curículo com apenas data de início definida, Atualização de currículo, Definindo ambas as datas, Sobreposição") + void checkingUpdateCurriculumUpdatingOnlyStartDateToBothOverlay() { + var curriculum = new Curriculum(); + curriculum.setId(UUID.fromString("32c4dcbe-9769-4cc5-a1fb-2bcc9d38e12f")); + curriculum.setValidityStartDate(LocalDate.MIN); + curriculum.setValidityEndDate(LocalDate.MIN.plusMonths(12)); + var curriculumToBeUpdated = new Curriculum(); + curriculumToBeUpdated.setId(UUID.fromString("30472217-b2eb-43dd-9d0c-1a2c536bb56d")); + curriculumToBeUpdated.setValidityStartDate(LocalDate.MIN.plusMonths(12).plusDays(1)); + var curriculumList = new ArrayList(); + curriculumList.add(curriculum); + curriculumList.add(curriculumToBeUpdated); + var curriculumUpdated = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MIN.plusMonths(10), + LocalDate.MIN.plusMonths(11) + ); + + assertThatThrownBy(() -> curriculumOverlapVerification.checkingUpdateCurriculum(curriculumList,curriculumUpdated,curriculumToBeUpdated.getId())) + .isInstanceOf(TimeOverlayException.class); + } + + //Uma lista com dois currículos: um com apenas data de início definida, outro com ambas datas definidas; Atualização do currículo com apenas data inicial, atualizando a data de início; com sobreposição + @Test + @DisplayName("Lista não vazia com um curículo com apenas data de início definida, Atualização de currículo, Apenas data de início, Sobreposição") + void checkingUpdateCurriculumUpdatingOnlyStartDateOverlay() { + var curriculum = new Curriculum(); + curriculum.setId(UUID.fromString("32c4dcbe-9769-4cc5-a1fb-2bcc9d38e12f")); + curriculum.setValidityStartDate(LocalDate.MIN); + curriculum.setValidityEndDate(LocalDate.MIN.plusMonths(12)); + var curriculumToBeUpdated = new Curriculum(); + curriculumToBeUpdated.setId(UUID.fromString("30472217-b2eb-43dd-9d0c-1a2c536bb56d")); + curriculumToBeUpdated.setValidityStartDate(LocalDate.MIN.plusMonths(12).plusDays(1)); + var curriculumList = new ArrayList(); + curriculumList.add(curriculum); + curriculumList.add(curriculumToBeUpdated); + var curriculumUpdated = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MIN.plusMonths(12), + null + ); + + assertThatThrownBy(() -> curriculumOverlapVerification.checkingUpdateCurriculum(curriculumList,curriculumUpdated,curriculumToBeUpdated.getId())) + .isInstanceOf(TimeOverlayException.class); + } + + //Uma lista com dois currículos: um com apenas data de início definida, outro com ambas datas definidas; Atualização do currículo com ambas as datas, Datas coincidentes com sobreposição + @Test + @DisplayName("Lista não vazia com um curículo com apenas data de início definida, Atualização de currículo, Datas de início e fim definidas, Datas coincidentes, Sobreposição") + void checkingUpdateCurriculumUpdatingSameDatesOverlay() { + var curriculum = new Curriculum(); + curriculum.setId(UUID.fromString("32c4dcbe-9769-4cc5-a1fb-2bcc9d38e12f")); + curriculum.setValidityStartDate(LocalDate.MAX.minusDays(1)); + var curriculumToBeUpdated = new Curriculum(); + curriculumToBeUpdated.setId(UUID.fromString("30472217-b2eb-43dd-9d0c-1a2c536bb56d")); + curriculumToBeUpdated.setValidityStartDate(LocalDate.MIN); + curriculumToBeUpdated.setValidityEndDate(LocalDate.MIN.plusMonths(12)); + var curriculumList = new ArrayList(); + curriculumList.add(curriculum); + curriculumList.add(curriculumToBeUpdated); + var curriculumUpdated = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MIN.plusMonths(10), + LocalDate.MAX.minusDays(1) + ); + + assertThatThrownBy(() -> curriculumOverlapVerification.checkingUpdateCurriculum(curriculumList,curriculumUpdated,curriculumToBeUpdated.getId())) + .isInstanceOf(TimeOverlayException.class); + } + + //Uma lista com dois currículos: um com apenas data de início definida, outro com ambas datas definidas; Atualização do currículo com apenas data inicial, definindo ambas as datas alguma coincidente; com sobreposição + @Test + @DisplayName("Lista não vazia com um curículo com apenas data de início definida, Atualização de currículo, Definindo ambas as datas, Datas coincidentes Sobreposição") + void checkingUpdateCurriculumUpdatingOnlyStartDateToBothSameDateOverlay() { + var curriculum = new Curriculum(); + curriculum.setId(UUID.fromString("32c4dcbe-9769-4cc5-a1fb-2bcc9d38e12f")); + curriculum.setValidityStartDate(LocalDate.MIN); + curriculum.setValidityEndDate(LocalDate.MIN.plusMonths(12)); + var curriculumToBeUpdated = new Curriculum(); + curriculumToBeUpdated.setId(UUID.fromString("30472217-b2eb-43dd-9d0c-1a2c536bb56d")); + curriculumToBeUpdated.setValidityStartDate(LocalDate.MIN.plusMonths(12).plusDays(1)); + curriculumToBeUpdated.setValidityEndDate(LocalDate.MAX); + var curriculumList = new ArrayList(); + curriculumList.add(curriculum); + curriculumList.add(curriculumToBeUpdated); + var curriculumUpdated = new CurriculumCreateDto( + null, + null, + null, + null, + null, + LocalDate.MIN.plusMonths(12), + LocalDate.MAX + ); + + assertThatThrownBy(() -> curriculumOverlapVerification.checkingUpdateCurriculum(curriculumList,curriculumUpdated,curriculumToBeUpdated.getId())) + .isInstanceOf(TimeOverlayException.class); + } +} \ No newline at end of file