Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public AlertListResponse getMyAlerts(Long userId){
.orElseThrow(()-> LinkuException.of(ResponseCode.USER_NOT_FOUND));

// 1) 구독 정보 조회
List<Subscribe> subscribes = subscribeRepository.findByUser_UserId(userId);
List<Subscribe> subscribes = subscribeRepository.findByUser_UserIdOrderByDepartmentConfig_IdAsc(userId);

// 2) 구독한 departmentConfigId 리스트 뽑기
List<Long> departmentConfigIds = subscribes.stream()
Expand All @@ -69,7 +69,7 @@ public AlertListResponse getMyAlertsWithDepartments(Long userId, List<String> de
.orElseThrow(() -> LinkuException.of(ResponseCode.USER_NOT_FOUND));

// 1) 내 구독 DepartmentConfig ID들
List<Long> subscribedIds = subscribeRepository.findByUser_UserId(userId).stream()
List<Long> subscribedIds = subscribeRepository.findByUser_UserIdOrderByDepartmentConfig_IdAsc(userId).stream()
.map(s -> s.getDepartmentConfig().getId())
.toList();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -28,7 +29,7 @@ public class DepartmentConfigService {

@Transactional(readOnly = true)
public DepartmentConfigListResponse getAllDepartmentConfigs() {
List<DepartmentConfig> departmentConfigList = departmentConfigRepository.findAll();
List<DepartmentConfig> departmentConfigList = departmentConfigRepository.findAll(Sort.by(Sort.Direction.ASC, "id"));

List<DepartmentConfigResponse> list = departmentConfigList.stream()
.map(department -> DepartmentConfigResponse.of(department.getId(), department.getName()))
Expand All @@ -41,7 +42,7 @@ public DepartmentConfigListResponse getAllMyDepartmentConfigs(Long userId) {
User user = userRepository.findById(userId)
.orElseThrow(()-> LinkuException.of(ResponseCode.USER_NOT_FOUND));

List<Subscribe> subscribeList = subscribeRepository.findByUser_UserId(userId);
List<Subscribe> subscribeList = subscribeRepository.findByUser_UserIdOrderByDepartmentConfig_IdAsc(userId);

List<DepartmentConfigResponse> list = subscribeList.stream()
.map(subscribe -> DepartmentConfigResponse.of(subscribe.getDepartmentConfig().getId(), subscribe.getDepartmentConfig().getName()))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import java.util.List;

public interface SubscribeRepository extends JpaRepository<Subscribe, Long> {
List<Subscribe> findByUser_UserId(Long userId);
List<Subscribe> findByUser_UserIdOrderByDepartmentConfig_IdAsc(Long userId);
void deleteByUser_UserIdAndDepartmentConfig_Id(Long userId, Long departmentConfigId);
boolean existsByUser_UserIdAndDepartmentConfig_Id(Long userId, Long configId);
}
Original file line number Diff line number Diff line change
@@ -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.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_UserIdOrderByDepartmentConfig_IdAsc(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_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)).findByDepartmentConfigIdIn(Collections.emptyList());
}
}
Loading
Loading