From 780abe94508c7704cd0ed74cd003809339506f0f Mon Sep 17 00:00:00 2001 From: constantine0621 Date: Fri, 19 Jun 2026 15:08:20 +0300 Subject: [PATCH 1/6] Bug: fixed edit logic for Major entity --- src/main/java/org/unilab/uniplan/major/MajorMapper.java | 1 + src/main/java/org/unilab/uniplan/major/MajorService.java | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/unilab/uniplan/major/MajorMapper.java b/src/main/java/org/unilab/uniplan/major/MajorMapper.java index 782457ac..8db777d8 100644 --- a/src/main/java/org/unilab/uniplan/major/MajorMapper.java +++ b/src/main/java/org/unilab/uniplan/major/MajorMapper.java @@ -23,6 +23,7 @@ public interface MajorMapper { @Mapping(source = "faculty.id", target = "facultyId") MajorCoursesDto toFullDto(Major major); + @Mapping(target = "id", ignore = true) @Mapping(source = "facultyId", target = "faculty.id") void updateEntityFromDto(MajorDto majorDto, @MappingTarget Major major); diff --git a/src/main/java/org/unilab/uniplan/major/MajorService.java b/src/main/java/org/unilab/uniplan/major/MajorService.java index 0933024b..74b76190 100644 --- a/src/main/java/org/unilab/uniplan/major/MajorService.java +++ b/src/main/java/org/unilab/uniplan/major/MajorService.java @@ -1,5 +1,7 @@ package org.unilab.uniplan.major; +import org.unilab.uniplan.faculty.Faculty; +import org.unilab.uniplan.faculty.FacultyRepository; import org.unilab.uniplan.major.dto.MajorCoursesDto; import static org.unilab.uniplan.utils.ErrorConstants.MAJOR_NOT_FOUND; @@ -18,6 +20,7 @@ public class MajorService { private final MajorRepository majorRepository; private final MajorMapper majorMapper; + private final FacultyRepository facultyRepository; @Transactional public MajorDto createMajor(final MajorDto majorDTO) { @@ -77,7 +80,10 @@ public void deleteMajor(final UUID id) { private MajorDto updateEntityAndConvertToDto(final MajorDto dto, final Major entity) { - majorMapper.updateEntityFromDto(dto, entity); + Faculty faculty = facultyRepository.findById(dto.facultyId()) + .orElseThrow(() -> new ResourceNotFoundException("Faculty not found")); + entity.setFaculty(faculty); + entity.setMajorName(dto.majorName()); return saveEntityAndConvertToDto(entity); } From 72f98b0ca8d4f20c494c802c0d506f79161ffb4e Mon Sep 17 00:00:00 2001 From: constantine0621 Date: Fri, 19 Jun 2026 15:29:47 +0300 Subject: [PATCH 2/6] Fixed MajorServiceTest and removed unneeded method --- .../java/org/unilab/uniplan/major/MajorMapper.java | 5 ----- .../org/unilab/uniplan/major/MajorServiceTest.java | 11 +++++++++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/unilab/uniplan/major/MajorMapper.java b/src/main/java/org/unilab/uniplan/major/MajorMapper.java index 8db777d8..5dfcfdfd 100644 --- a/src/main/java/org/unilab/uniplan/major/MajorMapper.java +++ b/src/main/java/org/unilab/uniplan/major/MajorMapper.java @@ -3,7 +3,6 @@ import java.util.List; import org.mapstruct.Mapper; import org.mapstruct.Mapping; -import org.mapstruct.MappingTarget; import org.unilab.uniplan.course.CourseMapper; import org.unilab.uniplan.major.dto.MajorCoursesDto; import org.unilab.uniplan.major.dto.MajorCoursesResponseDto; @@ -23,10 +22,6 @@ public interface MajorMapper { @Mapping(source = "faculty.id", target = "facultyId") MajorCoursesDto toFullDto(Major major); - @Mapping(target = "id", ignore = true) - @Mapping(source = "facultyId", target = "faculty.id") - void updateEntityFromDto(MajorDto majorDto, @MappingTarget Major major); - @Mapping(target = "id", ignore = true) MajorDto toInnerDto(MajorRequestDto requestDto); diff --git a/src/test/java/org/unilab/uniplan/major/MajorServiceTest.java b/src/test/java/org/unilab/uniplan/major/MajorServiceTest.java index 6430ee97..f697988f 100644 --- a/src/test/java/org/unilab/uniplan/major/MajorServiceTest.java +++ b/src/test/java/org/unilab/uniplan/major/MajorServiceTest.java @@ -6,7 +6,6 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.any; -import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -20,6 +19,8 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.unilab.uniplan.exception.ResourceNotFoundException; +import org.unilab.uniplan.faculty.Faculty; +import org.unilab.uniplan.faculty.FacultyRepository; import org.unilab.uniplan.major.dto.MajorCoursesDto; import org.unilab.uniplan.major.dto.MajorDto; @@ -32,12 +33,16 @@ class MajorServiceTest { @Mock private MajorRepository majorRepository; + @Mock + FacultyRepository facultyRepository; + @Mock private MajorMapper majorMapper; private MajorCoursesDto majorCoursesDto; private MajorDto majorDTO; private Major major; + private Faculty faculty; private UUID majorId; private UUID facultyId; @@ -48,6 +53,8 @@ void setUp() { majorCoursesDto = new MajorCoursesDto(majorId, facultyId, "Informatics", List.of()); majorDTO = new MajorDto(majorId, facultyId, "Informatics"); major = new Major(); + faculty = new Faculty(); + faculty.setId(facultyId); } @Test @@ -166,7 +173,7 @@ void findAllShouldReturnListOfMajorDTOs() { @Test void updateMajorShouldReturnUpdatedMajorDTOIfFound() { when(majorRepository.findById(majorId)).thenReturn(Optional.of(major)); - doNothing().when(majorMapper).updateEntityFromDto(majorDTO, major); + when(facultyRepository.findById(majorDTO.facultyId())).thenReturn(Optional.of(faculty)); when(majorRepository.save(major)).thenReturn(major); when(majorMapper.toDto(major)).thenReturn(majorDTO); From b3b511319ec38096ccbd3c126d4b952e67e299e8 Mon Sep 17 00:00:00 2001 From: constantine0621 Date: Mon, 22 Jun 2026 09:44:30 +0300 Subject: [PATCH 3/6] Added test for scenario faculty not found when updateMajor is called --- .../org/unilab/uniplan/major/MajorServiceTest.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/test/java/org/unilab/uniplan/major/MajorServiceTest.java b/src/test/java/org/unilab/uniplan/major/MajorServiceTest.java index f697988f..8a564dad 100644 --- a/src/test/java/org/unilab/uniplan/major/MajorServiceTest.java +++ b/src/test/java/org/unilab/uniplan/major/MajorServiceTest.java @@ -183,6 +183,16 @@ void updateMajorShouldReturnUpdatedMajorDTOIfFound() { verify(majorRepository).save(major); } + @Test + void updateMajorShouldThrowResourceNotFoundExceptionIfFacultyNotFound() { + when(majorRepository.findById(majorId)).thenReturn(Optional.of(major)); + when(facultyRepository.findById(majorDTO.facultyId())).thenReturn(Optional.empty()); + + assertThrows(ResourceNotFoundException.class, () -> majorService.updateMajor(majorId, majorDTO)); + + verify(majorRepository, never()).save(any()); + } + @Test void updateMajorShouldReturnEmptyIfNotFound() { when(majorRepository.findById(majorId)).thenReturn(Optional.empty()); From e311c04834bd0616d041561013b563b1985daf22 Mon Sep 17 00:00:00 2001 From: constantine0621 Date: Thu, 25 Jun 2026 10:30:38 +0300 Subject: [PATCH 4/6] updated pom.xml --- pom.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 8c81ad21..4792f1d6 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 3.4.2 + 4.0.0 org.unilab @@ -27,9 +27,9 @@ - 21 - 21 - 21 + 25 + 25 + 25 @@ -140,7 +140,7 @@ org.projectlombok lombok - 1.18.36 + 1.18.42 org.mapstruct @@ -175,4 +175,4 @@ - + \ No newline at end of file From 4e35c0fc9631241019da788ea41e0e0884446444 Mon Sep 17 00:00:00 2001 From: constantine0621 Date: Sun, 28 Jun 2026 19:34:17 +0300 Subject: [PATCH 5/6] fix: use service instead of repository in MajorService, adjusted tests --- .../org/unilab/uniplan/major/MajorService.java | 11 +++++++---- .../unilab/uniplan/major/MajorServiceTest.java | 18 +++++++++++++----- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/unilab/uniplan/major/MajorService.java b/src/main/java/org/unilab/uniplan/major/MajorService.java index 74b76190..d1cdc52e 100644 --- a/src/main/java/org/unilab/uniplan/major/MajorService.java +++ b/src/main/java/org/unilab/uniplan/major/MajorService.java @@ -1,7 +1,9 @@ package org.unilab.uniplan.major; import org.unilab.uniplan.faculty.Faculty; -import org.unilab.uniplan.faculty.FacultyRepository; +import org.unilab.uniplan.faculty.FacultyMapper; +import org.unilab.uniplan.faculty.FacultyService; +import org.unilab.uniplan.faculty.dto.FacultyDto; import org.unilab.uniplan.major.dto.MajorCoursesDto; import static org.unilab.uniplan.utils.ErrorConstants.MAJOR_NOT_FOUND; @@ -20,7 +22,8 @@ public class MajorService { private final MajorRepository majorRepository; private final MajorMapper majorMapper; - private final FacultyRepository facultyRepository; + private final FacultyService facultyService; + private final FacultyMapper facultyMapper; @Transactional public MajorDto createMajor(final MajorDto majorDTO) { @@ -80,8 +83,8 @@ public void deleteMajor(final UUID id) { private MajorDto updateEntityAndConvertToDto(final MajorDto dto, final Major entity) { - Faculty faculty = facultyRepository.findById(dto.facultyId()) - .orElseThrow(() -> new ResourceNotFoundException("Faculty not found")); + FacultyDto facultyDto = facultyService.getFacultyById(dto.facultyId()); + Faculty faculty = facultyMapper.toEntity(facultyDto); entity.setFaculty(faculty); entity.setMajorName(dto.majorName()); return saveEntityAndConvertToDto(entity); diff --git a/src/test/java/org/unilab/uniplan/major/MajorServiceTest.java b/src/test/java/org/unilab/uniplan/major/MajorServiceTest.java index 8a564dad..4c55f3ee 100644 --- a/src/test/java/org/unilab/uniplan/major/MajorServiceTest.java +++ b/src/test/java/org/unilab/uniplan/major/MajorServiceTest.java @@ -20,7 +20,9 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.unilab.uniplan.exception.ResourceNotFoundException; import org.unilab.uniplan.faculty.Faculty; -import org.unilab.uniplan.faculty.FacultyRepository; +import org.unilab.uniplan.faculty.FacultyMapper; +import org.unilab.uniplan.faculty.FacultyService; +import org.unilab.uniplan.faculty.dto.FacultyDto; import org.unilab.uniplan.major.dto.MajorCoursesDto; import org.unilab.uniplan.major.dto.MajorDto; @@ -31,18 +33,22 @@ class MajorServiceTest { private MajorService majorService; @Mock - private MajorRepository majorRepository; + private FacultyService facultyService; @Mock - FacultyRepository facultyRepository; + private MajorRepository majorRepository; @Mock private MajorMapper majorMapper; + @Mock + private FacultyMapper facultyMapper; + private MajorCoursesDto majorCoursesDto; private MajorDto majorDTO; private Major major; private Faculty faculty; + private FacultyDto facultyDTO; private UUID majorId; private UUID facultyId; @@ -52,6 +58,7 @@ void setUp() { facultyId = UUID.randomUUID(); majorCoursesDto = new MajorCoursesDto(majorId, facultyId, "Informatics", List.of()); majorDTO = new MajorDto(majorId, facultyId, "Informatics"); + facultyDTO = new FacultyDto(facultyId, UUID.randomUUID(), "Engineering", "Main Campus"); major = new Major(); faculty = new Faculty(); faculty.setId(facultyId); @@ -173,7 +180,8 @@ void findAllShouldReturnListOfMajorDTOs() { @Test void updateMajorShouldReturnUpdatedMajorDTOIfFound() { when(majorRepository.findById(majorId)).thenReturn(Optional.of(major)); - when(facultyRepository.findById(majorDTO.facultyId())).thenReturn(Optional.of(faculty)); + when(facultyService.getFacultyById(majorDTO.facultyId())).thenReturn(facultyDTO); + when(facultyMapper.toEntity(facultyDTO)).thenReturn(faculty); when(majorRepository.save(major)).thenReturn(major); when(majorMapper.toDto(major)).thenReturn(majorDTO); @@ -186,7 +194,7 @@ void updateMajorShouldReturnUpdatedMajorDTOIfFound() { @Test void updateMajorShouldThrowResourceNotFoundExceptionIfFacultyNotFound() { when(majorRepository.findById(majorId)).thenReturn(Optional.of(major)); - when(facultyRepository.findById(majorDTO.facultyId())).thenReturn(Optional.empty()); + when(facultyService.getFacultyById(majorDTO.facultyId())).thenThrow(ResourceNotFoundException.class); assertThrows(ResourceNotFoundException.class, () -> majorService.updateMajor(majorId, majorDTO)); From 8c07127773bb80ae400c06b3afe0b69996c00b29 Mon Sep 17 00:00:00 2001 From: constantine0621 Date: Sun, 28 Jun 2026 19:47:14 +0300 Subject: [PATCH 6/6] fix after updating branch --- .../org/unilab/uniplan/major/MajorService.java | 10 ++-------- .../unilab/uniplan/major/MajorServiceTest.java | 16 +--------------- 2 files changed, 3 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/unilab/uniplan/major/MajorService.java b/src/main/java/org/unilab/uniplan/major/MajorService.java index d1cdc52e..0f2381fe 100644 --- a/src/main/java/org/unilab/uniplan/major/MajorService.java +++ b/src/main/java/org/unilab/uniplan/major/MajorService.java @@ -1,11 +1,7 @@ package org.unilab.uniplan.major; import org.unilab.uniplan.faculty.Faculty; -import org.unilab.uniplan.faculty.FacultyMapper; -import org.unilab.uniplan.faculty.FacultyService; -import org.unilab.uniplan.faculty.dto.FacultyDto; import org.unilab.uniplan.major.dto.MajorCoursesDto; - import static org.unilab.uniplan.utils.ErrorConstants.MAJOR_NOT_FOUND; import jakarta.transaction.Transactional; @@ -22,8 +18,6 @@ public class MajorService { private final MajorRepository majorRepository; private final MajorMapper majorMapper; - private final FacultyService facultyService; - private final FacultyMapper facultyMapper; @Transactional public MajorDto createMajor(final MajorDto majorDTO) { @@ -83,8 +77,8 @@ public void deleteMajor(final UUID id) { private MajorDto updateEntityAndConvertToDto(final MajorDto dto, final Major entity) { - FacultyDto facultyDto = facultyService.getFacultyById(dto.facultyId()); - Faculty faculty = facultyMapper.toEntity(facultyDto); + Faculty faculty = new Faculty(); + faculty.setId(dto.facultyId()); entity.setFaculty(faculty); entity.setMajorName(dto.majorName()); return saveEntityAndConvertToDto(entity); diff --git a/src/test/java/org/unilab/uniplan/major/MajorServiceTest.java b/src/test/java/org/unilab/uniplan/major/MajorServiceTest.java index 4c55f3ee..a89bcf17 100644 --- a/src/test/java/org/unilab/uniplan/major/MajorServiceTest.java +++ b/src/test/java/org/unilab/uniplan/major/MajorServiceTest.java @@ -20,9 +20,6 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.unilab.uniplan.exception.ResourceNotFoundException; import org.unilab.uniplan.faculty.Faculty; -import org.unilab.uniplan.faculty.FacultyMapper; -import org.unilab.uniplan.faculty.FacultyService; -import org.unilab.uniplan.faculty.dto.FacultyDto; import org.unilab.uniplan.major.dto.MajorCoursesDto; import org.unilab.uniplan.major.dto.MajorDto; @@ -32,23 +29,16 @@ class MajorServiceTest { @InjectMocks private MajorService majorService; - @Mock - private FacultyService facultyService; - @Mock private MajorRepository majorRepository; @Mock private MajorMapper majorMapper; - @Mock - private FacultyMapper facultyMapper; - private MajorCoursesDto majorCoursesDto; private MajorDto majorDTO; private Major major; private Faculty faculty; - private FacultyDto facultyDTO; private UUID majorId; private UUID facultyId; @@ -58,7 +48,6 @@ void setUp() { facultyId = UUID.randomUUID(); majorCoursesDto = new MajorCoursesDto(majorId, facultyId, "Informatics", List.of()); majorDTO = new MajorDto(majorId, facultyId, "Informatics"); - facultyDTO = new FacultyDto(facultyId, UUID.randomUUID(), "Engineering", "Main Campus"); major = new Major(); faculty = new Faculty(); faculty.setId(facultyId); @@ -180,8 +169,6 @@ void findAllShouldReturnListOfMajorDTOs() { @Test void updateMajorShouldReturnUpdatedMajorDTOIfFound() { when(majorRepository.findById(majorId)).thenReturn(Optional.of(major)); - when(facultyService.getFacultyById(majorDTO.facultyId())).thenReturn(facultyDTO); - when(facultyMapper.toEntity(facultyDTO)).thenReturn(faculty); when(majorRepository.save(major)).thenReturn(major); when(majorMapper.toDto(major)).thenReturn(majorDTO); @@ -193,8 +180,7 @@ void updateMajorShouldReturnUpdatedMajorDTOIfFound() { @Test void updateMajorShouldThrowResourceNotFoundExceptionIfFacultyNotFound() { - when(majorRepository.findById(majorId)).thenReturn(Optional.of(major)); - when(facultyService.getFacultyById(majorDTO.facultyId())).thenThrow(ResourceNotFoundException.class); + when(majorRepository.findById(majorId)).thenReturn(Optional.empty()); assertThrows(ResourceNotFoundException.class, () -> majorService.updateMajor(majorId, majorDTO));