diff --git a/src/test/java/umc/kkijuk/server/unitTest/career/service/CareerSearchServiceImplTest.java b/src/test/java/umc/kkijuk/server/unitTest/career/service/CareerSearchServiceImplTest.java new file mode 100644 index 0000000..c27301f --- /dev/null +++ b/src/test/java/umc/kkijuk/server/unitTest/career/service/CareerSearchServiceImplTest.java @@ -0,0 +1,202 @@ +package umc.kkijuk.server.unitTest.career.service; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import umc.kkijuk.server.career.controller.response.*; +import umc.kkijuk.server.career.domain.*; +import umc.kkijuk.server.career.repository.*; +import umc.kkijuk.server.detail.domain.BaseCareerDetail; +import umc.kkijuk.server.detail.domain.CareerType; +import umc.kkijuk.server.detail.repository.CareerDetailRepository; +import umc.kkijuk.server.member.domain.Member; +import umc.kkijuk.server.tag.domain.Tag; +import umc.kkijuk.server.tag.repository.TagRepository; + +import java.lang.reflect.Field; +import java.time.LocalDate; +import java.util.*; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +public class CareerSearchServiceImplTest { + + @InjectMocks + private umc.kkijuk.server.career.service.CareerSearchServiceImpl careerSearchService; + + @Mock private ActivityRepository activityRepository; + @Mock private CircleRepository circleRepository; + @Mock private CompetitionRepository competitionRepository; + @Mock private EduCareerRepository eduCareerRepository; + @Mock private ProjectRepository projectRepository; + @Mock private EmploymentRepository employmentRepository; + @Mock private CareerEtcRepository etcRepository; + @Mock private CareerDetailRepository detailRepository; + @Mock private TagRepository tagRepository; + + private final Long memberId = 1L; + private final Member member = Member.builder().id(memberId).build(); + + @Test + @DisplayName("[CareerSearch] 타임라인용 커리어 전체 조회 시 날짜 기준으로 정렬된 리스트가 반환되어야 한다.") + void findCareerForTimeline_shouldReturnSortedTimelineResponses() { + Activity activity = Activity.builder() + .memberId(memberId).name("Activity").endDate(LocalDate.of(2024, 5, 1)).build(); + setId(activity, 1L); + + Competition competition = Competition.builder() + .memberId(memberId).name("Competition").enddate(LocalDate.of(2023, 6, 15)).build(); + setId(competition, 2L); + + when(activityRepository.findByMemberId(memberId)).thenReturn(List.of(activity)); + when(competitionRepository.findByMemberId(memberId)).thenReturn(List.of(competition)); + when(circleRepository.findByMemberId(memberId)).thenReturn(Collections.emptyList()); + when(eduCareerRepository.findByMemberId(memberId)).thenReturn(Collections.emptyList()); + when(projectRepository.findByMemberId(memberId)).thenReturn(Collections.emptyList()); + when(employmentRepository.findByMemberId(memberId)).thenReturn(Collections.emptyList()); + when(etcRepository.findByMemberId(memberId)).thenReturn(Collections.emptyList()); + + List result = careerSearchService.findCareerForTimeline(member); + + assertEquals(2, result.size()); + assertEquals("Activity", result.get(0).getTitle()); + } + + @Test + @DisplayName("[CareerSearch] 카테고리별 커리어 목록을 조회하면 분류된 Map이 반환되어야 한다.") + void findAllCareerGroupedCategory_shouldReturnGroupedMap() { + Activity activity = Activity.builder() + .memberId(memberId).name("Act").startDate(LocalDate.of(2023, 1, 1)).build(); + setId(activity, 1L); + + when(activityRepository.findByMemberId(memberId)).thenReturn(List.of(activity)); + when(circleRepository.findByMemberId(memberId)).thenReturn(Collections.emptyList()); + when(competitionRepository.findByMemberId(memberId)).thenReturn(Collections.emptyList()); + when(eduCareerRepository.findByMemberId(memberId)).thenReturn(Collections.emptyList()); + when(projectRepository.findByMemberId(memberId)).thenReturn(Collections.emptyList()); + when(employmentRepository.findByMemberId(memberId)).thenReturn(Collections.emptyList()); + when(etcRepository.findByMemberId(memberId)).thenReturn(Collections.emptyList()); + + Map> result = careerSearchService.findAllCareerGroupedCategory(memberId); + + assertEquals(7, result.size()); + assertTrue(result.containsKey("대외활동")); + assertEquals(1, result.get("대외활동").size()); + } + + @Test + @DisplayName("[CareerSearch] 연도별 커리어 조회 시 시작년도 기준으로 그룹핑되어야 한다.") + void findAllCareerGroupedYear_shouldGroupByStartYear() { + Project project = Project.builder() + .memberId(memberId).name("Project").startdate(LocalDate.of(2023, 2, 1)).build(); + setId(project, 1L); + + when(projectRepository.findByMemberId(memberId)).thenReturn(List.of(project)); + when(competitionRepository.findByMemberId(memberId)).thenReturn(Collections.emptyList()); + when(activityRepository.findByMemberId(memberId)).thenReturn(Collections.emptyList()); + when(circleRepository.findByMemberId(memberId)).thenReturn(Collections.emptyList()); + when(eduCareerRepository.findByMemberId(memberId)).thenReturn(Collections.emptyList()); + when(employmentRepository.findByMemberId(memberId)).thenReturn(Collections.emptyList()); + when(etcRepository.findByMemberId(memberId)).thenReturn(Collections.emptyList()); + + Map> result = careerSearchService.findAllCareerGroupedYear(memberId); + + assertTrue(result.containsKey("2023")); + assertEquals(1, result.get("2023").size()); + } + + @Test + @DisplayName("[CareerSearch] 전체 커리어 목록 조회 시 종료일 기준 내림차순 정렬되어야 한다.") + void findAllCareer_shouldReturnSortedList() { + Project project = Project.builder() + .memberId(memberId).name("Project").enddate(LocalDate.of(2024, 3, 15)).build(); + setId(project, 1L); + + when(projectRepository.findByMemberId(memberId)).thenReturn(List.of(project)); + when(detailRepository.findByCareerIdAndCareerType(eq(CareerType.PROJECT), eq(1L))).thenReturn(Collections.emptyList()); + when(competitionRepository.findByMemberId(memberId)).thenReturn(Collections.emptyList()); + when(activityRepository.findByMemberId(memberId)).thenReturn(Collections.emptyList()); + when(circleRepository.findByMemberId(memberId)).thenReturn(Collections.emptyList()); + when(eduCareerRepository.findByMemberId(memberId)).thenReturn(Collections.emptyList()); + when(employmentRepository.findByMemberId(memberId)).thenReturn(Collections.emptyList()); + when(etcRepository.findByMemberId(memberId)).thenReturn(Collections.emptyList()); + + List result = careerSearchService.findAllCareer(memberId); + + assertEquals(1, result.size()); + ProjectResponse response = (ProjectResponse) result.get(0); + assertEquals("Project", response.getName()); + } + + @Test + @DisplayName("[CareerSearch] 활동 상세 조회 시 본인 소유 Activity가 존재하면 반환되어야 한다.") + void findCareer_shouldReturnActivityResponse() { + Long careerId = 10L; + Activity activity = Activity.builder() + .memberId(memberId).name("활동").build(); + setId(activity, careerId); + + when(activityRepository.findById(careerId)).thenReturn(Optional.of(activity)); + when(detailRepository.findByCareerIdAndCareerType(eq(CareerType.ACTIVITY), eq(careerId))).thenReturn(Collections.emptyList()); + + BaseCareerResponse response = careerSearchService.findCareer(member, careerId, "activity"); + + assertTrue(response instanceof ActivityResponse); + ActivityResponse activityResponse = (ActivityResponse) response; + assertEquals("활동", activityResponse.getName()); + } + + @Test + @DisplayName("[CareerSearch] 키워드로 태그 검색 시 태그 목록과 연결된 상세 개수가 반환되어야 한다.") + void findAllTag_shouldReturnTagsAndDetailCount() { + Tag tag = Tag.builder().id(1L).memberId(memberId).name("keyword").build(); + BaseCareerDetail detail = mock(BaseCareerDetail.class); + + when(tagRepository.findByKeywordAndMemberId("keyword", memberId)).thenReturn(List.of(tag)); + when(detailRepository.findByTag(tag.getId())).thenReturn(List.of(detail)); + + FindTagResponse.SearchTagResponse result = careerSearchService.findAllTag(member, "keyword"); + + assertEquals(1, result.getTagList().size()); + assertEquals(1, result.getDetailCount()); + } + + @Test + @DisplayName("[CareerSearch] 커리어 키워드 검색 시 이름에 키워드가 포함된 커리어가 정렬되어 반환되어야 한다.") + void findCareerWithKeyword_shouldReturnFilteredList() { + Activity act = Activity.builder() + .memberId(memberId).name("검색활동").startDate(LocalDate.of(2023, 3, 1)).build(); + setId(act, 1L); + + when(activityRepository.findByMemberIdAndNameContaining(eq(memberId), anyString())).thenReturn(List.of(act)); + when(competitionRepository.findByMemberIdAndNameContaining(eq(memberId), anyString())).thenReturn(Collections.emptyList()); + when(circleRepository.findByMemberIdAndNameContaining(eq(memberId), anyString())).thenReturn(Collections.emptyList()); + when(eduCareerRepository.findByMemberIdAndNameContaining(eq(memberId), anyString())).thenReturn(Collections.emptyList()); + when(projectRepository.findByMemberIdAndNameContaining(eq(memberId), anyString())).thenReturn(Collections.emptyList()); + when(employmentRepository.findByMemberIdAndNameContaining(eq(memberId), anyString())).thenReturn(Collections.emptyList()); + when(etcRepository.findByMemberIdAndNameContaining(eq(memberId), anyString())).thenReturn(Collections.emptyList()); + + List result = careerSearchService.findCareerWithKeyword(member, "검색", "new"); + + assertEquals(1, result.size()); + assertEquals("검색활동", result.get(0).getCareerTitle()); + } + + + private void setId(Object entity, Long id) { + try { + Field field = entity.getClass().getDeclaredField("id"); + field.setAccessible(true); + field.set(entity, id); + } catch (Exception e) { + throw new RuntimeException("ID 주입 실패", e); + } + } +} + diff --git a/src/test/java/umc/kkijuk/server/unitTest/career/service/CareerServiceImplTest.java b/src/test/java/umc/kkijuk/server/unitTest/career/service/CareerServiceImplTest.java new file mode 100644 index 0000000..da7ddd1 --- /dev/null +++ b/src/test/java/umc/kkijuk/server/unitTest/career/service/CareerServiceImplTest.java @@ -0,0 +1,380 @@ +package umc.kkijuk.server.unitTest.career.service; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import umc.kkijuk.server.career.controller.response.*; +import umc.kkijuk.server.career.domain.*; +import umc.kkijuk.server.career.dto.*; +import umc.kkijuk.server.career.repository.*; +import umc.kkijuk.server.career.service.CareerServiceImpl; +import umc.kkijuk.server.common.service.RecordUpdateManager; +import umc.kkijuk.server.member.domain.Member; +import umc.kkijuk.server.record.domain.Record; +import umc.kkijuk.server.record.repository.RecordRepository; + +import java.lang.reflect.Field; +import java.time.LocalDate; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + + + +@ExtendWith(MockitoExtension.class) +class CareerServiceImplTest { + + @InjectMocks + private CareerServiceImpl careerService; + + @Mock + private ActivityRepository activityRepository; + + @Mock + private CircleRepository circleRepository; + + @Mock + private CompetitionRepository competitionRepository; + + @Mock + private EduCareerRepository eduCareerRepository; + + @Mock + private EmploymentRepository employmentRepository; + + @Mock + private ProjectRepository projectRepository; + + @Mock + private CareerEtcRepository etcRepository; + + @Mock + private RecordRepository recordRepository; + + @Mock + private RecordUpdateManager recordUpdateManager; + + @Test + @DisplayName("[CreateCareer] Activity를 생성하면 활동이 저장되고 Record의 타임스탬프가 갱신되어야 한다.") + void createActivity_shouldSaveActivityAndUpdateRecord() { + Member member = Member.builder().id(1L).build(); + ActivityReqDto reqDto = ActivityReqDto.builder() + .name("동아리 활동").unknown(false) + .enddate(LocalDate.of(2023, 12, 31)).build(); + Record mockRecord = Record.builder().memberId(member.getId()).build(); + + when(recordRepository.findByMemberId(member.getId())).thenReturn(mockRecord); + when(activityRepository.save(any(Activity.class))).thenAnswer(invocation -> invocation.getArgument(0)); + + ActivityResponse response = careerService.createActivity(member, reqDto); + + assertNotNull(response); + assertEquals("동아리 활동", response.getName()); + verify(activityRepository).save(any(Activity.class)); + verify(recordUpdateManager).updateRecordTimestamp(mockRecord); + } + + @Test + @DisplayName("[CreateCareer] Circle을 생성하면 저장되고 Record의 타임스탬프가 갱신되어야 한다.") + void createCircle_shouldSaveCircleAndUpdateRecord() { + Member member = Member.builder().id(1L).build(); + CircleReqDto reqDto = CircleReqDto.builder() + .name("소모임").unknown(false) + .enddate(LocalDate.of(2023, 10, 10)).build(); + Record mockRecord = Record.builder().memberId(member.getId()).build(); + + when(recordRepository.findByMemberId(member.getId())).thenReturn(mockRecord); + when(circleRepository.save(any(Circle.class))).thenAnswer(invocation -> invocation.getArgument(0)); + + CircleResponse response = careerService.createCircle(member, reqDto); + + assertNotNull(response); + assertEquals("소모임", response.getName()); + verify(circleRepository).save(any(Circle.class)); + verify(recordUpdateManager).updateRecordTimestamp(mockRecord); + } + + @Test + @DisplayName("[CreateCareer] Competition을 생성하면 저장되고 Record의 타임스탬프가 갱신되어야 한다.") + void createCompetition_shouldSaveCompetitionAndUpdateRecord() { + Member member = Member.builder().id(1L).build(); + CompetitionReqDto reqDto = CompetitionReqDto.builder() + .name("공모전").unknown(false) + .enddate(LocalDate.of(2024, 1, 1)).build(); + Record mockRecord = Record.builder().memberId(member.getId()).build(); + + when(recordRepository.findByMemberId(member.getId())).thenReturn(mockRecord); + when(competitionRepository.save(any(Competition.class))).thenAnswer(invocation -> invocation.getArgument(0)); + + CompetitionResponse response = careerService.createCompetition(member, reqDto); + + assertNotNull(response); + assertEquals("공모전", response.getName()); + verify(competitionRepository).save(any(Competition.class)); + verify(recordUpdateManager).updateRecordTimestamp(mockRecord); + } + + @Test + @DisplayName("[CreateCareer] EduCareer를 생성하면 저장되고 Record의 타임스탬프가 갱신되어야 한다.") + void createEduCareer_shouldSaveEduCareerAndUpdateRecord() { + Member member = Member.builder().id(1L).build(); + EduCareerReqDto reqDto = EduCareerReqDto.builder() + .name("교육 이력") + .unknown(false) + .enddate(LocalDate.of(2022, 5, 15)) + .time(120) + .build(); + + Record mockRecord = Record.builder().memberId(member.getId()).build(); + + when(recordRepository.findByMemberId(member.getId())).thenReturn(mockRecord); + when(eduCareerRepository.save(any(EduCareer.class))).thenAnswer(invocation -> invocation.getArgument(0)); + + EduCareerResponse response = careerService.crateEduCareer(member, reqDto); + + assertNotNull(response); + assertEquals("교육 이력", response.getName()); + verify(eduCareerRepository).save(any(EduCareer.class)); + verify(recordUpdateManager).updateRecordTimestamp(mockRecord); + } + + @Test + @DisplayName("[CreateCareer] Employment를 생성하면 저장되고 Record의 타임스탬프가 갱신되어야 한다.") + void createEmployment_shouldSaveEmploymentAndUpdateRecord() { + Member member = Member.builder().id(1L).build(); + EmploymentReqDto reqDto = EmploymentReqDto.builder() + .name("직장").unknown(false) + .enddate(LocalDate.of(2021, 8, 1)).build(); + Record mockRecord = Record.builder().memberId(member.getId()).build(); + + when(recordRepository.findByMemberId(member.getId())).thenReturn(mockRecord); + when(employmentRepository.save(any(Employment.class))).thenAnswer(invocation -> invocation.getArgument(0)); + + EmploymentResponse response = careerService.createEmployment(member, reqDto); + + assertNotNull(response); + assertEquals("직장", response.getName()); + verify(employmentRepository).save(any(Employment.class)); + verify(recordUpdateManager).updateRecordTimestamp(mockRecord); + } + + @Test + @DisplayName("[CreateCareer] Project를 생성하면 저장되고 Record의 타임스탬프가 갱신되어야 한다.") + void createProject_shouldSaveProjectAndUpdateRecord() { + Member member = Member.builder().id(1L).build(); + ProjectReqDto reqDto = ProjectReqDto.builder() + .name("사이드 프로젝트").unknown(false) + .enddate(LocalDate.of(2024, 12, 1)).build(); + Record mockRecord = Record.builder().memberId(member.getId()).build(); + + when(recordRepository.findByMemberId(member.getId())).thenReturn(mockRecord); + when(projectRepository.save(any(Project.class))).thenAnswer(invocation -> invocation.getArgument(0)); + + ProjectResponse response = careerService.createProject(member, reqDto); + + assertNotNull(response); + assertEquals("사이드 프로젝트", response.getName()); + verify(projectRepository).save(any(Project.class)); + verify(recordUpdateManager).updateRecordTimestamp(mockRecord); + } + + @Test + @DisplayName("[CreateCareer] Etc를 생성하면 저장되고 Record의 타임스탬프가 갱신되어야 한다.") + void createEtc_shouldSaveEtcAndUpdateRecord() { + Member member = Member.builder().id(1L).build(); + EtcReqDto reqDto = EtcReqDto.builder() + .name("기타 활동").unknown(false) + .enddate(LocalDate.of(2020, 2, 2)).build(); + Record mockRecord = Record.builder().memberId(member.getId()).build(); + + when(recordRepository.findByMemberId(member.getId())).thenReturn(mockRecord); + when(etcRepository.save(any(CareerEtc.class))).thenAnswer(invocation -> invocation.getArgument(0)); + + EtcResponse response = careerService.createEtc(member, reqDto); + + assertNotNull(response); + assertEquals("기타 활동", response.getName()); + verify(etcRepository).save(any(CareerEtc.class)); + verify(recordUpdateManager).updateRecordTimestamp(mockRecord); + } + + @Test + @DisplayName("[DeleteCareer] Activity를 삭제하면 Repository에서 제거되고 Record의 타임스탬프가 갱신되어야 한다.") + void deleteActivity_shouldRemoveActivityAndUpdateRecord() { + // given + Long memberId = 1L; + Long activityId = 100L; + + Member member = Member.builder().id(memberId).build(); + Activity activity = Activity.builder().memberId(memberId).build(); + setId(activity, activityId); + Record mockRecord = Record.builder().memberId(memberId).build(); + + when(activityRepository.findById(activityId)).thenReturn(Optional.of(activity)); + when(recordRepository.findByMemberId(memberId)).thenReturn(mockRecord); + + // when + careerService.deleteActivity(member, activityId); + + // then + verify(activityRepository).delete(activity); + verify(recordUpdateManager).updateRecordTimestamp(mockRecord); + } + + @Test + @DisplayName("[DeleteCareer] Circle을 삭제하면 Repository에서 제거되고 Record의 타임스탬프가 갱신되어야 한다.") + void deleteCircle_shouldRemoveCircleAndUpdateRecord() { + // given + Long memberId = 1L; + Long circleId = 101L; + + Member member = Member.builder().id(memberId).build(); + Circle circle = Circle.builder().memberId(memberId).build(); + setId(circle, circleId); + Record record = Record.builder().memberId(memberId).build(); + + when(circleRepository.findById(circleId)).thenReturn(Optional.of(circle)); + when(recordRepository.findByMemberId(memberId)).thenReturn(record); + + // when + careerService.deleteCircle(member, circleId); + + // then + verify(circleRepository).delete(circle); + verify(recordUpdateManager).updateRecordTimestamp(record); + } + + @Test + @DisplayName("[DeleteCareer] Competition을 삭제하면 Repository에서 제거되고 Record의 타임스탬프가 갱신되어야 한다.") + void deleteCompetition_shouldRemoveCompetitionAndUpdateRecord() { + // given + Long memberId = 1L; + Long compId = 102L; + + Member member = Member.builder().id(memberId).build(); + Competition competition = Competition.builder().memberId(memberId).build(); + setId(competition, compId); + Record record = Record.builder().memberId(memberId).build(); + + when(competitionRepository.findById(compId)).thenReturn(Optional.of(competition)); + when(recordRepository.findByMemberId(memberId)).thenReturn(record); + + // when + careerService.deleteComp(member, compId); + + // then + verify(competitionRepository).delete(competition); + verify(recordUpdateManager).updateRecordTimestamp(record); + } + + @Test + @DisplayName("[DeleteCareer] EduCareer를 삭제하면 Repository에서 제거되고 Record의 타임스탬프가 갱신되어야 한다.") + void deleteEduCareer_shouldRemoveEduCareerAndUpdateRecord() { + // given + Long memberId = 1L; + Long eduId = 103L; + + Member member = Member.builder().id(memberId).build(); + EduCareer edu = EduCareer.builder().memberId(memberId).build(); + setId(edu, eduId); + Record record = Record.builder().memberId(memberId).build(); + + when(eduCareerRepository.findById(eduId)).thenReturn(Optional.of(edu)); + when(recordRepository.findByMemberId(memberId)).thenReturn(record); + + // when + careerService.deleteEdu(member, eduId); + + // then + verify(eduCareerRepository).delete(edu); + verify(recordUpdateManager).updateRecordTimestamp(record); + } + + @Test + @DisplayName("[DeleteCareer] Employment를 삭제하면 Repository에서 제거되고 Record의 타임스탬프가 갱신되어야 한다.") + void deleteEmployment_shouldRemoveEmploymentAndUpdateRecord() { + // given + Long memberId = 1L; + Long empId = 104L; + + Member member = Member.builder().id(memberId).build(); + Employment emp = Employment.builder().memberId(memberId).build(); + setId(emp, empId); + Record record = Record.builder().memberId(memberId).build(); + + when(employmentRepository.findById(empId)).thenReturn(Optional.of(emp)); + when(recordRepository.findByMemberId(memberId)).thenReturn(record); + + // when + careerService.deleteEmp(member, empId); + + // then + verify(employmentRepository).delete(emp); + verify(recordUpdateManager).updateRecordTimestamp(record); + } + + @Test + @DisplayName("[DeleteCareer] Project를 삭제하면 Repository에서 제거되고 Record의 타임스탬프가 갱신되어야 한다.") + void deleteProject_shouldRemoveProjectAndUpdateRecord() { + // given + Long memberId = 1L; + Long projectId = 105L; + + Member member = Member.builder().id(memberId).build(); + Project project = Project.builder().memberId(memberId).build(); + setId(project, projectId); + Record record = Record.builder().memberId(memberId).build(); + + when(projectRepository.findById(projectId)).thenReturn(Optional.of(project)); + when(recordRepository.findByMemberId(memberId)).thenReturn(record); + + // when + careerService.deleteProject(member, projectId); + + // then + verify(projectRepository).delete(project); + verify(recordUpdateManager).updateRecordTimestamp(record); + } + + @Test + @DisplayName("[DeleteCareer] Etc를 삭제하면 Repository에서 제거되고 Record의 타임스탬프가 갱신되어야 한다.") + void deleteEtc_shouldRemoveEtcAndUpdateRecord() { + // given + Long memberId = 1L; + Long etcId = 106L; + + Member member = Member.builder().id(memberId).build(); + CareerEtc etc = CareerEtc.builder().memberId(memberId).build(); + setId(etc, etcId); + Record record = Record.builder().memberId(memberId).build(); + + when(etcRepository.findById(etcId)).thenReturn(Optional.of(etc)); + when(recordRepository.findByMemberId(memberId)).thenReturn(record); + + // when + careerService.deleteEtc(member, etcId); + + // then + verify(etcRepository).delete(etc); + verify(recordUpdateManager).updateRecordTimestamp(record); + } + + private void setId(Object entity, Long id) { + try { + Field field = entity.getClass().getDeclaredField("id"); + field.setAccessible(true); + field.set(entity, id); + } catch (Exception e) { + throw new RuntimeException("ID 주입 실패", e); + } + } + + +} + diff --git a/src/test/java/umc/kkijuk/server/unitTest/career/service/CareerServiceTest.java b/src/test/java/umc/kkijuk/server/unitTest/career/service/CareerServiceTest.java deleted file mode 100644 index 27f5645..0000000 --- a/src/test/java/umc/kkijuk/server/unitTest/career/service/CareerServiceTest.java +++ /dev/null @@ -1,138 +0,0 @@ -//package umc.kkijuk.server.unitTest.career.service; -// -//import org.junit.jupiter.api.BeforeEach; -//import org.junit.jupiter.api.DisplayName; -//import org.junit.jupiter.api.Test; -//import umc.kkijuk.server.career.controller.response.ActivityResponse; -//import umc.kkijuk.server.career.domain.Activity; -//import umc.kkijuk.server.career.dto.ActivityReqDto; -//import umc.kkijuk.server.career.repository.ActivityRepository; -//import umc.kkijuk.server.career.service.CareerService; -//import umc.kkijuk.server.career.service.CareerServiceImpl; -//import umc.kkijuk.server.member.domain.Member; -//import umc.kkijuk.server.member.domain.State; -//import umc.kkijuk.server.record.repository.RecordRepository; -//import umc.kkijuk.server.unitTest.mock.FakeActivityRepository; -// -//import java.time.LocalDate; -// -//import static org.assertj.core.api.Assertions.assertThat; -//import static org.junit.jupiter.api.Assertions.assertAll; -// -//public class CareerServiceTest { -// private CareerService careerService; -// private final Long testMemberId = 3333L; -// private Member requestMember; -// -// //test Data -// private final LocalDate testStartDate = LocalDate.of(2023, 7, 19); -// private final LocalDate testEndDate = LocalDate.of(2023, 12, 19); -// -// @BeforeEach -// void init() { -// this.requestMember = Member.builder() -// .id(testMemberId) -// .email("test-email@test.com") -// .name("test-name") -// .phoneNumber("test-test-test") -// .birthDate(LocalDate.of(2024, 7, 25)) -// .userState(State.ACTIVATE) -// .build(); -// -// ActivityRepository activityRepository = new FakeActivityRepository(); -// -// -// this.careerService = CareerServiceImpl.builder() -// .activityRepository(activityRepository) -// .build(); -// -// Activity activity1 = Activity.builder() -// .memberId(testMemberId) -// .name("test activity") -// .alias("test alias") -// .unknown(false) -// .startDate(testStartDate) -// .endDate(testEndDate) -// .organizer("test organizer") -// .role("test role") -// .teamSize(10) -// .contribution(30) -// .isTeam(true) -// .build(); -// -// Activity activity2 = Activity.builder() -// .memberId(testMemberId) -// .name("test activity") -// .alias("test alias") -// .unknown(false) -// .startDate(testStartDate) -// .endDate(testEndDate) -// .organizer("test organizer") -// .role("test role") -// .teamSize(10) -// .contribution(30) -// .isTeam(true) -// .build(); -// -// activityRepository.save(activity1); -// activityRepository.save(activity2); -// } -// @Test -// @DisplayName("[create] 새로운 Activity 만들기 - 정상 요청") -// void testCreateActivity() { -// //given -// ActivityReqDto activityReqDto = ActivityReqDto.builder() -// .name("대외활동") -// .alias("연합동아리") -// .startdate(LocalDate.of(2023,5,1)) -// .enddate(LocalDate.of(2023,12,12)) -// .isTeam(true) -// .unknown(false) -// .role("백엔드") -// .contribution(30) -// .organizer("컴공선배") -// .teamSize(10) -// .build(); -// //when -// ActivityResponse response = careerService.createActivity(requestMember,activityReqDto); -// //then -// assertAll( -// () -> assertThat(response.getId()).isEqualTo(3L), -// () -> assertThat(response.getName()).isEqualTo("대외활동"), -// () -> assertThat(response.getAlias()).isEqualTo("연합동아리"), -// () -> assertThat(response.getStartDate()).isEqualTo(LocalDate.of(2023,5,1)), -// () -> assertThat(response.getEndDate()).isEqualTo(LocalDate.of(2023,12,12)), -// () -> assertThat(response.getIsTeam()).isEqualTo(true), -// () -> assertThat(response.getUnknown()).isEqualTo(false), -// () -> assertThat(response.getRole()).isEqualTo("백엔드"), -// () -> assertThat(response.getContribution()).isEqualTo(30), -// () -> assertThat(response.getOrganizer()).isEqualTo("컴공선배"), -// () -> assertThat(response.getTeamSize()).isEqualTo(10) -// -// ); -// } -// @Test -// @DisplayName("[create] 새로운 Activity 만들기 - null 허용 필드에 null 값 요청, endDate 값 null일 경우 현재 날짜로 설정") -// void testCreateActivity_InvalidFields(){ -// //given -// ActivityReqDto activityReqDto = ActivityReqDto.builder() -// .name("대외활동") -// .alias("연합동아리") -// .startdate(LocalDate.of(2023, 5, 1)) -// .isTeam(true) -// .unknown(true) -// .contribution(30) -// .organizer("컴공선배") -// .teamSize(10) -// .build(); -// //when -// ActivityResponse response = careerService.createActivity(requestMember,activityReqDto); -// -// //then -// assertAll( -// () -> assertThat(response).isNotNull(), -// () -> assertThat(response.getRole()).isNull(), -// () -> assertThat(response.getEndDate()).isEqualTo(LocalDate.now()) -// ); -// } -//}