diff --git a/src/main/java/com/linku/backend/domain/alert/service/AlertService.java b/src/main/java/com/linku/backend/domain/alert/service/AlertService.java index 2109326..cdc8546 100644 --- a/src/main/java/com/linku/backend/domain/alert/service/AlertService.java +++ b/src/main/java/com/linku/backend/domain/alert/service/AlertService.java @@ -47,7 +47,7 @@ public AlertListResponse getMyAlerts(Long userId){ .orElseThrow(()-> LinkuException.of(ResponseCode.USER_NOT_FOUND)); // 1) 구독 정보 조회 - List subscribes = subscribeRepository.findByUser_UserId(userId); + List subscribes = subscribeRepository.findByUser_UserIdOrderByDepartmentConfig_IdAsc(userId); // 2) 구독한 departmentConfigId 리스트 뽑기 List departmentConfigIds = subscribes.stream() @@ -69,7 +69,7 @@ public AlertListResponse getMyAlertsWithDepartments(Long userId, List de .orElseThrow(() -> LinkuException.of(ResponseCode.USER_NOT_FOUND)); // 1) 내 구독 DepartmentConfig ID들 - List subscribedIds = subscribeRepository.findByUser_UserId(userId).stream() + List subscribedIds = subscribeRepository.findByUser_UserIdOrderByDepartmentConfig_IdAsc(userId).stream() .map(s -> s.getDepartmentConfig().getId()) .toList(); diff --git a/src/main/java/com/linku/backend/domain/deapartmentConfig/service/DepartmentConfigService.java b/src/main/java/com/linku/backend/domain/deapartmentConfig/service/DepartmentConfigService.java index 7ccfca3..96af004 100644 --- a/src/main/java/com/linku/backend/domain/deapartmentConfig/service/DepartmentConfigService.java +++ b/src/main/java/com/linku/backend/domain/deapartmentConfig/service/DepartmentConfigService.java @@ -12,6 +12,7 @@ import com.linku.backend.global.response.ResponseCode; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -28,7 +29,7 @@ public class DepartmentConfigService { @Transactional(readOnly = true) public DepartmentConfigListResponse getAllDepartmentConfigs() { - List departmentConfigList = departmentConfigRepository.findAll(); + List departmentConfigList = departmentConfigRepository.findAll(Sort.by(Sort.Direction.ASC, "id")); List list = departmentConfigList.stream() .map(department -> DepartmentConfigResponse.of(department.getId(), department.getName())) @@ -41,7 +42,7 @@ public DepartmentConfigListResponse getAllMyDepartmentConfigs(Long userId) { User user = userRepository.findById(userId) .orElseThrow(()-> LinkuException.of(ResponseCode.USER_NOT_FOUND)); - List subscribeList = subscribeRepository.findByUser_UserId(userId); + List subscribeList = subscribeRepository.findByUser_UserIdOrderByDepartmentConfig_IdAsc(userId); List list = subscribeList.stream() .map(subscribe -> DepartmentConfigResponse.of(subscribe.getDepartmentConfig().getId(), subscribe.getDepartmentConfig().getName())) diff --git a/src/main/java/com/linku/backend/domain/subscribe/repository/SubscribeRepository.java b/src/main/java/com/linku/backend/domain/subscribe/repository/SubscribeRepository.java index a1c7796..d146b51 100644 --- a/src/main/java/com/linku/backend/domain/subscribe/repository/SubscribeRepository.java +++ b/src/main/java/com/linku/backend/domain/subscribe/repository/SubscribeRepository.java @@ -6,7 +6,7 @@ import java.util.List; public interface SubscribeRepository extends JpaRepository { - List findByUser_UserId(Long userId); + List findByUser_UserIdOrderByDepartmentConfig_IdAsc(Long userId); void deleteByUser_UserIdAndDepartmentConfig_Id(Long userId, Long departmentConfigId); boolean existsByUser_UserIdAndDepartmentConfig_Id(Long userId, Long configId); } diff --git a/src/main/java/com/linku/backend/global/resolver/CurrentUserIdArgumentResolver.java b/src/main/java/com/linku/backend/global/resolver/CurrentUserIdArgumentResolver.java index f3d923d..24316ea 100644 --- a/src/main/java/com/linku/backend/global/resolver/CurrentUserIdArgumentResolver.java +++ b/src/main/java/com/linku/backend/global/resolver/CurrentUserIdArgumentResolver.java @@ -1,13 +1,18 @@ package com.linku.backend.global.resolver; import com.linku.backend.global.auth.AuthUser; +import com.linku.backend.global.exception.LinkuException; import org.springframework.core.MethodParameter; +import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; +import com.linku.backend.global.response.ResponseCode; + +import java.nio.file.attribute.UserPrincipal; @Component public class CurrentUserIdArgumentResolver implements HandlerMethodArgumentResolver { @@ -23,7 +28,13 @@ public Object resolveArgument(MethodParameter parameter, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { - AuthUser principal = (AuthUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication == null || !authentication.isAuthenticated()) { + throw LinkuException.of(ResponseCode.GOOGLE_INVALID_USER_INFO_RESPONSE); + } + + AuthUser principal = (AuthUser) authentication.getPrincipal(); return principal.getId(); } } diff --git a/src/test/java/com/linku/backend/domain/alert/service/AlertServiceTest.java b/src/test/java/com/linku/backend/domain/alert/service/AlertServiceTest.java index 84015dd..1e588ec 100644 --- a/src/test/java/com/linku/backend/domain/alert/service/AlertServiceTest.java +++ b/src/test/java/com/linku/backend/domain/alert/service/AlertServiceTest.java @@ -1,167 +1,167 @@ -//package com.linku.backend.domain.alert.service; -// -//import com.linku.backend.domain.alert.Alert; -//import com.linku.backend.domain.alert.dto.response.AlertListResponse; -//import com.linku.backend.domain.alert.dto.response.AlertResponse; -//import com.linku.backend.domain.alert.repository.AlertRepository; -//import com.linku.backend.domain.deapartmentConfig.DepartmentConfig; -//import com.linku.backend.domain.deapartmentConfig.repository.DepartmentConfigRepository; -//import com.linku.backend.domain.subscribe.Subscribe; -//import com.linku.backend.domain.subscribe.repository.SubscribeRepository; -//import com.linku.backend.domain.user.User; -//import com.linku.backend.domain.user.repository.UserRepository; -//import com.linku.backend.global.exception.LinkuException; -//import org.junit.jupiter.api.BeforeEach; -//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 java.util.Collections; -//import java.util.List; -//import java.util.Optional; -// -//import static org.assertj.core.api.Assertions.assertThat; -//import static org.junit.jupiter.api.Assertions.assertThrows; -//import static org.mockito.ArgumentMatchers.any; -//import static org.mockito.Mockito.*; -// -//@ExtendWith(MockitoExtension.class) -//@DisplayName("AlertService 테스트") -//class AlertServiceTest { -// -// @InjectMocks -// private AlertService alertService; -// -// @Mock -// private AlertRepository alertRepository; -// @Mock -// private DepartmentConfigRepository departmentConfigRepository; -// @Mock -// private SubscribeRepository subscribeRepository; -// @Mock -// private UserRepository userRepository; -// -// private User user; -// private DepartmentConfig departmentConfig; -// private Alert alert; -// private Subscribe subscribe; -// -// @BeforeEach -// void setUp() { -// user = User.builder().userId(1L).build(); -// departmentConfig = DepartmentConfig.builder().id(1L).name("학사").isRss(true).build(); -// alert = Alert.builder().id(1L).url("https://example.com/alert/1").departmentConfig(departmentConfig).build(); -// subscribe = Subscribe.builder().user(user).departmentConfig(departmentConfig).build(); -// } -// -// @Test -// @DisplayName("새 알림인지 확인 - 신규 알림일 경우") -// void isNew_whenNewAlert_returnsTrue() { -// // given -// when(alertRepository.existsByUrl(any(String.class))).thenReturn(false); -// -// // when -// boolean isNew = alertService.isNew(alert); -// -// // then -// assertThat(isNew).isTrue(); -// verify(alertRepository).existsByUrl(alert.getUrl()); -// } -// -// @Test -// @DisplayName("새 알림인지 확인 - 기존 알림일 경우") -// void isNew_whenExistingAlert_returnsFalse() { -// // given -// when(alertRepository.existsByUrl(any(String.class))).thenReturn(true); -// -// // when -// boolean isNew = alertService.isNew(alert); -// -// // then -// assertThat(isNew).isFalse(); -// verify(alertRepository).existsByUrl(alert.getUrl()); -// } -// -// @Test -// @DisplayName("알림을 학과와 함께 저장 성공") -// void saveWithDept_savesAlertSuccessfully() { -// // given -// when(departmentConfigRepository.findById(any(Long.class))).thenReturn(Optional.of(departmentConfig)); -// when(alertRepository.save(any(Alert.class))).thenReturn(alert); -// -// // when -// Alert savedAlert = alertService.saveWithDept(alert, 1L); -// -// // then -// assertThat(savedAlert).isNotNull(); -// assertThat(savedAlert.getDepartmentConfig()).isEqualTo(departmentConfig); -// verify(departmentConfigRepository).findById(1L); -// verify(alertRepository).save(alert); -// } -// -// @Test -// @DisplayName("알림 저장 실패 - 학과를 찾을 수 없을 경우") -// void saveWithDept_throwsException_whenDeptNotFound() { -// // given -// when(departmentConfigRepository.findById(any(Long.class))).thenReturn(Optional.empty()); -// -// // when & then -// assertThrows(LinkuException.class, () -> alertService.saveWithDept(alert, 1L)); -// verify(departmentConfigRepository).findById(1L); -// verify(alertRepository, never()).save(any(Alert.class)); -// } -// -// @Test -// @DisplayName("내 알림 가져오기 성공") -// void getMyAlerts_returnsAlertsSuccessfully() { -// // given -// when(userRepository.findById(any(Long.class))).thenReturn(Optional.of(user)); -// when(subscribeRepository.findByUser_UserId(any(Long.class))).thenReturn(List.of(subscribe)); -// when(alertRepository.findByDepartmentConfigIdIn(anyList())).thenReturn(List.of(alert)); -// -// // when -// AlertListResponse response = alertService.getMyAlerts(1L); -// -// // then -// assertThat(response.getAlertResponseList()).hasSize(1); -// AlertResponse alertResponse = response.getAlertResponseList().get(0); -// assertThat(alertResponse.getUrl()).isEqualTo(alert.getUrl()); -// -// verify(userRepository).findById(1L); -// verify(subscribeRepository).findByUser_UserId(1L); -// verify(alertRepository).findByDepartmentConfigIdIn(List.of(1L)); -// } -// -// @Test -// @DisplayName("내 알림 가져오기 실패 - 사용자를 찾을 수 없을 경우") -// void getMyAlerts_throwsException_whenUserNotFound() { -// // given -// when(userRepository.findById(any(Long.class))).thenReturn(Optional.empty()); -// -// // when & then -// assertThrows(LinkuException.class, () -> alertService.getMyAlerts(1L)); -// verify(userRepository).findById(1L); -// verify(subscribeRepository, never()).findByUser_UserId(any(Long.class)); -// } -// -// @Test -// @DisplayName("내 알림 가져오기 - 구독한 학과가 없을 경우 빈 리스트 반환") -// void getMyAlerts_returnsEmptyList_whenNoSubscriptions() { -// // given -// when(userRepository.findById(any(Long.class))).thenReturn(Optional.of(user)); -// when(subscribeRepository.findByUser_UserId(any(Long.class))).thenReturn(Collections.emptyList()); -// -// // when -// AlertListResponse response = alertService.getMyAlerts(1L); -// -// // then -// assertThat(response.getAlertResponseList()).isEmpty(); -// -// verify(userRepository).findById(1L); -// verify(subscribeRepository).findByUser_UserId(1L); -// verify(alertRepository, times(1)).findByDepartmentConfigIdIn(Collections.emptyList()); -// } -//} +package com.linku.backend.domain.alert.service; + +import com.linku.backend.domain.alert.Alert; +import com.linku.backend.domain.alert.dto.response.AlertListResponse; +import com.linku.backend.domain.alert.dto.response.AlertResponse; +import com.linku.backend.domain.alert.repository.AlertRepository; +import com.linku.backend.domain.deapartmentConfig.DepartmentConfig; +import com.linku.backend.domain.deapartmentConfig.repository.DepartmentConfigRepository; +import com.linku.backend.domain.subscribe.Subscribe; +import com.linku.backend.domain.subscribe.repository.SubscribeRepository; +import com.linku.backend.domain.user.User; +import com.linku.backend.domain.user.repository.UserRepository; +import com.linku.backend.global.exception.LinkuException; +import org.junit.jupiter.api.BeforeEach; +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 java.util.Collections; +import java.util.List; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +@DisplayName("AlertService 테스트") +class AlertServiceTest { + + @InjectMocks + private AlertService alertService; + + @Mock + private AlertRepository alertRepository; + @Mock + private DepartmentConfigRepository departmentConfigRepository; + @Mock + private SubscribeRepository subscribeRepository; + @Mock + private UserRepository userRepository; + + private User user; + private DepartmentConfig departmentConfig; + private Alert alert; + private Subscribe subscribe; + + @BeforeEach + void setUp() { + user = User.builder().userId(1L).build(); + departmentConfig = DepartmentConfig.builder().id(1L).name("학사").isRss(true).build(); + alert = Alert.builder().id(1L).url("https://example.com/alert/1").departmentConfig(departmentConfig).build(); + subscribe = Subscribe.builder().user(user).departmentConfig(departmentConfig).build(); + } + + @Test + @DisplayName("새 알림인지 확인 - 신규 알림일 경우") + void isNew_whenNewAlert_returnsTrue() { + // given + when(alertRepository.existsByUrl(any(String.class))).thenReturn(false); + + // when + boolean isNew = alertService.isNew(alert); + + // then + assertThat(isNew).isTrue(); + verify(alertRepository).existsByUrl(alert.getUrl()); + } + + @Test + @DisplayName("새 알림인지 확인 - 기존 알림일 경우") + void isNew_whenExistingAlert_returnsFalse() { + // given + when(alertRepository.existsByUrl(any(String.class))).thenReturn(true); + + // when + boolean isNew = alertService.isNew(alert); + + // then + assertThat(isNew).isFalse(); + verify(alertRepository).existsByUrl(alert.getUrl()); + } + + @Test + @DisplayName("알림을 학과와 함께 저장 성공") + void saveWithDept_savesAlertSuccessfully() { + // given + when(departmentConfigRepository.findById(any(Long.class))).thenReturn(Optional.of(departmentConfig)); + when(alertRepository.save(any(Alert.class))).thenReturn(alert); + + // when + Alert savedAlert = alertService.saveWithDept(alert, 1L); + + // then + assertThat(savedAlert).isNotNull(); + assertThat(savedAlert.getDepartmentConfig()).isEqualTo(departmentConfig); + verify(departmentConfigRepository).findById(1L); + verify(alertRepository).save(alert); + } + + @Test + @DisplayName("알림 저장 실패 - 학과를 찾을 수 없을 경우") + void saveWithDept_throwsException_whenDeptNotFound() { + // given + when(departmentConfigRepository.findById(any(Long.class))).thenReturn(Optional.empty()); + + // when & then + assertThrows(LinkuException.class, () -> alertService.saveWithDept(alert, 1L)); + verify(departmentConfigRepository).findById(1L); + verify(alertRepository, never()).save(any(Alert.class)); + } + + @Test + @DisplayName("내 알림 가져오기 성공") + void getMyAlerts_returnsAlertsSuccessfully() { + // given + when(userRepository.findById(any(Long.class))).thenReturn(Optional.of(user)); + when(subscribeRepository.findByUser_UserIdOrderByDepartmentConfig_IdAsc(any(Long.class))).thenReturn(List.of(subscribe)); + when(alertRepository.findByDepartmentConfigIdInOrderByPostTimeDesc(anyList())).thenReturn(List.of(alert)); + + // when + AlertListResponse response = alertService.getMyAlerts(1L); + + // then + assertThat(response.getAlertResponseList()).hasSize(1); + AlertResponse alertResponse = response.getAlertResponseList().get(0); + assertThat(alertResponse.getUrl()).isEqualTo(alert.getUrl()); + + verify(userRepository).findById(1L); + verify(subscribeRepository).findByUser_UserIdOrderByDepartmentConfig_IdAsc(1L); + verify(alertRepository).findByDepartmentConfigIdInOrderByPostTimeDesc(List.of(1L)); + } + + @Test + @DisplayName("내 알림 가져오기 실패 - 사용자를 찾을 수 없을 경우") + void getMyAlerts_throwsException_whenUserNotFound() { + // given + when(userRepository.findById(any(Long.class))).thenReturn(Optional.empty()); + + // when & then + assertThrows(LinkuException.class, () -> alertService.getMyAlerts(1L)); + verify(userRepository).findById(1L); + verify(subscribeRepository, never()).findByUser_UserIdOrderByDepartmentConfig_IdAsc(any(Long.class)); + } + + @Test + @DisplayName("내 알림 가져오기 - 구독한 학과가 없을 경우 빈 리스트 반환") + void getMyAlerts_returnsEmptyList_whenNoSubscriptions() { + // given + when(userRepository.findById(any(Long.class))).thenReturn(Optional.of(user)); + when(subscribeRepository.findByUser_UserIdOrderByDepartmentConfig_IdAsc(any(Long.class))).thenReturn(Collections.emptyList()); + + // when + AlertListResponse response = alertService.getMyAlerts(1L); + + // then + assertThat(response.getAlertResponseList()).isEmpty(); + + verify(userRepository).findById(1L); + verify(subscribeRepository).findByUser_UserIdOrderByDepartmentConfig_IdAsc(1L); + verify(alertRepository, times(1)).findByDepartmentConfigIdInOrderByPostTimeDesc(Collections.emptyList()); + } +} diff --git a/src/test/java/com/linku/backend/domain/departmentConfig/service/DepartmentConfigServiceTest.java b/src/test/java/com/linku/backend/domain/departmentConfig/service/DepartmentConfigServiceTest.java index c73493c..576ad08 100644 --- a/src/test/java/com/linku/backend/domain/departmentConfig/service/DepartmentConfigServiceTest.java +++ b/src/test/java/com/linku/backend/domain/departmentConfig/service/DepartmentConfigServiceTest.java @@ -1,132 +1,138 @@ -//package com.linku.backend.domain.departmentConfig.service; -// -//import com.linku.backend.domain.deapartmentConfig.DepartmentConfig; -//import com.linku.backend.domain.deapartmentConfig.dto.response.DepartmentConfigListResponse; -//import com.linku.backend.domain.deapartmentConfig.repository.DepartmentConfigRepository; -//import com.linku.backend.domain.deapartmentConfig.service.DepartmentConfigService; -//import com.linku.backend.domain.subscribe.Subscribe; -//import com.linku.backend.domain.subscribe.repository.SubscribeRepository; -//import com.linku.backend.domain.user.User; -//import com.linku.backend.domain.user.repository.UserRepository; -//import com.linku.backend.global.exception.LinkuException; -//import org.junit.jupiter.api.BeforeEach; -//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 java.util.List; -//import java.util.Optional; -// -//import static org.assertj.core.api.Assertions.assertThat; -//import static org.junit.jupiter.api.Assertions.assertThrows; -//import static org.mockito.ArgumentMatchers.any; -//import static org.mockito.Mockito.*; -// -//@ExtendWith(MockitoExtension.class) -//@DisplayName("DepartmentConfigService 테스트") -//class DepartmentConfigServiceTest { -// -// @InjectMocks -// private DepartmentConfigService departmentConfigService; -// -// @Mock -// private DepartmentConfigRepository departmentConfigRepository; -// @Mock -// private SubscribeRepository subscribeRepository; -// @Mock -// private UserRepository userRepository; -// -// private User user; -// private DepartmentConfig departmentConfig; -// private Subscribe subscribe; -// -// @BeforeEach -// void setUp() { -// user = User.builder().userId(1L).build(); -// departmentConfig = DepartmentConfig.builder().id(1L).name("학사").build(); -// subscribe = Subscribe.builder().user(user).departmentConfig(departmentConfig).build(); -// } -// -// @Test -// @DisplayName("모든 학과 설정 조회 성공") -// void getAllDepartmentConfigs_returnsAllConfigsSuccessfully() { -// // given -// when(departmentConfigRepository.findAll()).thenReturn(List.of(departmentConfig)); -// -// // when -// DepartmentConfigListResponse response = departmentConfigService.getAllDepartmentConfigs(); -// -// // then -// assertThat(response.getDepartmentConfigList()).hasSize(1); -// assertThat(response.getDepartmentConfigList().get(0).getDepartmentConfigName()).isEqualTo("학사"); -// verify(departmentConfigRepository).findAll(); -// } -// -// @Test -// @DisplayName("구독한 학과 목록 조회 성공") -// void getAllMyDepartmentConfigs_returnsSubscribedConfigsSuccessfully() { -// // given -// when(userRepository.findById(any(Long.class))).thenReturn(Optional.of(user)); -// when(subscribeRepository.findByUser_UserId(any(Long.class))).thenReturn(List.of(subscribe)); -// -// // when -// DepartmentConfigListResponse response = departmentConfigService.getAllMyDepartmentConfigs(1L); -// -// // then -// assertThat(response.getDepartmentConfigList()).hasSize(1); -// assertThat(response.getDepartmentConfigList().get(0).getDepartmentConfigName()).isEqualTo("학사"); -// verify(userRepository).findById(1L); -// verify(subscribeRepository).findByUser_UserId(1L); -// } -// -// @Test -// @DisplayName("구독한 학과 목록 조회 실패 - 사용자를 찾을 수 없을 경우") -// void getAllMyDepartmentConfigs_throwsException_whenUserNotFound() { -// // given -// when(userRepository.findById(any(Long.class))).thenReturn(Optional.empty()); -// -// // when & then -// assertThrows(LinkuException.class, () -> departmentConfigService.getAllMyDepartmentConfigs(1L)); -// verify(userRepository).findById(1L); -// } -// -// @Test -// @DisplayName("학과 구독 성공") -// void subscribeDepartment_savesSubscriptionSuccessfully() { -// // given -// // 각각 Optional.of()를 반환하도록 설정하고, subscribeRepository.save()가 subscribe 객체를 반환하도록 준비. -// when(userRepository.findById(any(Long.class))).thenReturn(Optional.of(user)); -// when(departmentConfigRepository.findById(any(Long.class))).thenReturn(Optional.of(departmentConfig)); -// when(subscribeRepository.save(any(Subscribe.class))).thenReturn(subscribe); -// -// // when -// // subscribeDepartment() 메서드 실행. -// departmentConfigService.subscribeDepartment(1L, 1L); -// -// // then -// // 메서드가 모두 예상대로 한 번씩 호출되었는지 검증. -// verify(userRepository).findById(1L); -// verify(departmentConfigRepository).findById(1L); -// verify(subscribeRepository).save(any(Subscribe.class)); -// } -// -// @Test -// @DisplayName("구독 삭제 성공") -// void deleteSubscription_deletesSubscriptionSuccessfully() { -// // given -// when(userRepository.findById(any(Long.class))).thenReturn(Optional.of(user)); -// when(departmentConfigRepository.findById(any(Long.class))).thenReturn(Optional.of(departmentConfig)); -// doNothing().when(subscribeRepository).deleteByUser_UserIdAndDepartmentConfig_Id(any(Long.class), any(Long.class)); -// -// // when -// departmentConfigService.deleteSubscription(1L, 1L); -// -// // then -// verify(userRepository).findById(1L); -// verify(departmentConfigRepository).findById(1L); -// verify(subscribeRepository).deleteByUser_UserIdAndDepartmentConfig_Id(1L, 1L); -// } -//} +package com.linku.backend.domain.departmentConfig.service; + +import com.linku.backend.domain.deapartmentConfig.DepartmentConfig; +import com.linku.backend.domain.deapartmentConfig.dto.response.DepartmentConfigListResponse; +import com.linku.backend.domain.deapartmentConfig.repository.DepartmentConfigRepository; +import com.linku.backend.domain.deapartmentConfig.service.DepartmentConfigService; +import com.linku.backend.domain.subscribe.Subscribe; +import com.linku.backend.domain.subscribe.repository.SubscribeRepository; +import com.linku.backend.domain.user.User; +import com.linku.backend.domain.user.repository.UserRepository; +import com.linku.backend.global.exception.LinkuException; +import org.junit.jupiter.api.BeforeEach; +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 org.springframework.data.domain.Sort; + +import java.util.List; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +@DisplayName("DepartmentConfigService 테스트") +class DepartmentConfigServiceTest { + + @InjectMocks + private DepartmentConfigService departmentConfigService; + + @Mock + private DepartmentConfigRepository departmentConfigRepository; + @Mock + private SubscribeRepository subscribeRepository; + @Mock + private UserRepository userRepository; + + private User user; + private DepartmentConfig departmentConfig; + private Subscribe subscribe; + + @BeforeEach + void setUp() { + user = User.builder().userId(1L).build(); + departmentConfig = DepartmentConfig.builder().id(1L).name("학사").build(); + subscribe = Subscribe.builder().user(user).departmentConfig(departmentConfig).build(); + } + + @Test + @DisplayName("모든 학과 설정 조회 성공") + void getAllDepartmentConfigs_returnsAllConfigsSuccessfully() { + // given + Sort sort = Sort.by(Sort.Direction.ASC, "id"); + + when(departmentConfigRepository.findAll(sort)) + .thenReturn(List.of(departmentConfig)); + + // when + DepartmentConfigListResponse response = departmentConfigService.getAllDepartmentConfigs(); + + // then + assertThat(response.getDepartmentConfigList()).hasSize(1); // <- 이 부분은 너 로직에 맞게 값 맞춰야 함 + assertThat(response.getDepartmentConfigList().get(0).getDepartmentConfigName()) + .isEqualTo("학사"); + + verify(departmentConfigRepository).findAll(sort); + } + + @Test + @DisplayName("구독한 학과 목록 조회 성공") + void getAllMyDepartmentConfigs_returnsSubscribedConfigsSuccessfully() { + // given + when(userRepository.findById(any(Long.class))).thenReturn(Optional.of(user)); + when(subscribeRepository.findByUser_UserIdOrderByDepartmentConfig_IdAsc(any(Long.class))).thenReturn(List.of(subscribe)); + + // when + DepartmentConfigListResponse response = departmentConfigService.getAllMyDepartmentConfigs(1L); + + // then + assertThat(response.getDepartmentConfigList()).hasSize(1); + assertThat(response.getDepartmentConfigList().get(0).getDepartmentConfigName()).isEqualTo("학사"); + verify(userRepository).findById(1L); + verify(subscribeRepository).findByUser_UserIdOrderByDepartmentConfig_IdAsc(1L); + } + + @Test + @DisplayName("구독한 학과 목록 조회 실패 - 사용자를 찾을 수 없을 경우") + void getAllMyDepartmentConfigs_throwsException_whenUserNotFound() { + // given + when(userRepository.findById(any(Long.class))).thenReturn(Optional.empty()); + + // when & then + assertThrows(LinkuException.class, () -> departmentConfigService.getAllMyDepartmentConfigs(1L)); + verify(userRepository).findById(1L); + } + + @Test + @DisplayName("학과 구독 성공") + void subscribeDepartment_savesSubscriptionSuccessfully() { + // given + // 각각 Optional.of()를 반환하도록 설정하고, subscribeRepository.save()가 subscribe 객체를 반환하도록 준비. + when(userRepository.findById(any(Long.class))).thenReturn(Optional.of(user)); + when(departmentConfigRepository.findById(any(Long.class))).thenReturn(Optional.of(departmentConfig)); + when(subscribeRepository.save(any(Subscribe.class))).thenReturn(subscribe); + + // when + // subscribeDepartment() 메서드 실행. + departmentConfigService.subscribeDepartment(1L, 1L); + + // then + // 메서드가 모두 예상대로 한 번씩 호출되었는지 검증. + verify(userRepository).findById(1L); + verify(departmentConfigRepository).findById(1L); + verify(subscribeRepository).save(any(Subscribe.class)); + } + + @Test + @DisplayName("구독 삭제 성공") + void deleteSubscription_deletesSubscriptionSuccessfully() { + // given + when(userRepository.findById(any(Long.class))).thenReturn(Optional.of(user)); + when(departmentConfigRepository.findById(any(Long.class))).thenReturn(Optional.of(departmentConfig)); + doNothing().when(subscribeRepository).deleteByUser_UserIdAndDepartmentConfig_Id(any(Long.class), any(Long.class)); + + // when + departmentConfigService.deleteSubscription(1L, 1L); + + // then + verify(userRepository).findById(1L); + verify(departmentConfigRepository).findById(1L); + verify(subscribeRepository).deleteByUser_UserIdAndDepartmentConfig_Id(1L, 1L); + } +}